import tkinter as tk
from tkinter import ttk, messagebox
import random
import pyperclip

# 生成随机十六进制颜色
def random_color():
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    return f"#{r:02X}{g:02X}{b:02X}"


class ColorPracticeApp:
    def __init__(self, root):
        self.root = root
        self.root.title("配色练习小工具")
        self.root.geometry("620x420")
        self.root.resizable(False, False)

        # 存储三色
        self.color1 = tk.StringVar()
        self.color2 = tk.StringVar()
        self.color3 = tk.StringVar()

        # 标题
        title_label = ttk.Label(root, text="🎨 配色练习", font=("微软雅黑", 16, "bold"))
        title_label.pack(pady=12)

        # 色块容器
        frame_color = ttk.Frame(root)
        frame_color.pack(pady=8)

        # 色块1
        self.canvas1 = tk.Canvas(frame_color, width=140, height=180, bg="#cccccc", bd=2)
        self.canvas1.grid(row=0, column=0, padx=6)
        ttk.Label(frame_color, textvariable=self.color1).grid(row=1, column=0)

        # 色块2
        self.canvas2 = tk.Canvas(frame_color, width=140, height=180, bg="#cccccc", bd=2)
        self.canvas2.grid(row=0, column=1, padx=6)
        ttk.Label(frame_color, textvariable=self.color2).grid(row=1, column=1)

        # 色块3
        self.canvas3 = tk.Canvas(frame_color, width=140, height=180, bg="#cccccc", bd=2)
        self.canvas3.grid(row=0, column=2, padx=6)
        ttk.Label(frame_color, textvariable=self.color3).grid(row=1, column=2)

        # 按钮区域
        frame_btn = ttk.Frame(root)
        frame_btn.pack(pady=12)

        ttk.Button(frame_btn, text="随机新配色", command=self.refresh_color).grid(row=0, column=0, padx=5)
        ttk.Button(frame_btn, text="复制全部色号", command=self.copy_all).grid(row=0, column=1, padx=5)

        # 手动预览颜色区域
        frame_input = ttk.Frame(root)
        frame_input.pack(pady=10)
        ttk.Label(frame_input, text="输入色号预览(#FFFFFF):").grid(row=0, column=0)
        self.entry_color = ttk.Entry(frame_input, width=16)
        self.entry_color.grid(row=0, column=1, padx=6)
        ttk.Button(frame_input, text="预览", command=self.preview_input_color).grid(row=0, column=2)

        self.preview_canvas = tk.Canvas(root, width=80, height=80, bg="#EEEEEE", bd=2)
        self.preview_canvas.pack(pady=5)

        # 初始生成配色
        self.refresh_color()

    def refresh_color(self):
        """刷新三组随机颜色"""
        c1 = random_color()
        c2 = random_color()
        c3 = random_color()

        self.color1.set(c1)
        self.color2.set(c2)
        self.color3.set(c3)

        self.canvas1.config(bg=c1)
        self.canvas2.config(bg=c2)
        self.canvas3.config(bg=c3)

    def copy_all(self):
        """复制三组色号到剪贴板"""
        text = f"{self.color1.get()}\n{self.color2.get()}\n{self.color3.get()}"
        try:
            pyperclip.copy(text)
            messagebox.showinfo("提示", "色号复制成功！")
        except Exception:
            messagebox.showwarning("警告", "剪贴板库异常，请手动复制！\n"+text)

    def preview_input_color(self):
        """预览手动输入颜色"""
        hex_str = self.entry_color.get().strip()
        if len(hex_str) == 7 and hex_str.startswith("#"):
            try:
                self.preview_canvas.config(bg=hex_str)
            except:
                messagebox.showerror("错误", "无效色号！")
        else:
            messagebox.showerror("错误", "格式错误！示例：#336699")


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