import tkinter as tk
from tkinter import colorchooser, ttk

class SimplePaint:
    def __init__(self, root):
        self.root = root
        self.root.title("简易画图板")

        # 当前工具和颜色
        self.tool = "pen"       # 可选: pen, line, rect, oval, eraser
        self.color = "black"
        self.eraser_color = "white"   # 橡皮擦实际是画白色
        self.line_width = 2

        # 画布
        self.canvas = tk.Canvas(root, bg="white", width=800, height=600)
        self.canvas.pack(fill=tk.BOTH, expand=True)

        # 鼠标状态
        self.start_x = None
        self.start_y = None
        self.current_shape = None   # 用于临时形状（矩形/椭圆/直线）

        # 绑定鼠标事件
        self.canvas.bind("<Button-1>", self.on_button_down)
        self.canvas.bind("<B1-Motion>", self.on_mouse_move)
        self.canvas.bind("<ButtonRelease-1>", self.on_button_up)

        # 工具栏框架
        toolbar = tk.Frame(root)
        toolbar.pack(side=tk.TOP, fill=tk.X)

        # 工具按钮
        tools = [
            ("画笔", "pen"),
            ("直线", "line"),
            ("矩形", "rect"),
            ("椭圆", "oval"),
            ("橡皮擦", "eraser")
        ]
        for text, tool_name in tools:
            btn = tk.Button(toolbar, text=text, command=lambda t=tool_name: self.set_tool(t))
            btn.pack(side=tk.LEFT, padx=2, pady=2)

        # 颜色选择
        color_btn = tk.Button(toolbar, text="选择颜色", command=self.choose_color)
        color_btn.pack(side=tk.LEFT, padx=2, pady=2)

        # 清除画布
        clear_btn = tk.Button(toolbar, text="清空", command=self.clear_canvas)
        clear_btn.pack(side=tk.LEFT, padx=2, pady=2)

        # 笔触大小
        tk.Label(toolbar, text="笔宽:").pack(side=tk.LEFT, padx=2)
        self.size_var = tk.IntVar(value=2)
        size_spin = tk.Spinbox(toolbar, from_=1, to=20, textvariable=self.size_var, width=3)
        size_spin.pack(side=tk.LEFT, padx=2)

    def set_tool(self, tool):
        self.tool = tool
        # 橡皮擦使用白色，但保留用户颜色，方便切换回来
        if tool == "eraser":
            self.current_color = self.color  # 保存原色
            self.canvas.config(cursor="dot")
        else:
            self.canvas.config(cursor="")

    def choose_color(self):
        color = colorchooser.askcolor(color=self.color)[1]
        if color:
            self.color = color
            # 如果不是橡皮擦模式，立即应用颜色；如果是，暂不改变橡皮擦颜色
            if self.tool != "eraser":
                self.current_color = color

    def clear_canvas(self):
        self.canvas.delete("all")

    def on_button_down(self, event):
        self.start_x = event.x
        self.start_y = event.y
        self.current_shape = None

        if self.tool == "pen":
            # 画笔模式：创建一个小圆点作为起始点（连续画）
            x, y = event.x, event.y
            self.canvas.create_oval(x, y, x, y, outline=self.color, fill=self.color,
                                    width=self.line_width, tags="current")
        elif self.tool == "eraser":
            # 橡皮擦：用白色画一个点
            x, y = event.x, event.y
            self.canvas.create_oval(x-5, y-5, x+5, y+5, outline="white", fill="white",
                                    width=0, tags="current")

    def on_mouse_move(self, event):
        if self.start_x is None or self.start_y is None:
            return

        x, y = event.x, event.y
        if self.tool == "pen":
            # 画线到新位置
            self.canvas.create_line(self.start_x, self.start_y, x, y,
                                    fill=self.color, width=self.line_width,
                                    capstyle=tk.ROUND, smooth=True, tags="current")
            self.start_x, self.start_y = x, y
        elif self.tool == "eraser":
            # 橡皮擦（白色线条）
            self.canvas.create_line(self.start_x, self.start_y, x, y,
                                    fill="white", width=self.line_width*3,
                                    capstyle=tk.ROUND, smooth=True, tags="current")
            self.start_x, self.start_y = x, y
        else:
            # 对于直线、矩形、椭圆，实时预览形状
            # 删除之前的临时形状
            if self.current_shape:
                self.canvas.delete(self.current_shape)

            if self.tool == "line":
                self.current_shape = self.canvas.create_line(self.start_x, self.start_y,
                                                             x, y, fill=self.color,
                                                             width=self.line_width)
            elif self.tool == "rect":
                self.current_shape = self.canvas.create_rectangle(self.start_x, self.start_y,
                                                                  x, y, outline=self.color,
                                                                  width=self.line_width, fill="")
            elif self.tool == "oval":
                self.current_shape = self.canvas.create_oval(self.start_x, self.start_y,
                                                             x, y, outline=self.color,
                                                             width=self.line_width, fill="")

    def on_button_up(self, event):
        if self.start_x is None or self.start_y is None:
            return
        # 对于非画笔/橡皮擦，最后形状已经由移动事件更新，无需额外操作
        # 但可能没有移动就直接释放，这时也画一个小点或形状
        if self.tool in ("line", "rect", "oval"):
            if self.current_shape:
                # 已经存在临时形状，保留它，但清除引用
                self.current_shape = None
            else:
                # 如果鼠标没有移动，画一个点或小形状
                x, y = event.x, event.y
                if self.tool == "line":
                    self.canvas.create_line(self.start_x, self.start_y, x, y,
                                            fill=self.color, width=self.line_width)
                elif self.tool == "rect":
                    self.canvas.create_rectangle(self.start_x, self.start_y, x, y,
                                                 outline=self.color, width=self.line_width, fill="")
                elif self.tool == "oval":
                    self.canvas.create_oval(self.start_x, self.start_y, x, y,
                                            outline=self.color, width=self.line_width, fill="")
        elif self.tool == "pen" and (event.x == self.start_x and event.y == self.start_y):
            # 如果画笔只点了一下没有移动，已经画了点，不用重复
            pass
        elif self.tool == "eraser" and (event.x == self.start_x and event.y == self.start_y):
            # 橡皮擦只点一下，也已经画了白点
            pass

        self.start_x = None
        self.start_y = None
        self.current_shape = None

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