import tkinter as tk
from tkinter import colorchooser, filedialog, messagebox
from PIL import Image, ImageDraw
import os

class DrawingBoard:
    def __init__(self, root):
        self.root = root
        self.root.title("032. 画图板（简易）")
        self.root.geometry("900x600")
        self.root.resizable(False, False)

        self.pen_color = "#000000"
        self.pen_width = 3
        self.erasing = False
        self.drawing = False
        self.last_x = 0
        self.last_y = 0

        # PIL 图像（用于保存）
        self.image = Image.new("RGB", (900, 600), "white")
        self.draw = ImageDraw.Draw(self.image)

        self.build_ui()

    def build_ui(self):
        # ===== 顶部工具栏 =====
        toolbar = tk.Frame(self.root, relief=tk.RAISED, bd=1, bg="#f0f0f0")
        toolbar.pack(side=tk.TOP, fill=tk.X)

        # 颜色选择
        tk.Label(toolbar, text="颜色：", bg="#f0f0f0").pack(side=tk.LEFT, padx=5)

        # 预设颜色按钮
        colors = [
            "#000000", "#FF0000", "#00FF00", "#0000FF",
            "#FFFF00", "#FF00FF", "#00FFFF", "#FF8800",
            "#8800FF", "#008800", "#888888", "#FFFFFF"
        ]
        self.color_buttons = []
        for c in colors:
            btn = tk.Button(
                toolbar, width=2, height=1,
                bg=c, relief=tk.SUNKEN if c == "#000000" else tk.RAISED,
                command=lambda c=c: self.set_color(c)
            )
            btn.pack(side=tk.LEFT, padx=1, pady=2)
            self.color_buttons.append(btn)

        # 自定义颜色
        tk.Button(
            toolbar, text="自定义", width=6,
            command=self.choose_color
        ).pack(side=tk.LEFT, padx=5)

        # 分隔线
        tk.Label(toolbar, text=" | ", bg="#f0f0f0").pack(side=tk.LEFT)

        # 笔刷大小
        tk.Label(toolbar, text="笔刷：", bg="#f0f0f0").pack(side=tk.LEFT, padx=5)
        self.size_scale = tk.Scale(
            toolbar, from_=1, to=20, orient=tk.HORIZONTAL,
            length=100, showvalue=True,
            command=self.set_pen_size
        )
        self.size_scale.set(3)
        self.size_scale.pack(side=tk.LEFT)

        # 分隔线
        tk.Label(toolbar, text=" | ", bg="#f0f0f0").pack(side=tk.LEFT)

        # 功能按钮
        tk.Button(
            toolbar, text="橡皮擦", width=8,
            command=self.toggle_eraser
        ).pack(side=tk.LEFT, padx=3)

        tk.Button(
            toolbar, text="清空", width=8,
            bg="#FF9800", fg="white",
            command=self.clear_canvas
        ).pack(side=tk.LEFT, padx=3)

        tk.Button(
            toolbar, text="保存", width=8,
            bg="#4CAF50", fg="white",
            command=self.save_image
        ).pack(side=tk.LEFT, padx=3)

        tk.Button(
            toolbar, text="退出", width=8,
            bg="#f44336", fg="white",
            command=self.root.quit
        ).pack(side=tk.LEFT, padx=3)

        # ===== 画布区域 =====
        canvas_frame = tk.Frame(self.root, bg="#cccccc")
        canvas_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        self.canvas = tk.Canvas(
            canvas_frame, width=890, height=540,
            bg="white", relief=tk.SUNKEN, bd=2
        )
        self.canvas.pack(fill=tk.BOTH, expand=True)

        # 绑定鼠标事件
        self.canvas.bind("<Button-1>", self.start_draw)
        self.canvas.bind("<B1-Motion>", self.draw_line)
        self.canvas.bind("<ButtonRelease-1>", self.stop_draw)

        # ===== 底部状态栏 =====
        self.status = tk.Label(
            self.root, text="就绪 | 颜色：黑色 | 笔刷：3px",
            anchor=tk.W, relief=tk.SUNKEN
        )
        self.status.pack(side=tk.BOTTOM, fill=tk.X)

    def set_color(self, color):
        self.pen_color = color
        self.erasing = False
        # 更新按钮状态
        for btn in self.color_buttons:
            btn.config(relief=tk.RAISED)
        # 找到对应按钮并按下
        for btn in self.color_buttons:
            if btn['bg'] == color:
                btn.config(relief=tk.SUNKEN)
                break
        self.update_status()

    def choose_color(self):
        color = colorchooser.askcolor(title="选择颜色")
        if color[1]:
            self.set_color(color[1])

    def set_pen_size(self, val):
        self.pen_width = int(val)
        self.update_status()

    def toggle_eraser(self):
        self.erasing = not self.erasing
        if self.erasing:
            self.status.config(text="橡皮擦模式 | 点击画布开始擦除")
        else:
            self.update_status()

    def update_status(self):
        if self.erasing:
            self.status.config(text=f"橡皮擦模式 | 笔刷：{self.pen_width}px")
        else:
            self.status.config(text=f"就绪 | 颜色：{self.pen_color} | 笔刷：{self.pen_width}px")

    def start_draw(self, event):
        self.drawing = True
        self.last_x = event.x
        self.last_y = event.y

    def draw_line(self, event):
        if not self.drawing:
            return

        x, y = event.x, event.y

        if self.erasing:
            # 橡皮擦：用白色画
            fill_color = "white"
            outline_color = "white"
        else:
            fill_color = self.pen_color
            outline_color = self.pen_color

        # Tkinter 画布上画
        self.canvas.create_line(
            self.last_x, self.last_y, x, y,
            fill=fill_color, width=self.pen_width,
            capstyle=tk.ROUND, smooth=True
        )

        # PIL 图像上画（用于保存）
        if self.erasing:
            self.draw.line(
                [self.last_x, self.last_y, x, y],
                fill="white", width=self.pen_width
            )
        else:
            self.draw.line(
                [self.last_x, self.last_y, x, y],
                fill=self.pen_color, width=self.pen_width
            )

        self.last_x = x
        self.last_y = y

    def stop_draw(self, event):
        self.drawing = False

    def clear_canvas(self):
        if messagebox.askyesno("确认", "确定要清空画布吗？"):
            self.canvas.delete("all")
            self.image = Image.new("RGB", (900, 600), "white")
            self.draw = ImageDraw.Draw(self.image)
            self.status.config(text="画布已清空")

    def save_image(self):
        path = filedialog.asksaveasfilename(
            title="保存图片",
            defaultextension=".png",
            filetypes=[
                ("PNG 图片", "*.png"),
                ("JPEG 图片", "*.jpg"),
                ("所有文件", "*.*")
            ]
        )
        if not path:
            return

        try:
            # 裁剪画布区域
            img = self.image.crop((0, 0, 890, 540))
            img.save(path)
            messagebox.showinfo("成功", f"图片已保存到：\n{path}")
        except Exception as e:
            messagebox.showerror("错误", f"保存失败：{e}")


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