import tkinter as tk
from tkinter import ttk, font, messagebox, colorchooser, filedialog
import time
import datetime
import calendar
import json
import os
import math
import sys
import platform

class DesktopClock:
    def __init__(self, root):
        self.root = root
        self.root.title("多功能桌面时钟")
        self.root.geometry("1000x700")
        
        # 初始化变量
        self.is_running = True
        self.is_fullscreen = False
        self.alarms = []
        self.stopwatch_running = False
        self.stopwatch_time = 0
        self.timer_running = False
        self.timer_time = 0
        self.timer_set_time = 0
        
        # 世界时区定义
        self.world_time_zones = {
            '北京': 8,
            '东京': 9,
            '悉尼': 10,
            '纽约': -5,
            '伦敦': 0,
            '巴黎': 1,
            '柏林': 1,
            '莫斯科': 3,
            '迪拜': 4,
            '新加坡': 8,
            '新德里': 5.5,
            '洛杉矶': -8,
            '多伦多': -5,
            '圣保罗': -3,
            '开罗': 2,
            '约翰内斯堡': 2
        }
        
        # 设置窗口图标
        try:
            self.root.iconbitmap('clock_icon.ico')
        except:
            pass
        
        # 创建样式
        self.setup_styles()
        
        # 创建主框架
        self.create_main_frame()
        
        # 加载设置
        self.load_settings()
        
        # 启动时钟更新
        self.update_clock()
        
        # 窗口关闭事件
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
        
    def setup_styles(self):
        """设置样式"""
        # 创建自定义样式
        self.style = ttk.Style()
        
        # 设置主题
        self.style.theme_use('clam')
        
        # 配置颜色
        self.bg_color = '#1e1e1e'
        self.fg_color = '#ffffff'
        self.accent_color = '#007acc'
        self.secondary_color = '#3e3e3e'
        self.alert_color = '#ff6b6b'
        self.success_color = '#4ecdc4'
        
        # 应用颜色
        self.root.configure(bg=self.bg_color)
        
    def create_main_frame(self):
        """创建主框架"""
        # 创建主容器
        self.main_frame = ttk.Frame(self.root)
        self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 创建标题栏
        self.create_title_bar()
        
        # 创建选项卡
        self.create_tabs()
        
        # 创建状态栏
        self.create_status_bar()
        
    def create_title_bar(self):
        """创建标题栏"""
        title_frame = ttk.Frame(self.main_frame)
        title_frame.pack(fill=tk.X, pady=(0, 10))
        
        # 标题
        title_label = tk.Label(
            title_frame,
            text="多功能桌面时钟",
            font=('Arial', 20, 'bold'),
            fg=self.fg_color,
            bg=self.bg_color
        )
        title_label.pack(side=tk.LEFT)
        
        # 控制按钮
        control_frame = ttk.Frame(title_frame)
        control_frame.pack(side=tk.RIGHT)
        
        btn_style = {
            'font': ('Arial', 10),
            'bg': self.secondary_color,
            'fg': self.fg_color,
            'relief': tk.FLAT,
            'padx': 10,
            'pady': 5
        }
        
        # 全屏按钮
        self.fullscreen_btn = tk.Button(
            control_frame,
            text="全屏",
            command=self.toggle_fullscreen,
            **btn_style
        )
        self.fullscreen_btn.pack(side=tk.LEFT, padx=2)
        
        # 设置按钮
        self.settings_btn = tk.Button(
            control_frame,
            text="设置",
            command=self.open_settings,
            **btn_style
        )
        self.settings_btn.pack(side=tk.LEFT, padx=2)
        
        # 关于按钮
        self.about_btn = tk.Button(
            control_frame,
            text="关于",
            command=self.show_about,
            **btn_style
        )
        self.about_btn.pack(side=tk.LEFT, padx=2)
        
    def create_tabs(self):
        """创建选项卡"""
        # 创建Notebook
        self.tab_control = ttk.Notebook(self.main_frame)
        self.tab_control.pack(fill=tk.BOTH, expand=True)
        
        # 创建各个标签页
        self.create_clock_tab()
        self.create_stopwatch_tab()
        self.create_timer_tab()
        self.create_alarm_tab()
        self.create_world_time_tab()
        self.create_calendar_tab()
        
    def create_clock_tab(self):
        """创建时钟标签页"""
        self.clock_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.clock_tab, text='时钟')
        
        # 主时钟显示
        clock_frame = tk.Frame(self.clock_tab, bg=self.bg_color)
        clock_frame.pack(expand=True, fill=tk.BOTH, padx=20, pady=20)
        
        # 日期显示
        self.date_label = tk.Label(
            clock_frame,
            text="",
            font=('Arial', 24),
            fg=self.fg_color,
            bg=self.bg_color
        )
        self.date_label.pack(pady=(20, 0))
        
        # 时间显示
        self.time_label = tk.Label(
            clock_frame,
            text="00:00:00",
            font=('Courier', 72, 'bold'),
            fg=self.accent_color,
            bg=self.bg_color
        )
        self.time_label.pack(pady=20)
        
        # 星期显示
        self.weekday_label = tk.Label(
            clock_frame,
            text="",
            font=('Arial', 20),
            fg=self.success_color,
            bg=self.bg_color
        )
        self.weekday_label.pack()
        
        # 秒表样式显示
        self.second_arc_frame = tk.Frame(clock_frame, bg=self.bg_color)
        self.second_arc_frame.pack(pady=20)
        
        self.second_canvas = tk.Canvas(
            self.second_arc_frame,
            width=200,
            height=200,
            bg=self.bg_color,
            highlightthickness=0
        )
        self.second_canvas.pack()
        
        # 控制按钮
        control_frame = tk.Frame(clock_frame, bg=self.bg_color)
        control_frame.pack(pady=20)
        
        # 字体调整按钮
        self.font_size_var = tk.IntVar(value=72)
        self.font_size_slider = tk.Scale(
            control_frame,
            from_=36,
            to=120,
            orient=tk.HORIZONTAL,
            variable=self.font_size_var,
            label="字体大小",
            length=300,
            command=self.update_font_size,
            bg=self.bg_color,
            fg=self.fg_color,
            highlightthickness=0
        )
        self.font_size_slider.pack(side=tk.LEFT, padx=10)
        
        # 颜色选择按钮
        color_btn = tk.Button(
            control_frame,
            text="更改颜色",
            command=self.choose_clock_color,
            bg=self.secondary_color,
            fg=self.fg_color,
            relief=tk.FLAT,
            padx=15,
            pady=5
        )
        color_btn.pack(side=tk.LEFT, padx=10)
        
    def create_stopwatch_tab(self):
        """创建秒表标签页"""
        self.stopwatch_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.stopwatch_tab, text='秒表')
        
        # 秒表显示
        stopwatch_frame = tk.Frame(self.stopwatch_tab, bg=self.bg_color)
        stopwatch_frame.pack(expand=True, fill=tk.BOTH, padx=20, pady=20)
        
        # 时间显示
        self.stopwatch_label = tk.Label(
            stopwatch_frame,
            text="00:00:00.00",
            font=('Courier', 48, 'bold'),
            fg=self.accent_color,
            bg=self.bg_color
        )
        self.stopwatch_label.pack(pady=40)
        
        # 控制按钮
        btn_frame = tk.Frame(stopwatch_frame, bg=self.bg_color)
        btn_frame.pack(pady=20)
        
        btn_style = {
            'font': ('Arial', 12, 'bold'),
            'width': 10,
            'padx': 15,
            'pady': 8,
            'relief': tk.RAISED
        }
        
        self.start_stopwatch_btn = tk.Button(
            btn_frame,
            text="开始",
            command=self.start_stopwatch,
            bg=self.success_color,
            fg='white',
            **btn_style
        )
        self.start_stopwatch_btn.pack(side=tk.LEFT, padx=5)
        
        self.pause_stopwatch_btn = tk.Button(
            btn_frame,
            text="暂停",
            command=self.pause_stopwatch,
            bg=self.secondary_color,
            fg='white',
            state=tk.DISABLED,
            **btn_style
        )
        self.pause_stopwatch_btn.pack(side=tk.LEFT, padx=5)
        
        self.reset_stopwatch_btn = tk.Button(
            btn_frame,
            text="重置",
            command=self.reset_stopwatch,
            bg=self.secondary_color,
            fg='white',
            **btn_style
        )
        self.reset_stopwatch_btn.pack(side=tk.LEFT, padx=5)
        
        # 圈数记录
        lap_frame = tk.Frame(stopwatch_frame, bg=self.bg_color)
        lap_frame.pack(fill=tk.BOTH, expand=True, pady=20)
        
        # 圈数列表
        lap_list_frame = tk.Frame(lap_frame, bg=self.bg_color)
        lap_list_frame.pack(fill=tk.BOTH, expand=True)
        
        # 滚动条
        scrollbar = tk.Scrollbar(lap_list_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 列表框
        self.lap_listbox = tk.Listbox(
            lap_list_frame,
            yscrollcommand=scrollbar.set,
            font=('Consolas', 10),
            bg=self.secondary_color,
            fg=self.fg_color,
            selectbackground=self.accent_color
        )
        self.lap_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        
        scrollbar.config(command=self.lap_listbox.yview)
        
        # 圈数按钮
        lap_btn_frame = tk.Frame(lap_frame, bg=self.bg_color)
        lap_btn_frame.pack(pady=5)
        
        self.lap_btn = tk.Button(
            lap_btn_frame,
            text="记录圈数",
            command=self.record_lap,
            bg=self.secondary_color,
            fg=self.fg_color,
            padx=10,
            pady=5,
            state=tk.DISABLED
        )
        self.lap_btn.pack()
        
    def create_timer_tab(self):
        """创建计时器标签页"""
        self.timer_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.timer_tab, text='计时器')
        
        timer_frame = tk.Frame(self.timer_tab, bg=self.bg_color)
        timer_frame.pack(expand=True, fill=tk.BOTH, padx=20, pady=20)
        
        # 时间设置
        time_set_frame = tk.Frame(timer_frame, bg=self.bg_color)
        time_set_frame.pack(pady=20)
        
        # 小时
        tk.Label(
            time_set_frame,
            text="小时:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.timer_hour = tk.Spinbox(
            time_set_frame,
            from_=0,
            to=23,
            width=5,
            font=('Arial', 12)
        )
        self.timer_hour.pack(side=tk.LEFT, padx=5)
        self.timer_hour.delete(0, tk.END)
        self.timer_hour.insert(0, "0")
        
        # 分钟
        tk.Label(
            time_set_frame,
            text="分钟:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.timer_minute = tk.Spinbox(
            time_set_frame,
            from_=0,
            to=59,
            width=5,
            font=('Arial', 12)
        )
        self.timer_minute.pack(side=tk.LEFT, padx=5)
        self.timer_minute.delete(0, tk.END)
        self.timer_minute.insert(0, "0")
        
        # 秒
        tk.Label(
            time_set_frame,
            text="秒:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.timer_second = tk.Spinbox(
            time_set_frame,
            from_=0,
            to=59,
            width=5,
            font=('Arial', 12)
        )
        self.timer_second.pack(side=tk.LEFT, padx=5)
        self.timer_second.delete(0, tk.END)
        self.timer_second.insert(0, "10")
        
        # 计时器显示
        self.timer_display = tk.Label(
            timer_frame,
            text="00:00:00",
            font=('Courier', 48, 'bold'),
            fg=self.accent_color,
            bg=self.bg_color
        )
        self.timer_display.pack(pady=20)
        
        # 控制按钮
        btn_frame = tk.Frame(timer_frame, bg=self.bg_color)
        btn_frame.pack(pady=20)
        
        self.start_timer_btn = tk.Button(
            btn_frame,
            text="开始",
            command=self.start_timer,
            bg=self.success_color,
            fg='white',
            font=('Arial', 12, 'bold'),
            width=10,
            padx=15,
            pady=8
        )
        self.start_timer_btn.pack(side=tk.LEFT, padx=5)
        
        self.pause_timer_btn = tk.Button(
            btn_frame,
            text="暂停",
            command=self.pause_timer,
            bg=self.secondary_color,
            fg='white',
            font=('Arial', 12, 'bold'),
            width=10,
            padx=15,
            pady=8,
            state=tk.DISABLED
        )
        self.pause_timer_btn.pack(side=tk.LEFT, padx=5)
        
        self.reset_timer_btn = tk.Button(
            btn_frame,
            text="重置",
            command=self.reset_timer,
            bg=self.secondary_color,
            fg='white',
            font=('Arial', 12, 'bold'),
            width=10,
            padx=15,
            pady=8
        )
        self.reset_timer_btn.pack(side=tk.LEFT, padx=5)
        
        # 预设时间
        preset_frame = tk.Frame(timer_frame, bg=self.bg_color)
        preset_frame.pack(pady=20)
        
        tk.Label(
            preset_frame,
            text="预设时间:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        presets = ["1分钟", "5分钟", "10分钟", "15分钟", "30分钟", "1小时"]
        for preset in presets:
            btn = tk.Button(
                preset_frame,
                text=preset,
                command=lambda p=preset: self.set_preset_time(p),
                bg=self.secondary_color,
                fg=self.fg_color,
                padx=10,
                pady=5
            )
            btn.pack(side=tk.LEFT, padx=2)
            
    def create_alarm_tab(self):
        """创建闹钟标签页"""
        self.alarm_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.alarm_tab, text='闹钟')
        
        alarm_frame = tk.Frame(self.alarm_tab, bg=self.bg_color)
        alarm_frame.pack(expand=True, fill=tk.BOTH, padx=20, pady=20)
        
        # 添加闹钟区域
        add_frame = tk.Frame(alarm_frame, bg=self.bg_color)
        add_frame.pack(fill=tk.X, pady=10)
        
        # 时间选择
        time_frame = tk.Frame(add_frame, bg=self.bg_color)
        time_frame.pack(pady=5)
        
        tk.Label(
            time_frame,
            text="时间:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.alarm_hour = tk.Spinbox(
            time_frame,
            from_=0,
            to=23,
            width=5,
            font=('Arial', 12)
        )
        self.alarm_hour.pack(side=tk.LEFT, padx=5)
        
        tk.Label(
            time_frame,
            text=":",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT)
        
        self.alarm_minute = tk.Spinbox(
            time_frame,
            from_=0,
            to=59,
            width=5,
            font=('Arial', 12)
        )
        self.alarm_minute.pack(side=tk.LEFT, padx=5)
        
        # 重复选项
        repeat_frame = tk.Frame(add_frame, bg=self.bg_color)
        repeat_frame.pack(pady=5)
        
        tk.Label(
            repeat_frame,
            text="重复:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.repeat_days = []
        days = ["日", "一", "二", "三", "四", "五", "六"]
        for i, day in enumerate(days):
            var = tk.BooleanVar()
            chk = tk.Checkbutton(
                repeat_frame,
                text=day,
                variable=var,
                bg=self.bg_color,
                fg=self.fg_color,
                selectcolor=self.accent_color
            )
            chk.pack(side=tk.LEFT, padx=2)
            self.repeat_days.append(var)
        
        # 铃声选择
        sound_frame = tk.Frame(add_frame, bg=self.bg_color)
        sound_frame.pack(pady=5)
        
        tk.Label(
            sound_frame,
            text="铃声:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.alarm_sound = tk.StringVar(value="默认")
        sounds = ["默认", "蜂鸣", "叮咚", "闹钟"]
        sound_combo = ttk.Combobox(
            sound_frame,
            textvariable=self.alarm_sound,
            values=sounds,
            width=15
        )
        sound_combo.pack(side=tk.LEFT, padx=5)
        
        # 标签
        label_frame = tk.Frame(add_frame, bg=self.bg_color)
        label_frame.pack(pady=5)
        
        tk.Label(
            label_frame,
            text="标签:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.alarm_label = tk.Entry(
            label_frame,
            width=20,
            font=('Arial', 12)
        )
        self.alarm_label.pack(side=tk.LEFT, padx=5)
        
        # 添加按钮
        add_btn = tk.Button(
            add_frame,
            text="添加闹钟",
            command=self.add_alarm,
            bg=self.success_color,
            fg='white',
            font=('Arial', 12, 'bold'),
            padx=20,
            pady=8
        )
        add_btn.pack(pady=10)
        
        # 闹钟列表
        list_frame = tk.Frame(alarm_frame, bg=self.bg_color)
        list_frame.pack(fill=tk.BOTH, expand=True, pady=10)
        
        # 创建Treeview
        columns = ("时间", "重复", "标签", "状态", "操作")
        self.alarm_tree = ttk.Treeview(
            list_frame,
            columns=columns,
            show="headings",
            height=8
        )
        
        # 设置列
        for col in columns:
            self.alarm_tree.heading(col, text=col)
            self.alarm_tree.column(col, width=100)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.alarm_tree.yview)
        self.alarm_tree.configure(yscrollcommand=scrollbar.set)
        
        self.alarm_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
    def create_world_time_tab(self):
        """创建世界时间标签页"""
        self.world_time_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.world_time_tab, text='世界时间')
        
        world_frame = tk.Frame(self.world_time_tab, bg=self.bg_color)
        world_frame.pack(expand=True, fill=tk.BOTH, padx=20, pady=20)
        
        # 城市选择
        city_frame = tk.Frame(world_frame, bg=self.bg_color)
        city_frame.pack(fill=tk.X, pady=10)
        
        tk.Label(
            city_frame,
            text="添加城市:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)
        
        self.city_combo = ttk.Combobox(
            city_frame,
            values=list(self.world_time_zones.keys()),
            width=15
        )
        self.city_combo.pack(side=tk.LEFT, padx=5)
        
        add_city_btn = tk.Button(
            city_frame,
            text="添加",
            command=self.add_city_time,
            bg=self.secondary_color,
            fg=self.fg_color,
            padx=10,
            pady=5
        )
        add_city_btn.pack(side=tk.LEFT, padx=5)
        
        # 时间显示区域
        self.world_time_frame = tk.Frame(world_frame, bg=self.bg_color)
        self.world_time_frame.pack(fill=tk.BOTH, expand=True, pady=10)
        
        # 初始化显示本地时间
        self.add_city_time("北京")
        
    def create_calendar_tab(self):
        """创建日历标签页"""
        self.calendar_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.calendar_tab, text='日历')
        
        calendar_frame = tk.Frame(self.calendar_tab, bg=self.bg_color)
        calendar_frame.pack(expand=True, fill=tk.BOTH, padx=20, pady=20)
        
        # 月份选择
        month_frame = tk.Frame(calendar_frame, bg=self.bg_color)
        month_frame.pack(fill=tk.X, pady=10)
        
        self.prev_month_btn = tk.Button(
            month_frame,
            text="上个月",
            command=self.prev_month,
            bg=self.secondary_color,
            fg=self.fg_color
        )
        self.prev_month_btn.pack(side=tk.LEFT, padx=5)
        
        self.month_year_label = tk.Label(
            month_frame,
            text="",
            font=('Arial', 16, 'bold'),
            fg=self.fg_color,
            bg=self.bg_color
        )
        self.month_year_label.pack(side=tk.LEFT, expand=True)
        
        self.next_month_btn = tk.Button(
            month_frame,
            text="下个月",
            command=self.next_month,
            bg=self.secondary_color,
            fg=self.fg_color
        )
        self.next_month_btn.pack(side=tk.RIGHT, padx=5)
        
        # 日历显示区域
        self.calendar_frame = tk.Frame(calendar_frame, bg=self.bg_color)
        self.calendar_frame.pack(fill=tk.BOTH, expand=True, pady=10)
        
        # 初始化日历
        self.current_date = datetime.datetime.now()
        self.update_calendar()
        
    def create_status_bar(self):
        """创建状态栏"""
        status_frame = tk.Frame(self.main_frame, bg=self.secondary_color, height=25)
        status_frame.pack(fill=tk.X, pady=(10, 0))
        status_frame.pack_propagate(False)
        
        # 当前选项卡
        self.tab_label = tk.Label(
            status_frame,
            text="时钟",
            fg=self.fg_color,
            bg=self.secondary_color
        )
        self.tab_label.pack(side=tk.LEFT, padx=10)
        
        # 分隔符
        tk.Label(
            status_frame,
            text="|",
            fg=self.fg_color,
            bg=self.secondary_color
        ).pack(side=tk.LEFT, padx=5)
        
        # 内存使用
        self.memory_label = tk.Label(
            status_frame,
            text="",
            fg=self.fg_color,
            bg=self.secondary_color
        )
        self.memory_label.pack(side=tk.LEFT, padx=10)
        
        # 系统时间
        self.system_time_label = tk.Label(
            status_frame,
            text="",
            fg=self.fg_color,
            bg=self.secondary_color
        )
        self.system_time_label.pack(side=tk.RIGHT, padx=10)
        
        # 更新选项卡标签
        self.tab_control.bind("<<NotebookTabChanged>>", self.update_tab_label)
        
    def update_clock(self):
        """更新时钟显示"""
        if not self.is_running:
            return
            
        # 获取当前时间
        now = datetime.datetime.now()
        
        # 更新时钟显示
        time_str = now.strftime("%H:%M:%S")
        self.time_label.config(text=time_str)
        
        # 更新日期显示
        date_str = now.strftime("%Y年%m月%d日")
        self.date_label.config(text=date_str)
        
        # 更新星期显示
        weekday_str = f"星期{['一', '二', '三', '四', '五', '六', '日'][now.weekday()]}"
        self.weekday_label.config(text=weekday_str)
        
        # 更新秒针圆弧
        self.update_second_arc(now.second)
        
        # 更新系统时间
        system_time_str = now.strftime("%Y-%m-%d %H:%M:%S")
        self.system_time_label.config(text=f"系统时间: {system_time_str}")
        
        # 检查闹钟
        self.check_alarms(now)
        
        # 更新计时器
        if self.timer_running:
            self.update_timer()
            
        # 更新秒表
        if self.stopwatch_running:
            self.update_stopwatch()
            
        # 更新世界时间
        self.update_world_times()
        
        # 100ms后再次更新
        self.root.after(100, self.update_clock)
        
    def update_second_arc(self, second):
        """更新秒针圆弧"""
        self.second_canvas.delete("all")
        
        # 绘制外圆
        center_x, center_y, radius = 100, 100, 90
        self.second_canvas.create_oval(
            center_x - radius,
            center_y - radius,
            center_x + radius,
            center_y + radius,
            outline=self.secondary_color,
            width=2
        )
        
        # 绘制刻度
        for i in range(60):
            angle = i * 6  # 每个刻度6度
            rad = math.radians(angle - 90)  # 从顶部开始
            start_x = center_x + (radius - 5) * math.cos(rad)
            start_y = center_y + (radius - 5) * math.sin(rad)
            end_x = center_x + radius * math.cos(rad)
            end_y = center_y + radius * math.sin(rad)
            
            if i % 5 == 0:  # 每5个刻度
                self.second_canvas.create_line(
                    start_x, start_y, end_x, end_y,
                    fill=self.fg_color, width=2
                )
            else:
                self.second_canvas.create_line(
                    start_x, start_y, end_x, end_y,
                    fill=self.secondary_color, width=1
                )
        
        # 绘制秒针
        if second > 0:
            angle = second * 6  # 每秒钟6度
            rad = math.radians(angle - 90)  # 从顶部开始
            end_x = center_x + (radius - 10) * math.cos(rad)
            end_y = center_y + (radius - 10) * math.sin(rad)
            
            self.second_canvas.create_line(
                center_x, center_y, end_x, end_y,
                fill=self.accent_color, width=3, arrow=tk.LAST
            )
        
        # 显示秒数
        self.second_canvas.create_text(
            center_x, center_y,
            text=f"{second:02d}",
            font=('Arial', 20, 'bold'),
            fill=self.accent_color
        )
        
    def update_font_size(self, value):
        """更新字体大小"""
        self.time_label.config(font=('Courier', int(value), 'bold'))
        
    def choose_clock_color(self):
        """选择时钟颜色"""
        color = colorchooser.askcolor(title="选择时钟颜色", initialcolor=self.accent_color)
        if color[1]:
            self.accent_color = color[1]
            self.time_label.config(fg=color[1])
            
    def start_stopwatch(self):
        """开始秒表"""
        if not self.stopwatch_running:
            self.stopwatch_running = True
            self.stopwatch_start_time = time.time() - self.stopwatch_time
            self.start_stopwatch_btn.config(state=tk.DISABLED)
            self.pause_stopwatch_btn.config(state=tk.NORMAL)
            self.lap_btn.config(state=tk.NORMAL)
            
    def pause_stopwatch(self):
        """暂停秒表"""
        if self.stopwatch_running:
            self.stopwatch_running = False
            self.start_stopwatch_btn.config(state=tk.NORMAL)
            self.pause_stopwatch_btn.config(state=tk.DISABLED)
            
    def reset_stopwatch(self):
        """重置秒表"""
        self.stopwatch_running = False
        self.stopwatch_time = 0
        self.stopwatch_label.config(text="00:00:00.00")
        self.start_stopwatch_btn.config(state=tk.NORMAL)
        self.pause_stopwatch_btn.config(state=tk.DISABLED)
        self.lap_btn.config(state=tk.DISABLED)
        self.lap_listbox.delete(0, tk.END)
        
    def update_stopwatch(self):
        """更新秒表显示"""
        if self.stopwatch_running:
            elapsed = time.time() - self.stopwatch_start_time
            self.stopwatch_time = elapsed
            
            # 格式化时间
            hours = int(elapsed // 3600)
            minutes = int((elapsed % 3600) // 60)
            seconds = int(elapsed % 60)
            milliseconds = int((elapsed % 1) * 100)
            
            time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:02d}"
            self.stopwatch_label.config(text=time_str)
            
    def record_lap(self):
        """记录圈数"""
        if self.stopwatch_running:
            lap_time = time.time() - self.stopwatch_start_time
            lap_count = self.lap_listbox.size() + 1
            
            # 格式化圈时间
            hours = int(lap_time // 3600)
            minutes = int((lap_time % 3600) // 60)
            seconds = int(lap_time % 60)
            milliseconds = int((lap_time % 1) * 100)
            
            lap_str = f"圈数 {lap_count:02d}: {hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:02d}"
            self.lap_listbox.insert(tk.END, lap_str)
            self.lap_listbox.yview(tk.END)
            
    def start_timer(self):
        """开始计时器"""
        if not self.timer_running:
            # 获取设置的时间
            try:
                hours = int(self.timer_hour.get())
                minutes = int(self.timer_minute.get())
                seconds = int(self.timer_second.get())
                self.timer_set_time = hours * 3600 + minutes * 60 + seconds
                
                if self.timer_set_time <= 0:
                    messagebox.showwarning("警告", "请设置有效的时间")
                    return
                    
                self.timer_time = self.timer_set_time
                self.timer_running = True
                self.start_timer_btn.config(state=tk.DISABLED)
                self.pause_timer_btn.config(state=tk.NORMAL)
                self.update_timer_display()
                
            except ValueError:
                messagebox.showerror("错误", "请输入有效的数字")
                
    def pause_timer(self):
        """暂停计时器"""
        if self.timer_running:
            self.timer_running = False
            self.start_timer_btn.config(state=tk.NORMAL)
            self.pause_timer_btn.config(state=tk.DISABLED)
            
    def reset_timer(self):
        """重置计时器"""
        self.timer_running = False
        self.timer_time = 0
        self.timer_display.config(text="00:00:00", fg=self.accent_color)
        self.start_timer_btn.config(state=tk.NORMAL)
        self.pause_timer_btn.config(state=tk.DISABLED)
        
    def update_timer(self):
        """更新计时器"""
        if self.timer_running and self.timer_time > 0:
            self.timer_time -= 0.1
            
            if self.timer_time <= 0:
                self.timer_time = 0
                self.timer_running = False
                self.timer_finished()
                
            self.update_timer_display()
            
    def update_timer_display(self):
        """更新计时器显示"""
        hours = int(self.timer_time // 3600)
        minutes = int((self.timer_time % 3600) // 60)
        seconds = int(self.timer_time % 60)
        
        time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
        
        # 最后10秒变红色
        if self.timer_time <= 10:
            self.timer_display.config(text=time_str, fg=self.alert_color)
        else:
            self.timer_display.config(text=time_str, fg=self.accent_color)
            
    def timer_finished(self):
        """计时器结束"""
        if platform.system() == "Windows":
            import winsound
            for _ in range(3):
                winsound.Beep(1000, 300)
        messagebox.showinfo("计时器", "时间到！")
        self.reset_timer()
        
    def set_preset_time(self, preset):
        """设置预设时间"""
        if preset == "1分钟":
            self.timer_minute.delete(0, tk.END)
            self.timer_minute.insert(0, "1")
            self.timer_second.delete(0, tk.END)
            self.timer_second.insert(0, "0")
        elif preset == "5分钟":
            self.timer_minute.delete(0, tk.END)
            self.timer_minute.insert(0, "5")
            self.timer_second.delete(0, tk.END)
            self.timer_second.insert(0, "0")
        elif preset == "10分钟":
            self.timer_minute.delete(0, tk.END)
            self.timer_minute.insert(0, "10")
            self.timer_second.delete(0, tk.END)
            self.timer_second.insert(0, "0")
        elif preset == "15分钟":
            self.timer_minute.delete(0, tk.END)
            self.timer_minute.insert(0, "15")
            self.timer_second.delete(0, tk.END)
            self.timer_second.insert(0, "0")
        elif preset == "30分钟":
            self.timer_minute.delete(0, tk.END)
            self.timer_minute.insert(0, "30")
            self.timer_second.delete(0, tk.END)
            self.timer_second.insert(0, "0")
        elif preset == "1小时":
            self.timer_hour.delete(0, tk.END)
            self.timer_hour.insert(0, "1")
            self.timer_minute.delete(0, tk.END)
            self.timer_minute.insert(0, "0")
            self.timer_second.delete(0, tk.END)
            self.timer_second.insert(0, "0")
            
    def add_alarm(self):
        """添加闹钟"""
        try:
            hour = int(self.alarm_hour.get())
            minute = int(self.alarm_minute.get())
            
            if not (0 <= hour <= 23 and 0 <= minute <= 59):
                messagebox.showerror("错误", "请输入有效的时间")
                return
                
            # 获取重复设置
            repeat_days = []
            for i, var in enumerate(self.repeat_days):
                if var.get():
                    repeat_days.append(i)
                    
            # 获取铃声
            sound = self.alarm_sound.get()
            
            # 获取标签
            label = self.alarm_label.get() or "闹钟"
            
            # 创建闹钟字典
            alarm = {
                "hour": hour,
                "minute": minute,
                "repeat": repeat_days,
                "sound": sound,
                "label": label,
                "enabled": True
            }
            
            # 添加到列表
            self.alarms.append(alarm)
            
            # 添加到Treeview
            repeat_str = "每天" if len(repeat_days) == 7 else " ".join(str(d) for d in repeat_days) if repeat_days else "不重复"
            time_str = f"{hour:02d}:{minute:02d}"
            
            values = (time_str, repeat_str, label, "启用", "删除")
            item = self.alarm_tree.insert("", tk.END, values=values)
            
            # 添加删除按钮
            self.alarm_tree.item(item, tags=(item,))
            self.alarm_tree.tag_bind(item, '<Double-1>', lambda e, a=alarm, i=item: self.toggle_alarm(a, i))
            
            # 清空输入
            self.alarm_hour.delete(0, tk.END)
            self.alarm_minute.delete(0, tk.END)
            self.alarm_label.delete(0, tk.END)
            
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字")
            
    def toggle_alarm(self, alarm, item):
        """切换闹钟状态"""
        alarm["enabled"] = not alarm["enabled"]
        status = "启用" if alarm["enabled"] else "禁用"
        
        # 更新Treeview
        values = self.alarm_tree.item(item, "values")
        new_values = list(values)
        new_values[3] = status
        self.alarm_tree.item(item, values=new_values)
        
    def check_alarms(self, now):
        """检查闹钟"""
        current_hour = now.hour
        current_minute = now.minute
        current_second = now.second
        current_weekday = now.weekday()  # 0=周一, 6=周日
        
        for alarm in self.alarms:
            if not alarm["enabled"]:
                continue
                
            if (current_hour == alarm["hour"] and 
                current_minute == alarm["minute"] and 
                current_second == 0):
                
                # 检查重复设置
                repeat_days = alarm["repeat"]
                if not repeat_days or (current_weekday + 1) % 7 in repeat_days:  # 转换为周日=0
                    self.trigger_alarm(alarm)
                    
    def trigger_alarm(self, alarm):
        """触发闹钟"""
        # 播放声音
        if platform.system() == "Windows":
            import winsound
            sound_type = alarm.get("sound", "默认")
            if sound_type == "默认":
                winsound.Beep(1000, 1000)
            elif sound_type == "蜂鸣":
                for _ in range(3):
                    winsound.Beep(800, 200)
                    time.sleep(0.2)
            elif sound_type == "叮咚":
                winsound.Beep(523, 300)
                winsound.Beep(659, 300)
            elif sound_type == "闹钟":
                for _ in range(5):
                    winsound.Beep(880, 200)
                    time.sleep(0.1)
        
        # 显示提示
        message = f"闹钟时间到！\n{alarm['label']}\n{alarm['hour']:02d}:{alarm['minute']:02d}"
        
        # 创建弹窗
        popup = tk.Toplevel(self.root)
        popup.title("闹钟")
        popup.geometry("300x150")
        popup.configure(bg=self.alert_color)
        
        # 设置置顶
        popup.attributes('-topmost', True)
        
        # 添加内容
        tk.Label(
            popup,
            text="闹钟",
            font=('Arial', 20, 'bold'),
            bg=self.alert_color,
            fg='white'
        ).pack(pady=10)
        
        tk.Label(
            popup,
            text=alarm['label'],
            font=('Arial', 16),
            bg=self.alert_color,
            fg='white'
        ).pack()
        
        tk.Label(
            popup,
            text=f"{alarm['hour']:02d}:{alarm['minute']:02d}",
            font=('Arial', 24, 'bold'),
            bg=self.alert_color,
            fg='white'
        ).pack(pady=10)
        
        # 关闭按钮
        close_btn = tk.Button(
            popup,
            text="关闭",
            command=popup.destroy,
            bg='white',
            fg=self.alert_color,
            font=('Arial', 12, 'bold'),
            padx=20,
            pady=5
        )
        close_btn.pack(pady=10)
        
    def add_city_time(self, city=None):
        """添加城市时间"""
        if city is None:
            city = self.city_combo.get()
            if not city:
                return
                
        if city in self.world_time_zones:
            # 创建城市时间显示框架
            city_frame = tk.Frame(self.world_time_frame, bg=self.bg_color)
            city_frame.pack(fill=tk.X, pady=5, padx=20)
            
            # 城市标签
            city_label = tk.Label(
                city_frame,
                text=city,
                font=('Arial', 14, 'bold'),
                fg=self.fg_color,
                bg=self.bg_color,
                width=15
            )
            city_label.pack(side=tk.LEFT)
            
            # 时间标签
            time_label = tk.Label(
                city_frame,
                text="00:00:00",
                font=('Courier', 20),
                fg=self.accent_color,
                bg=self.bg_color
            )
            time_label.pack(side=tk.LEFT, padx=20)
            
            # 时区
            timezone = self.world_time_zones[city]
            timezone_label = tk.Label(
                city_frame,
                text=f"UTC{timezone:+d}",
                font=('Arial', 12),
                fg=self.success_color,
                bg=self.bg_color
            )
            timezone_label.pack(side=tk.LEFT)
            
            # 保存引用
            if not hasattr(self, 'world_cities'):
                self.world_cities = []
                
            self.world_cities.append({
                'city': city,
                'timezone': timezone,
                'label': time_label
            })
            
    def update_world_times(self):
        """更新世界时间"""
        if hasattr(self, 'world_cities'):
            now = datetime.datetime.utcnow()
            
            for city_info in self.world_cities:
                city_time = now + datetime.timedelta(hours=city_info['timezone'])
                time_str = city_time.strftime("%H:%M:%S")
                city_info['label'].config(text=time_str)
                
    def update_calendar(self):
        """更新日历"""
        # 清除旧的日历
        for widget in self.calendar_frame.winfo_children():
            widget.destroy()
            
        # 更新月份年份标签
        month_year = self.current_date.strftime("%Y年%m月")
        self.month_year_label.config(text=month_year)
        
        # 获取日历
        year = self.current_date.year
        month = self.current_date.month
        
        cal = calendar.monthcalendar(year, month)
        
        # 创建星期标题
        days = ["一", "二", "三", "四", "五", "六", "日"]
        for i, day in enumerate(days):
            day_label = tk.Label(
                self.calendar_frame,
                text=day,
                font=('Arial', 12, 'bold'),
                fg=self.accent_color,
                bg=self.bg_color,
                width=4
            )
            day_label.grid(row=0, column=i, padx=2, pady=2)
        
        # 填充日期
        today = datetime.datetime.now()
        today_date = today.day
        today_month = today.month
        today_year = today.year
        
        for week_num, week in enumerate(cal, start=1):
            for day_num, day in enumerate(week):
                if day != 0:
                    # 检查是否是今天
                    is_today = (day == today_date and 
                               month == today_month and 
                               year == today_year)
                    
                    bg_color = self.accent_color if is_today else self.secondary_color
                    fg_color = 'white' if is_today else self.fg_color
                    
                    day_label = tk.Label(
                        self.calendar_frame,
                        text=str(day),
                        font=('Arial', 12, 'bold'),
                        fg=fg_color,
                        bg=bg_color,
                        width=4,
                        height=2
                    )
                    day_label.grid(row=week_num, column=day_num, padx=2, pady=2)
                    
    def prev_month(self):
        """上个月"""
        self.current_date = self.current_date.replace(day=1)
        self.current_date -= datetime.timedelta(days=1)
        self.update_calendar()
        
    def next_month(self):
        """下个月"""
        self.current_date = self.current_date.replace(day=28)
        self.current_date += datetime.timedelta(days=5)
        self.current_date = self.current_date.replace(day=1)
        self.update_calendar()
        
    def toggle_fullscreen(self):
        """切换全屏"""
        self.is_fullscreen = not self.is_fullscreen
        self.root.attributes('-fullscreen', self.is_fullscreen)
        
        if self.is_fullscreen:
            self.fullscreen_btn.config(text="退出全屏")
        else:
            self.fullscreen_btn.config(text="全屏")
            
    def open_settings(self):
        """打开设置"""
        settings_window = tk.Toplevel(self.root)
        settings_window.title("设置")
        settings_window.geometry("400x500")
        settings_window.configure(bg=self.bg_color)
        
        # 设置置顶
        settings_window.transient(self.root)
        settings_window.grab_set()
        
        # 设置标题
        tk.Label(
            settings_window,
            text="设置",
            font=('Arial', 18, 'bold'),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(pady=20)
        
        # 主题设置
        theme_frame = tk.Frame(settings_window, bg=self.bg_color)
        theme_frame.pack(fill=tk.X, padx=20, pady=10)
        
        tk.Label(
            theme_frame,
            text="主题颜色:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT)
        
        themes = ["深色", "浅色", "蓝色", "绿色"]
        theme_combo = ttk.Combobox(theme_frame, values=themes, width=15)
        theme_combo.set("深色")
        theme_combo.pack(side=tk.RIGHT)
        
        # 闹钟设置
        alarm_frame = tk.Frame(settings_window, bg=self.bg_color)
        alarm_frame.pack(fill=tk.X, padx=20, pady=10)
        
        tk.Label(
            alarm_frame,
            text="默认闹钟时长:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT)
        
        alarm_duration = tk.Spinbox(
            alarm_frame,
            from_=1,
            to=60,
            width=5
        )
        alarm_duration.delete(0, tk.END)
        alarm_duration.insert(0, "5")
        alarm_duration.pack(side=tk.RIGHT)
        
        # 时钟格式
        format_frame = tk.Frame(settings_window, bg=self.bg_color)
        format_frame.pack(fill=tk.X, padx=20, pady=10)
        
        self.clock_format_var = tk.StringVar(value="24小时制")
        
        tk.Label(
            format_frame,
            text="时间格式:",
            font=('Arial', 12),
            fg=self.fg_color,
            bg=self.bg_color
        ).pack(side=tk.LEFT)
        
        format_12 = tk.Radiobutton(
            format_frame,
            text="12小时制",
            variable=self.clock_format_var,
            value="12小时制",
            bg=self.bg_color,
            fg=self.fg_color
        )
        format_12.pack(side=tk.RIGHT, padx=10)
        
        format_24 = tk.Radiobutton(
            format_frame,
            text="24小时制",
            variable=self.clock_format_var,
            value="24小时制",
            bg=self.bg_color,
            fg=self.fg_color
        )
        format_24.pack(side=tk.RIGHT, padx=10)
        
        # 自动启动
        auto_frame = tk.Frame(settings_window, bg=self.bg_color)
        auto_frame.pack(fill=tk.X, padx=20, pady=10)
        
        self.auto_start_var = tk.BooleanVar(value=False)
        
        auto_check = tk.Checkbutton(
            auto_frame,
            text="开机自动启动",
            variable=self.auto_start_var,
            bg=self.bg_color,
            fg=self.fg_color
        )
        auto_check.pack(side=tk.LEFT)
        
        # 保存按钮
        save_frame = tk.Frame(settings_window, bg=self.bg_color)
        save_frame.pack(fill=tk.X, padx=20, pady=30)
        
        save_btn = tk.Button(
            save_frame,
            text="保存设置",
            command=lambda: self.save_settings(settings_window),
            bg=self.success_color,
            fg='white',
            font=('Arial', 12, 'bold'),
            padx=20,
            pady=10
        )
        save_btn.pack()
        
    def save_settings(self, window):
        """保存设置"""
        messagebox.showinfo("设置", "设置已保存")
        window.destroy()
        
    def show_about(self):
        """显示关于信息"""
        about_text = """
多功能桌面时钟 v2.0

功能特点：
• 数字时钟显示
• 秒表功能
• 计时器功能
• 闹钟系统
• 世界时间
• 日历查看
• 自定义主题

开发者：多功能时钟团队
版本：2.0.0
更新时间：2024年
        """
        
        messagebox.showinfo("关于", about_text)
        
    def update_tab_label(self, event):
        """更新选项卡标签"""
        tab_names = ["时钟", "秒表", "计时器", "闹钟", "世界时间", "日历"]
        current_tab = self.tab_control.index("current")
        self.tab_label.config(text=tab_names[current_tab])
        
    def load_settings(self):
        """加载设置"""
        try:
            if os.path.exists("clock_settings.json"):
                with open("clock_settings.json", "r", encoding="utf-8") as f:
                    settings = json.load(f)
                    
                # 应用设置
                if "accent_color" in settings:
                    self.accent_color = settings["accent_color"]
                    self.time_label.config(fg=self.accent_color)
                    
        except Exception as e:
            print(f"加载设置失败: {e}")
            
    def save_all_settings(self):
        """保存所有设置"""
        settings = {
            "accent_color": self.accent_color,
            "font_size": self.font_size_var.get()
        }
        
        try:
            with open("clock_settings.json", "w", encoding="utf-8") as f:
                json.dump(settings, f, ensure_ascii=False, indent=2)
        except Exception as e:
            print(f"保存设置失败: {e}")
            
    def on_closing(self):
        """窗口关闭事件"""
        self.is_running = False
        self.save_all_settings()
        self.root.destroy()

def main():
    root = tk.Tk()
    
    # 设置窗口居中
    window_width = 1000
    window_height = 700
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    
    center_x = int(screen_width/2 - window_width/2)
    center_y = int(screen_height/2 - window_height/2)
    
    root.geometry(f'{window_width}x{window_height}+{center_x}+{center_y}')
    
    app = DesktopClock(root)
    root.mainloop()

if __name__ == "__main__":
    main()