import tkinter as tk
from tkinter import colorchooser, filedialog, messagebox
from PIL import ImageGrab  # 需要 pillow 库，用于保存画布


class PaintApp:
    def __init__(self, root):
        self.root = root
        self.root.title("简易画图板")
        self.root.geometry("900x650")

        # 默认参数
        self.brush_color = "black"
        self.brush_size = 3
        self.eraser_mode = False
        self.last_x = None
        self.last_y = None

        self._build_ui()

    def _build_ui(self):
        # ===== 顶部工具栏 =====
        toolbar = tk.Frame(self.root, bg="#f0f0f0", pady=5)
        toolbar.pack(side=tk.TOP, fill=tk.X)

        # 颜色选择按钮
        tk.Button(toolbar, text="选择颜色", command=self.choose_color,
                  width=10).pack(side=tk.LEFT, padx=5)

        # 当前颜色预览
        self.color_preview = tk.Label(toolbar, bg=self.brush_color,
                                      width=4, relief=tk.SUNKEN)
        self.color_preview.pack(side=tk.LEFT, padx=5)

        # 粗细调节
        tk.Label(toolbar, text="粗细:", bg="#f0f0f0").pack(side=tk.LEFT, padx=(15, 0))
        self.size_scale = tk.Scale(toolbar, from_=1, to=30, orient=tk.HORIZONTAL,
                                   length=120, command=self.change_size)
        self.size_scale.set(self.brush_size)
        self.size_scale.pack(side=tk.LEFT, padx=5)

        # 橡皮擦切换
        self.eraser_btn = tk.Button(toolbar, text="橡皮擦", command=self.toggle_eraser,
                                    width=8)
        self.eraser_btn.pack(side=tk.LEFT, padx=5)

        # 清空按钮
        tk.Button(toolbar, text="清空画布", command=self.clear_canvas,
                  width=8).pack(side=tk.LEFT, padx=5)

        # 保存按钮
        tk.Button(toolbar, text="保存图片", command=self.save_image,
                  width=8).pack(side=tk.LEFT, padx=5)

        # ===== 画布 =====
        self.canvas = tk.Canvas(self.root, bg="white", cursor="cross")
        self.canvas.pack(fill=tk.BOTH, expand=True)

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

    # ===== 功能函数 =====
    def choose_color(self):
        color = colorchooser.askcolor(title="选择颜色")[1]
        if color:
            self.brush_color = color
            self.color_preview.config(bg=color)
            # 选颜色时自动退出橡皮擦模式
            self.eraser_mode = False
            self.eraser_btn.config(relief=tk.RAISED)

    def change_size(self, value):
        self.brush_size = int(value)

    def toggle_eraser(self):
        self.eraser_mode = not self.eraser_mode
        if self.eraser_mode:
            self.eraser_btn.config(relief=tk.SUNKEN)
        else:
            self.eraser_btn.config(relief=tk.RAISED)

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

    def draw(self, event):
        if self.last_x is None:
            self.last_x, self.last_y = event.x, event.y
            return

        color = "white" if self.eraser_mode else self.brush_color
        # 橡皮擦用更大尺寸
        width = self.brush_size * 3 if self.eraser_mode else self.brush_size

        self.canvas.create_line(
            self.last_x, self.last_y, event.x, event.y,
            fill=color, width=width,
            capstyle=tk.ROUND, smooth=True
        )
        self.last_x, self.last_y = event.x, event.y

    def stop_draw(self, event):
        self.last_x = None
        self.last_y = None

    def clear_canvas(self):
        if messagebox.askyesno("确认", "确定要清空画布吗？"):
            self.canvas.delete("all")

    def save_image(self):
        file_path = filedialog.asksaveasfilename(
            defaultextension=".png",
            filetypes=[("PNG 图片", "*.png"),
                       ("JPEG 图片", "*.jpg"),
                       ("所有文件", "*.*")]
        )
        if not file_path:
            return
        try:
            # 获取画布位置和大小
            x = self.canvas.winfo_rootx()
            y = self.canvas.winfo_rooty()
            x1 = x + self.canvas.winfo_width()
            y1 = y + self.canvas.winfo_height()

            # 截取画布区域
            ImageGrab.grab().crop((x, y, x1, y1)).save(file_path)
            messagebox.showinfo("成功", f"图片已保存到:\n{file_path}")
        except Exception as e:
            messagebox.showerror("保存失败", f"出错了:\n{e}")


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