import tkinter as tk
from tkinter import ttk
import pygame
import threading
import random
import math
import time

# 全局系统数据
class DryData:
    def __init__(self):
        self.humidity = 88.0
        self.temperature = 24.0
        self.wind_level = 0
        self.is_run = False
        self.dry_time = 30
        self.left_time = 0
        self.warn = ""

data = DryData()

# ---------------------- Pygame 动态烘干画面 ----------------------
def pygame_window():
    pygame.init()
    w, h = 500, 400
    screen = pygame.display.set_mode((w, h))
    pygame.display.set_caption("雨衣烘干模拟")
    clock = pygame.time.Clock()
    font = pygame.font.SysFont("simhei", 20)

    running = True
    while running:
        screen.fill((240, 248, 255))
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                running = False

        # 烘干箱
        pygame.draw.rect(screen, (160, 180, 200), (70, 50, 360, 260), border_radius=10)
        pygame.draw.rect(screen, (100, 130, 160), (80, 60, 340, 240), border_radius=8)

        # 雨衣
        pygame.draw.ellipse(screen, (80, 140, 210), (160, 100, 180, 140))

        # 热风动画
        if data.is_run:
            for _ in range(8):
                cx = random.randint(100, 400)
                cy = random.randint(70, 270)
                pygame.draw.circle(screen, (255, 210, 80), (cx, cy), 4)

        # 显示数据
        screen.blit(font.render(f"湿度：{data.humidity:.1f}%", True, (0,0,0)), (40,20))
        screen.blit(font.render(f"温度：{data.temperature:.1f}°C", True, (0,0,0)), (300,20))
        screen.blit(font.render(f"风速：{data.wind_level}档", True, (0,0,0)), (40,350))
        screen.blit(font.render(f"剩余：{data.left_time:.1f}分钟", True, (0,0,0)), (300,350))

        if data.warn:
            warn = font.render(data.warn, True, (255,0,0))
            screen.blit(warn, (150, 180))

        pygame.display.flip()
        clock.tick(30)
    pygame.quit()

# ---------------------- Tkinter 控制面板（已完全修复） ----------------------
class DryControlUI:
    def __init__(self, root):
        self.root = root
        self.root.title("雨衣烘干控制系统")
        self.root.geometry("500x400")
        self.create_ui()
        self.auto_refresh()

    def create_ui(self):
        # 标题
        tk.Label(self.root, text="智能雨衣烘干系统", font=("黑体", 18, "bold"), fg="#0066cc").pack(pady=10)

        # 数据面板
        frame = ttk.LabelFrame(self.root, text="实时数据", padding=15)
        frame.pack(fill="x", padx=20)

        ttk.Label(frame, text="环境湿度：").grid(row=0,column=0)
        self.hum_lab = ttk.Label(frame, text="88.0 %")
        self.hum_lab.grid(row=0,column=1, padx=10)

        ttk.Label(frame, text="舱内温度：").grid(row=0,column=2)
        self.temp_lab = ttk.Label(frame, text="24.0 °C")
        self.temp_lab.grid(row=0,column=3, padx=10)

        ttk.Label(frame, text="风速档位：").grid(row=1,column=0)
        self.wind_lab = ttk.Label(frame, text="0")
        self.wind_lab.grid(row=1,column=1, padx=10)

        ttk.Label(frame, text="运行状态：").grid(row=1,column=2)
        self.state_lab = ttk.Label(frame, text="待机")
        self.state_lab.grid(row=1,column=3, padx=10)

        # 定时设置
        frame2 = ttk.LabelFrame(self.root, text="定时设置", padding=15)
        frame2.pack(fill="x", padx=20, pady=10)

        ttk.Label(frame2, text="设定时长：").grid(row=0,column=0)
        self.time_var = tk.StringVar(value="30")
        ttk.Entry(frame2, textvariable=self.time_var, width=8).grid(row=0,column=1)

        ttk.Label(frame2, text="剩余时间：").grid(row=0,column=2)
        self.left_lab = ttk.Label(frame2, text="0.0 分钟")
        self.left_lab.grid(row=0,column=3)

        # 按钮
        frame3 = tk.Frame(self.root)
        frame3.pack(pady=15)

        tk.Button(frame3, text="启动烘干", bg="#28a745", fg="white", command=self.start).grid(row=0,column=0,padx=5)
        tk.Button(frame3, text="停止烘干", bg="#dc3545", fg="white", command=self.stop).grid(row=0,column=1,padx=5)
        tk.Button(frame3, text="风速+", command=self.wind_up).grid(row=0,column=2,padx=5)
        tk.Button(frame3, text="风速-", command=self.wind_down).grid(row=0,column=3,padx=5)

        # 提示栏
        self.tip = tk.Label(self.root, text="系统就绪", font=("微软雅黑", 12))
        self.tip.pack(pady=5)

    def wind_up(self):
        if data.wind_level < 5:
            data.wind_level += 1

    def wind_down(self):
        if data.wind_level > 0:
            data.wind_level -= 1

    def start(self):
        try:
            data.dry_time = int(self.time_var.get())
            data.left_time = data.dry_time
            data.is_run = True
            self.tip.config(text="正在烘干...")
        except:
            self.tip.config(text="请输入有效数字！")

    def stop(self):
        data.is_run = False
        data.wind_level = 0
        self.tip.config(text="烘干已停止")

    def auto_refresh(self):
        if data.is_run:
            # 湿度下降
            if data.humidity > 30:
                data.humidity -= random.uniform(0.2, 0.6)
            # 温度上升
            data.temperature = random.uniform(35, 48)
            # 倒计时
            data.left_time -= 0.02
            if data.left_time <= 0:
                self.stop()
                self.tip.config(text="烘干完成！")
            # 过热保护
            if data.temperature > 46:
                data.warn = "温度过高！已保护"
                self.tip.config(text="警告：温度超标！", fg="red")
            else:
                data.warn = ""
        else:
            data.temperature = random.uniform(22, 26)
            data.humidity = min(90, max(30, data.humidity + random.uniform(-0.1, 0.3)))

        # 更新界面
        self.hum_lab.config(text=f"{data.humidity:.1f} %")
        self.temp_lab.config(text=f"{data.temperature:.1f} °C")
        self.wind_lab.config(text=str(data.wind_level))
        self.left_lab.config(text=f"{max(0, data.left_time):.1f} 分钟")
        self.state_lab.config(text="运行中" if data.is_run else "待机")

        self.root.after(50, self.auto_refresh)

# ---------------------- 启动 ----------------------
if __name__ == "__main__":
    t1 = threading.Thread(target=pygame_window, daemon=True)
    t1.start()

    root = tk.Tk()
    app = DryControlUI(root)
    root.mainloop()