import tkinter as tk
from tkinter import colorchooser, messagebox

# ========================
# 主题配置（只放安全参数）
# ========================
themes = {
    "🌸 樱花粉": {"bg": "#FFE4E9", "fg": "#D81B60", "btn": "#F8BBD0", "btn_fg": "#FFFFFF"},
    "💙 天空蓝": {"bg": "#E3F2FD", "fg": "#1565C0", "btn": "#90CAF9", "btn_fg": "#FFFFFF"},
    "🧡 蜜桔橙": {"bg": "#FFF3E0", "fg": "#EF6C00", "btn": "#FFCC80", "btn_fg": "#FFFFFF"},
    "💚 抹茶绿": {"bg": "#E8F5E9", "fg": "#2E7D32", "btn": "#A5D6A7", "btn_fg": "#FFFFFF"},
    "💜 梦幻紫": {"bg": "#F3E5F5", "fg": "#7B1FA2", "btn": "#CE93D8", "btn_fg": "#FFFFFF"},
    "🍬 糖果色": {"bg": "#FCE4EC", "fg": "#C2185B", "btn": "#F48FB1", "btn_fg": "#FFFFFF"},
}

# ========================
# 全局变量
# ========================
current_tool = "pencil"
current_color = "#000000"
line_width = 2
draw_history = []
canvas_old_x = 0
canvas_old_y = 0

# ========================
# 换肤函数
# ✅ 只用控件已支持的参数
# ✅ Frame 只用 bg，Label/Button 才用 fg
# ========================
def apply_theme(name):
    t = themes[name]

    # 窗口和 Frame 只配 bg
    root.configure(bg=t["bg"])
    toolbar.configure(bg=t["bg"])
    status_bar.configure(bg=t["bg"])

    # Label 才配 fg
    label_title.configure(bg=t["bg"], fg=t["fg"])
    label_color_display.configure(bg=t["bg"], fg=t["fg"])
    label_width.configure(bg=t["bg"], fg=t["fg"])
    label_status.configure(bg=t["bg"], fg=t["fg"])

    # Button 配 bg + fg
    for btn in tool_buttons:
        btn.configure(bg=t["btn"], fg=t["btn_fg"])

    # 画布不变
    canvas.configure(bg="white")


# ========================
# 工具选择
# ========================
def set_tool(tool):
    global current_tool
    current_tool = tool
    label_status.configure(text=f"当前工具：{tool}")


# ========================
# 颜色选择
# ========================
def choose_color():
    global current_color
    color = colorchooser.askcolor(title="选择颜色", initialcolor=current_color)
    if color and color[1]:
        current_color = color[1]
        label_color_display.configure(text=f"🎨 {current_color}")
        label_color_display.configure(bg=current_color, fg="#FFFFFF")


# ========================
# 线条粗细
# ========================
def set_width(val):
    global line_width
    line_width = int(val)
    label_status.configure(text=f"线条粗细：{line_width} px")


# ========================
# 画布事件
# ========================
def start_draw(event):
    global canvas_old_x, canvas_old_y
    canvas_old_x = event.x
    canvas_old_y = event.y
    draw_history.append([])


def do_draw(event):
    global canvas_old_x, canvas_old_y
    x, y = event.x, event.y

    if current_tool == "pencil":
        item = canvas.create_line(
            canvas_old_x, canvas_old_y, x, y,
            fill=current_color,
            width=line_width,
            capstyle=tk.ROUND,
            smooth=True
        )
        draw_history[-1].append(item)

    elif current_tool == "eraser":
        item = canvas.create_rectangle(
            x - 8, y - 8, x + 8, y + 8,
            fill="white", outline="white"
        )
        draw_history[-1].append(item)

    canvas_old_x = x
    canvas_old_y = y


# ========================
# 撤销
# ========================
def undo():
    if draw_history:
        last_stroke = draw_history.pop()
        for item in last_stroke:
            canvas.delete(item)


# ========================
# 清空
# ========================
def clear_canvas():
    if messagebox.askyesno("确认", "要清空整个画布吗？"):
        canvas.delete("all")
        draw_history.clear()


# ========================
# 保存
# ========================
def save_canvas():
    try:
        from PIL import ImageGrab
        x = root.winfo_rootx() + canvas.winfo_x()
        y = root.winfo_rooty() + canvas.winfo_y()
        x2 = x + canvas.winfo_width()
        y2 = y + canvas.winfo_height()
        img = ImageGrab.grab(bbox=(x, y, x2, y2))
        img.save("my_drawing.png")
        messagebox.showinfo("保存成功", "已保存为 my_drawing.png 🎉")
    except ImportError:
        messagebox.showwarning("提示", "需要安装 Pillow\n运行：pip install pillow")
    except Exception as e:
        messagebox.showerror("错误", str(e))


# ========================
# 创建窗口
# ========================
root = tk.Tk()
root.title("🎨 卡通画图板")
root.geometry("900x620")
root.resizable(False, False)

# ========================
# 顶部标题
# ========================
label_title = tk.Label(
    root, text="🎨 卡通画图板 🖌️",
    font=("Comic Sans MS", 22, "bold")
)
label_title.pack(pady=8)

# ========================
# 工具栏（Frame，只有 bg）
# ========================
toolbar = tk.Frame(root)
toolbar.pack(side="top", fill="x", pady=2)

tool_buttons = []

# 工具按钮
tools = [
    ("✏️ 铅笔", "pencil"),
    ("🧽 橡皮", "eraser"),
    ("↩️ 撤销", "undo"),
    ("🗑️ 清空", "clear"),
    ("💾 保存", "save"),
]

for text, tool in tools:
    if tool in ("undo", "clear", "save"):
        cmd = lambda t=tool: undo() if t == "undo" else (clear_canvas() if t == "clear" else save_canvas())
    else:
        cmd = lambda t=tool: set_tool(t)
    btn = tk.Button(toolbar, text=text, font=("Comic Sans MS", 11), command=cmd)
    btn.pack(side="left", padx=4)
    tool_buttons.append(btn)

# 颜色按钮
btn_color = tk.Button(
    toolbar, text="🎨 选颜色",
    font=("Comic Sans MS", 11),
    command=choose_color
)
btn_color.pack(side="left", padx=6)
tool_buttons.append(btn_color)

# 颜色显示（Label，才有 fg）
label_color_display = tk.Label(
    toolbar, text="🎨 #000000",
    font=("Comic Sans MS", 10),
    width=14, bg="#000000", fg="#FFFFFF"
)
label_color_display.pack(side="left", padx=6)

# 粗细标签
label_width = tk.Label(
    toolbar, text="粗细：",
    font=("Comic Sans MS", 10)
)
label_width.pack(side="left", padx=3)

# 粗细滑块
scale_width = tk.Scale(
    toolbar, from_=1, to=20, orient="horizontal",
    font=("Comic Sans MS", 9), showvalue=False,
    command=set_width
)
scale_width.set(2)
scale_width.pack(side="left")

# 主题按钮
theme_frame = tk.Frame(toolbar)
theme_frame.pack(side="right", padx=6)

for name in themes:
    btn = tk.Button(
        theme_frame, text=name,
        font=("Comic Sans MS", 9),
        command=lambda n=name: apply_theme(n)
    )
    btn.pack(side="left", padx=2)
    tool_buttons.append(btn)

# ========================
# 画布
# ========================
canvas = tk.Canvas(
    root, bg="white",
    width=870, height=480,
    relief="solid", bd=3
)
canvas.pack(pady=8)

canvas.bind("<Button-1>", start_draw)
canvas.bind("<B1-Motion>", do_draw)

# ========================
# 状态栏（Frame + Label 分开）
# ========================
status_bar = tk.Frame(root)
status_bar.pack(side="bottom", fill="x")

label_status = tk.Label(
    status_bar, text="当前工具：pencil | 线条粗细：2 px",
    font=("Comic Sans MS", 10)
)
label_status.pack(pady=4)

# ========================
# ✅ 最后再换肤（所有控件已创建）
# ========================
apply_theme("🌸 樱花粉")
set_tool("pencil")

root.mainloop()
