import tkinter as tk
from tkinter import ttk
import random

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

        # 目标颜色 RGB
        self.target_r = 0
        self.target_g = 0
        self.target_b = 0
        # 用户调节颜色
        self.user_r = tk.IntVar(value=128)
        self.user_g = tk.IntVar(value=128)
        self.user_b = tk.IntVar(value=128)

        self.create_widgets()
        self.new_target_color()
        self.update_display()

    def create_widgets(self):
        # 色块展示区域
        frame_color = tk.Frame(self.root)
        frame_color.pack(pady=15)

        # 目标色块
        tk.Label(frame_color, text="目标颜色", font=("微软雅黑",11)).grid(row=0, column=0, padx=20)
        self.target_canvas = tk.Canvas(frame_color, width=120, height=120, bg="#000000")
        self.target_canvas.grid(row=1, column=0, padx=20)

        # 用户色块
        tk.Label(frame_color, text="你的配色", font=("微软雅黑",11)).grid(row=0, column=1, padx=20)
        self.user_canvas = tk.Canvas(frame_color, width=120, height=120, bg="#888888")
        self.user_canvas.grid(row=1, column=1, padx=20)

        # RGB滑动条区域
        frame_slider = tk.Frame(self.root)
        frame_slider.pack(pady=8)

        # 红色滑块
        tk.Label(frame_slider, text="R 红色", fg="red", font=("微软雅黑",10)).grid(row=0, column=0, sticky="w")
        s_r = ttk.Scale(frame_slider, from_=0, to=255, variable=self.user_r, command=self.on_slider_change, orient=tk.HORIZONTAL, length=300)
        s_r.grid(row=0, column=1, padx=10)
        self.label_r = tk.Label(frame_slider, text="0")
        self.label_r.grid(row=0, column=2)

        # 绿色滑块
        tk.Label(frame_slider, text="G 绿色", fg="green", font=("微软雅黑",10)).grid(row=1, column=0, sticky="w")
        s_g = ttk.Scale(frame_slider, from_=0, to=255, variable=self.user_g, command=self.on_slider_change, orient=tk.HORIZONTAL, length=300)
        s_g.grid(row=1, column=1, padx=10)
        self.label_g = tk.Label(frame_slider, text="0")
        self.label_g.grid(row=1, column=2)

        # 蓝色滑块
        tk.Label(frame_slider, text="B 蓝色", fg="blue", font=("微软雅黑",10)).grid(row=2, column=0, sticky="w")
        s_b = ttk.Scale(frame_slider, from_=0, to=255, variable=self.user_b, command=self.on_slider_change, orient=tk.HORIZONTAL, length=300)
        s_b.grid(row=2, column=1, padx=10)
        self.label_b = tk.Label(frame_slider, text="0")
        self.label_b.grid(row=2, column=2)

        # 信息文本
        self.info_label = tk.Label(self.root, text="色差：--", font=("微软雅黑",10))
        self.info_label.pack(pady=6)

        # 按钮区域
        frame_btn = tk.Frame(self.root)
        frame_btn.pack()
        tk.Button(frame_btn, text="更换目标颜色", command=self.new_target_color, width=12).grid(row=0, column=0, padx=8)
        tk.Button(frame_btn, text="滑块重置中间值", command=self.reset_slider, width=12).grid(row=0, column=1, padx=8)

    def rgb_to_hex(self, r, g, b):
        return f"#{r:02X}{g:02X}{b:02X}"

    def new_target_color(self):
        # 随机生成目标RGB
        self.target_r = random.randint(20, 235)
        self.target_g = random.randint(20, 235)
        self.target_b = random.randint(20, 235)
        self.update_display()

    def reset_slider(self):
        self.user_r.set(128)
        self.user_g.set(128)
        self.user_b.set(128)
        self.update_display()

    def on_slider_change(self, event):
        self.update_display()

    def calc_color_diff(self):
        # 简单欧式色差计算
        dr = self.user_r.get() - self.target_r
        dg = self.user_g.get() - self.target_g
        db = self.user_b.get() - self.target_b
        diff = (dr**2 + dg**2 + db**2)**0.5
        return round(diff,1)

    def update_display(self):
        ur = self.user_r.get()
        ug = self.user_g.get()
        ub = self.user_b.get()

        # 更新色块背景
        target_hex = self.rgb_to_hex(self.target_r, self.target_g, self.target_b)
        user_hex = self.rgb_to_hex(ur, ug, ub)
        self.target_canvas.config(bg=target_hex)
        self.user_canvas.config(bg=user_hex)

        # 更新数值标签
        self.label_r.config(text=str(ur))
        self.label_g.config(text=str(ug))
        self.label_b.config(text=str(ub))

        diff = self.calc_color_diff()
        self.info_label.config(text=(
            f"目标RGB:({self.target_r},{self.target_g},{self.target_b}) | "
            f"你的RGB:({ur},{ug},{ub}) | 色差:{diff}"
        ))

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