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

class BeautifulPaintBoard:
    def __init__(self, root):
        self.root = root
        self.root.title("高颜值画图板｜背景色切换版")
        self.root.geometry("1200x720")
        self.root.configure(bg="#2c313a")

        # 绘画参数
        self.draw_color = "#ffffff"
        self.line_width = 4
        self.is_paint = False
        self.last_x = 0
        self.last_y = 0
        self.eraser_mode = False
        # 画布背景色
        self.canvas_bg = "#1e2228"

        # 画布尺寸
        self.w = 950
        self.h = 620
        self.img = Image.new("RGB", (self.w, self.h), self.canvas_bg)
        self.img_draw = ImageDraw.Draw(self.img)

        self.create_widgets()

    def create_widgets(self):
        # 顶部工具栏框架
        top_frame = tk.Frame(self.root, bg="#383e4a")
        top_frame.pack(fill=tk.X, padx=8, pady=8)

        # 画笔相关按钮
        self.color_btn = tk.Button(top_frame, text="🎨 画笔颜色", command=self.choose_color,
                                   bg="#5294e2", fg="white", font=("微软雅黑", 11), relief=tk.FLAT, padx=10)
        self.color_btn.pack(side=tk.LEFT, padx=4)

        self.eraser_btn = tk.Button(top_frame, text="🧹 橡皮擦", command=self.toggle_eraser,
                                    bg="#666666", fg="white", font=("微软雅黑", 11), relief=tk.FLAT, padx=10)
        self.eraser_btn.pack(side=tk.LEFT, padx=4)

        # 背景色按钮组
        bg_btn = tk.Button(top_frame, text="🖼️ 更换画布背景", command=self.choose_bg_color,
                           bg="#9b59b6", fg="white", font=("微软雅黑", 11), relief=tk.FLAT, padx=10)
        bg_btn.pack(side=tk.LEFT, padx=4)

        # 预设快捷背景
        tk.Label(top_frame, text="快捷背景:", bg="#383e4a", fg="white", font=("微软雅黑",10)).pack(side=tk.LEFT,padx=(10,3))
        presets = [
            ("黑", "#1e2228"),
            ("白", "#ffffff"),
            ("浅灰", "#e8e8e8"),
            ("米黄", "#fff8dc"),
            ("浅蓝", "#d0e8ff")
        ]
        for name, c in presets:
            btn = tk.Button(top_frame, text=name, width=3, command=lambda col=c:self.set_bg(col),
                            bg=c, fg="black" if c!="#1e2228" else "white", relief=tk.FLAT)
            btn.pack(side=tk.LEFT,padx=2)

        clear_btn = tk.Button(top_frame, text="🗑️ 清空画布", command=self.clear_canvas,
                              bg="#e05555", fg="white", font=("微软雅黑", 11), relief=tk.FLAT, padx=10)
        clear_btn.pack(side=tk.LEFT, padx=4)

        save_btn = tk.Button(top_frame, text="💾 保存图片", command=self.save_image,
                             bg="#39b54a", fg="white", font=("微软雅黑", 11), relief=tk.FLAT, padx=10)
        save_btn.pack(side=tk.LEFT, padx=4)

        # 粗细滑块
        tk.Label(top_frame, text="粗细:", bg="#383e4a", fg="white", font=("微软雅黑",10)).pack(side=tk.LEFT,padx=(12,4))
        self.size_slider = tk.Scale(top_frame, from_=1, to=40, orient=tk.HORIZONTAL, bg="#383e4a",
                                    fg="white", highlightthickness=0, command=self.change_width)
        self.size_slider.set(4)
        self.size_slider.pack(side=tk.LEFT)

        # 画布
        self.canvas = tk.Canvas(self.root, width=self.w, height=self.h, bg=self.canvas_bg, cursor="crosshair")
        self.canvas.pack(padx=10, pady=5)

        self.canvas.bind("<Button-1>", self.mouse_down)
        self.canvas.bind("<B1-Motion>", self.mouse_move)
        self.canvas.bind("<ButtonRelease-1>", self.mouse_up)

    def set_bg(self, color):
        """设置画布背景色（快捷按钮调用）"""
        self.canvas_bg = color
        self.canvas.config(bg=self.canvas_bg)
        self.clear_canvas()

    def choose_bg_color(self):
        """打开拾色器自定义背景"""
        res = colorchooser.askcolor(title="选择画布背景色")
        if res[1]:
            self.canvas_bg = res[1]
            self.canvas.config(bg=self.canvas_bg)
            self.clear_canvas()

    def choose_color(self):
        color = colorchooser.askcolor(title="选择画笔颜色")[1]
        if color:
            self.draw_color = color
            self.eraser_mode = False
            self.eraser_btn.config(bg="#666666")

    def toggle_eraser(self):
        self.eraser_mode = not self.eraser_mode
        if self.eraser_mode:
            self.eraser_btn.config(bg="#ff8822")
        else:
            self.eraser_btn.config(bg="#666666")

    def change_width(self, val):
        self.line_width = int(val)

    def mouse_down(self, event):
        self.is_paint = True
        self.last_x = event.x
        self.last_y = event.y

    def mouse_move(self, event):
        if not self.is_paint:
            return
        x, y = event.x, event.y
        if self.eraser_mode:
            color = self.canvas_bg
        else:
            color = self.draw_color

        self.canvas.create_line(self.last_x, self.last_y, x, y, fill=color, width=self.line_width, capstyle=tk.ROUND)
        self.img_draw.line([self.last_x, self.last_y, x, y], fill=color, width=self.line_width)
        self.last_x = x
        self.last_y = y

    def mouse_up(self, event):
        self.is_paint = False

    def clear_canvas(self):
        self.canvas.delete("all")
        self.img = Image.new("RGB", (self.w, self.h), self.canvas_bg)
        self.img_draw = ImageDraw.Draw(self.img)

    def save_image(self):
        path = filedialog.asksaveasfilename(defaultextension=".png",
                                            filetypes=[("PNG图片", "*.png"), ("JPG图片", "*.jpg")])
        if path:
            self.img.save(path)
            messagebox.showinfo("成功", "图片保存完成！")

if __name__ == "__main__":
    window = tk.Tk()
    app = BeautifulPaintBoard(window)
    window.mainloop()