import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageDraw, ImageTk
import random
import math

WEATHER_CONFIG = {
    "晴天": {"bg_color": "#87CEEB", "sun": True, "cloud": False, "rain": False, "snow": False, "lightning": False},
    "多云": {"bg_color": "#B0C4DE", "sun": True, "cloud": True, "rain": False, "snow": False, "lightning": False},
    "阴天": {"bg_color": "#A9A9A9", "sun": False, "cloud": True, "rain": False, "snow": False, "lightning": False},
    "小雨": {"bg_color": "#778899", "sun": False, "cloud": True, "rain": True, "snow": False, "lightning": False},
    "大雨": {"bg_color": "#4F4F4F", "sun": False, "cloud": True, "rain": True, "snow": False, "lightning": False},
    "雷阵雨": {"bg_color": "#2c2c34", "sun": False, "cloud": True, "rain": True, "snow": False, "lightning": True},
    "小雪": {"bg_color": "#C0C8D0", "sun": False, "cloud": True, "rain": False, "snow": True, "lightning": False},
    "大雪": {"bg_color": "#B4BCC4", "sun": False, "cloud": True, "rain": False, "snow": True, "lightning": False},
}

CANVAS_W = 600
CANVAS_H = 400

class WeatherDrawApp:
    def __init__(self, root):
        self.root = root
        self.root.title("简易天气插画生成器（含雷电）")
        self.root.geometry("650x520")

        self.selected_weather = tk.StringVar(value="晴天")
        self.img = None
        self.photo = None

        top_frame = ttk.Frame(root)
        top_frame.pack(pady=10)
        ttk.Label(top_frame, text="选择天气：").grid(row=0, column=0, padx=5)
        combo = ttk.Combobox(top_frame, textvariable=self.selected_weather, values=list(WEATHER_CONFIG.keys()), state="readonly")
        combo.grid(row=0, column=1, padx=5)
        ttk.Button(top_frame, text="生成插画", command=self.draw_weather).grid(row=0, column=2, padx=5)
        ttk.Button(top_frame, text="保存图片", command=self.save_img).grid(row=0, column=3, padx=5)

        self.canvas = tk.Canvas(root, width=CANVAS_W, height=CANVAS_H, bg="white")
        self.canvas.pack()

    def draw_sun(self, draw):
        cx, cy = 500, 80
        r = 40
        draw.ellipse((cx - r, cy - r, cx + r, cy + r), fill="#FFD700")
        for i in range(8):
            ang = math.radians(i * 45)
            x1 = cx + (r + 8)*math.cos(ang)
            y1 = cy + (r + 8)*math.sin(ang)
            x2 = cx + (r + 20)*math.cos(ang)
            y2 = cy + (r + 20)*math.sin(ang)
            draw.line((x1, y1, x2, y2), fill="#FFD700", width=3)

    def draw_cloud(self, draw, x, y):
        draw.ellipse((x, y, x+60, y+40), fill="white")
        draw.ellipse((x+30, y-15, x+90, y+25), fill="white")
        draw.ellipse((x+60, y, x+120, y+40), fill="white")

    def draw_rain(self, draw):
        for _ in range(80):
            x = random.randint(0, CANVAS_W)
            y = random.randint(0, CANVAS_H)
            draw.line((x, y, x+2, y+12), fill="#88aacc", width=2)

    def draw_snow(self, draw):
        for _ in range(100):
            x = random.randint(0, CANVAS_W)
            y = random.randint(0, CANVAS_H)
            r = random.randint(2,4)
            draw.ellipse((x-r, y-r, x+r, y+r), fill="white")

    def draw_lightning(self, draw):
        # 生成一条锯齿闪电
        start_x = random.randint(150, 450)
        start_y = random.randint(20, 80)
        points = [(start_x, start_y)]
        cur_x, cur_y = start_x, start_y
        seg_num = random.randint(4,7)
        for _ in range(seg_num):
            cur_y += random.randint(30,60)
            cur_x += random.randint(-40,40)
            points.append((cur_x, cur_y))
        draw.line(points, fill="#ffff99", width=4)
        draw.line(points, fill="#ffffff", width=1)

    def draw_weather(self):
        weather = self.selected_weather.get()
        cfg = WEATHER_CONFIG[weather]
        self.img = Image.new("RGB", (CANVAS_W, CANVAS_H), cfg["bg_color"])
        draw = ImageDraw.Draw(self.img)

        if cfg["sun"]:
            self.draw_sun(draw)
        if cfg["cloud"]:
            self.draw_cloud(draw, 80, 60)
            self.draw_cloud(draw, 220, 90)
            self.draw_cloud(draw, 380, 70)
        if cfg["rain"]:
            self.draw_rain(draw)
        if cfg["snow"]:
            self.draw_snow(draw)
        if cfg["lightning"]:
            # 随机1~2道闪电
            for _ in range(random.randint(1,2)):
                self.draw_lightning(draw)

        # 地面草地
        draw.rectangle((0, CANVAS_H-40, CANVAS_W, CANVAS_H), fill="#4a8c3f")
        for i in range(0, CANVAS_W, 18):
            draw.line((i, CANVAS_H-40, i+4, CANVAS_H-55), fill="#3a7c2f", width=2)

        self.photo = ImageTk.PhotoImage(self.img)
        self.canvas.create_image(0, 0, anchor="nw", image=self.photo)

    def save_img(self):
        if self.img is None:
            messagebox.showwarning("提示", "请先生成插画！")
            return
        self.img.save("weather_art.png")
        messagebox.showinfo("成功", "已保存为 weather_art.png")

if __name__ == "__main__":
    root = tk.Tk()
    app = WeatherDrawApp(root)
    app.draw_weather()
    root.mainloop()
