import tkinter as tk
from tkinter import ttk, messagebox
import time
from datetime import datetime
import winsound
import threading

class AdvancedClock:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("多功能时钟")
        self.root.geometry("600x400")
        self.root.configure(bg='#f0f0f0')
        
        # 闹钟变量
        self.alarm_time = None
        self.alarm_set = False
        
        # 创建笔记本（选项卡）
        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(expand=True, fill='both', padx=10, pady=10)
        
        # 时钟选项卡
        self.clock_frame = tk.Frame(self.notebook, bg='#f0f0f0')
        self.notebook.add(self.clock_frame, text='时钟')
        
        # 闹钟选项卡
        self.alarm_frame = tk.Frame(self.notebook, bg='#f0f0f0')
        self.notebook.add(self.alarm_frame, text='闹钟')
        
        # 秒表选项卡
        self.stopwatch_frame = tk.Frame(self.notebook, bg='#f0f0f0')
        self.notebook.add(self.stopwatch_frame, text='秒表')
        
        # 初始化各个功能
        self.init_clock()
        self.init_alarm()
        self.init_stopwatch()
        
        # 启动时钟更新
        self.update_display()
        
        self.root.mainloop()
    
    def init_clock(self):
        """初始化时钟界面"""
        # 时间显示
        self.time_label = tk.Label(
            self.clock_frame,
            font=('Arial', 70, 'bold'),
            bg='#f0f0f0',
            fg='#2c3e50'
        )
        self.time_label.pack(expand=True, pady=30)
        
        # 日期显示
        self.date_label = tk.Label(
            self.clock_frame,
            font=('Arial', 20),
            bg='#f0f0f0',
            fg='#7f8c8d'
        )
        self.date_label.pack()
        
        # 星期显示
        self.week_label = tk.Label(
            self.clock_frame,
            font=('Arial', 16),
            bg='#f0f0f0',
            fg='#95a5a6'
        )
        self.week_label.pack(pady=10)
    
    def init_alarm(self):
        """初始化闹钟界面"""
        # 时间选择框
        time_frame = tk.Frame(self.alarm_frame, bg='#f0f0f0')
        time_frame.pack(pady=50)
        
        tk.Label(time_frame, text="设置闹钟时间：", font=('Arial', 14), 
                bg='#f0f0f0').pack(side=tk.LEFT, padx=10)
        
        # 小时选择
        self.hour_var = tk.StringVar()
        self.hour_spin = tk.Spinbox(time_frame, from_=0, to=23, width=5,
                                    font=('Arial', 14), textvariable=self.hour_var,
                                    format="%02.0f")
        self.hour_spin.pack(side=tk.LEFT, padx=5)
        
        tk.Label(time_frame, text=":", font=('Arial', 14), 
                bg='#f0f0f0').pack(side=tk.LEFT)
        
        # 分钟选择
        self.minute_var = tk.StringVar()
        self.minute_spin = tk.Spinbox(time_frame, from_=0, to=59, width=5,
                                     font=('Arial', 14), textvariable=self.minute_var,
                                     format="%02.0f")
        self.minute_spin.pack(side=tk.LEFT, padx=5)
        
        # 设置闹钟按钮
        self.set_alarm_btn = tk.Button(
            self.alarm_frame,
            text="设置闹钟",
            command=self.set_alarm,
            font=('Arial', 12),
            bg='#3498db',
            fg='white',
            padx=20,
            pady=10
        )
        self.set_alarm_btn.pack(pady=20)
        
        # 显示设置的闹钟
        self.alarm_display = tk.Label(
            self.alarm_frame,
            text="未设置闹钟",
            font=('Arial', 12),
            bg='#f0f0f0',
            fg='#e74c3c'
        )
        self.alarm_display.pack(pady=10)
    
    def init_stopwatch(self):
        """初始化秒表界面"""
        self.stopwatch_running = False
        self.stopwatch_time = 0
        
        # 时间显示
        self.stopwatch_label = tk.Label(
            self.stopwatch_frame,
            text="00:00:00",
            font=('Arial', 60, 'bold'),
            bg='#f0f0f0',
            fg='#2c3e50'
        )
        self.stopwatch_label.pack(expand=True, pady=40)
        
        # 按钮框架
        button_frame = tk.Frame(self.stopwatch_frame, bg='#f0f0f0')
        button_frame.pack(pady=20)
        
        # 开始按钮
        self.start_btn = tk.Button(
            button_frame,
            text="开始",
            command=self.start_stopwatch,
            font=('Arial', 12),
            bg='#27ae60',
            fg='white',
            padx=20,
            pady=8
        )
        self.start_btn.pack(side=tk.LEFT, padx=10)
        
        # 暂停按钮
        self.pause_btn = tk.Button(
            button_frame,
            text="暂停",
            command=self.pause_stopwatch,
            font=('Arial', 12),
            bg='#f39c12',
            fg='white',
            padx=20,
            pady=8
        )
        self.pause_btn.pack(side=tk.LEFT, padx=10)
        
        # 重置按钮
        self.reset_btn = tk.Button(
            button_frame,
            text="重置",
            command=self.reset_stopwatch,
            font=('Arial', 12),
            bg='#e74c3c',
            fg='white',
            padx=20,
            pady=8
        )
        self.reset_btn.pack(side=tk.LEFT, padx=10)
    
    def update_display(self):
        """更新所有显示"""
        now = datetime.now()
        
        # 更新时间显示
        current_time = now.strftime("%H:%M:%S")
        current_date = now.strftime("%Y年%m月%d日")
        weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
        current_week = weekdays[now.weekday()]
        
        self.time_label.config(text=current_time)
        self.date_label.config(text=current_date)
        self.week_label.config(text=current_week)
        
        # 检查闹钟
        if self.alarm_set and self.alarm_time:
            current = now.strftime("%H:%M")
            if current == self.alarm_time:
                self.trigger_alarm()
        
        # 更新秒表
        if self.stopwatch_running:
            self.stopwatch_time += 1
            self.update_stopwatch_display()
        
        # 每秒更新一次
        self.root.after(1000, self.update_display)
    
    def set_alarm(self):
        """设置闹钟"""
        try:
            hour = int(self.hour_var.get())
            minute = int(self.minute_var.get())
            self.alarm_time = f"{hour:02d}:{minute:02d}"
            self.alarm_set = True
            self.alarm_display.config(
                text=f"闹钟已设置：{self.alarm_time}",
                fg='#27ae60'
            )
            messagebox.showinfo("闹钟", f"闹钟已设置为 {self.alarm_time}")
        except ValueError:
            messagebox.showerror("错误", "请输入有效的时间")
    
    def trigger_alarm(self):
        """触发闹钟"""
        self.alarm_set = False
        messagebox.showwarning("闹钟", f"时间到了！{self.alarm_time}")
        # 播放系统提示音（Windows）
        try:
            winsound.Beep(1000, 2000)
        except:
            pass
        self.alarm_display.config(text="闹钟已触发", fg='#e74c3c')
    
    def start_stopwatch(self):
        """开始秒表"""
        if not self.stopwatch_running:
            self.stopwatch_running = True
    
    def pause_stopwatch(self):
        """暂停秒表"""
        self.stopwatch_running = False
    
    def reset_stopwatch(self):
        """重置秒表"""
        self.stopwatch_running = False
        self.stopwatch_time = 0
        self.update_stopwatch_display()
    
    def update_stopwatch_display(self):
        """更新秒表显示"""
        hours = self.stopwatch_time // 3600
        minutes = (self.stopwatch_time % 3600) // 60
        seconds = self.stopwatch_time % 60
        time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
        self.stopwatch_label.config(text=time_str)

if __name__ == "__main__":
    clock = AdvancedClock()