import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import json
import random
from datetime import datetime

class TangPoetryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("唐诗三百首")
        self.root.geometry("1000x700")
        
        # 唐诗数据
        self.poems = self.load_poetry_data()
        
        # 收藏夹
        self.favorites = []
        self.load_favorites()
        
        # 当前主题
        self.current_theme = "light"
        
        # 创建界面
        self.create_widgets()
        
        # 显示第一首诗
        if self.poems:
            self.display_poem(0)
    
    def load_poetry_data(self):
        """加载唐诗数据"""
        # 这里是一个简化的示例，实际应用中可以从文件或数据库加载
        poems = [
            {
                "id": 1,
                "title": "静夜思",
                "author": "李白",
                "dynasty": "唐",
                "content": "床前明月光，\n疑是地上霜。\n举头望明月，\n低头思故乡。",
                "translation": "明亮的月光洒在窗户纸上，\n好像地上泛起了一层霜。\n我禁不住抬起头来，\n看那窗外空中的一轮明月，\n不由得低头沉思，想起远方的家乡。",
                "appreciation": "这首诗写的是在寂静的月夜思念家乡的感受。诗的前两句，是写诗人在作客他乡的特定环境中一刹那间所产生的错觉。后两句通过动作神态的刻画，深化思乡之情。",
                "tags": ["思乡", "月亮", "夜晚"]
            },
            {
                "id": 2,
                "title": "春晓",
                "author": "孟浩然",
                "dynasty": "唐",
                "content": "春眠不觉晓，\n处处闻啼鸟。\n夜来风雨声，\n花落知多少。",
                "translation": "春日里贪睡不知不觉天已破晓，\n搅乱我酣眠的是那啁啾的小鸟。\n昨天夜里风声雨声一直不断，\n那娇美的春花不知被吹落了多少？",
                "appreciation": "这首诗是唐代诗人孟浩然的作品，表达了诗人对春天的热爱和怜惜之情。前两句写诗人因春宵梦酣，天已大亮了还不知道。后两句写诗人醒来后，想到昨夜的风雨，为花木担忧。",
                "tags": ["春天", "自然", "闲适"]
            },
            {
                "id": 3,
                "title": "登鹳雀楼",
                "author": "王之涣",
                "dynasty": "唐",
                "content": "白日依山尽，\n黄河入海流。\n欲穷千里目，\n更上一层楼。",
                "translation": "夕阳依傍着西山慢慢地沉没，\n滔滔黄河朝着东海汹涌奔流。\n若想把千里的风光景物看够，\n那就要登上更高的一层城楼。",
                "appreciation": "这首诗写诗人在登高望远中表现出来的不凡的胸襟抱负，反映了盛唐时期人们积极向上的进取精神。前两句写所见，后两句写所思，把哲理与景物、情势溶化得天衣无缝。",
                "tags": ["登高", "哲理", "壮阔"]
            },
            {
                "id": 4,
                "title": "相思",
                "author": "王维",
                "dynasty": "唐",
                "content": "红豆生南国，\n春来发几枝。\n愿君多采撷，\n此物最相思。",
                "translation": "鲜红浑圆的红豆，生长在阳光明媚的南方，\n春暖花开的季节，不知又生出多少？\n希望思念的人儿多多采集，\n小小红豆引人相思。",
                "appreciation": "这是借咏物而寄相思的诗，是眷怀友人之作。全诗洋溢着少年的热情，青春的气息，满腹情思始终未曾直接表白，句句话儿不离红豆，而又超以象外，得其圜中，把相思之情表达得入木三分。",
                "tags": ["相思", "爱情", "友情"]
            },
            {
                "id": 5,
                "title": "悯农",
                "author": "李绅",
                "dynasty": "唐",
                "content": "锄禾日当午，\n汗滴禾下土。\n谁知盘中餐，\n粒粒皆辛苦。",
                "translation": "农民在正午烈日的暴晒下锄禾，\n汗水从身上滴在禾苗生长的土地上。\n又有谁知道盘中的饭食，\n每颗每粒都是农民用辛勤的劳动换来的呢？",
                "appreciation": "这首诗描绘了在烈日当空的正午农民田里劳作的景象，概括地表现了农民终年辛勤劳动的生活，最后以语近意深的格言，表达了诗人对农民真挚的同情之心。",
                "tags": ["农民", "劳动", "节俭"]
            },
            {
                "id": 6,
                "title": "望庐山瀑布",
                "author": "李白",
                "dynasty": "唐",
                "content": "日照香炉生紫烟，\n遥看瀑布挂前川。\n飞流直下三千尺，\n疑是银河落九天。",
                "translation": "香炉峰在阳光的照射下生起紫色烟霞，\n远远望见瀑布似白色绢绸悬挂在山前。\n高崖上飞腾直落的瀑布好像有几千尺，\n让人恍惚以为银河从天上泻落到人间。",
                "appreciation": "这是诗人李白五十岁左右隐居庐山时写的一首风景诗。这首诗形象地描绘了庐山瀑布雄奇壮丽的景色，反映了诗人对祖国大好河山的无限热爱。",
                "tags": ["山水", "壮丽", "自然"]
            },
            {
                "id": 7,
                "title": "江雪",
                "author": "柳宗元",
                "dynasty": "唐",
                "content": "千山鸟飞绝，\n万径人踪灭。\n孤舟蓑笠翁，\n独钓寒江雪。",
                "translation": "所有的山，飞鸟全都断绝；\n所有的路，不见人影踪迹。\n江上孤舟，渔翁披蓑戴笠；\n独自垂钓，不怕冰雪侵袭。",
                "appreciation": "诗人只用了二十个字，就描绘了一幅幽静寒冷的画面：在下着大雪的江面上，一叶小舟，一个老渔翁，独自在寒冷的江心垂钓。天地之间是如此纯洁而寂静，一尘不染，万籁无声。",
                "tags": ["冬天", "孤独", "渔翁"]
            },
            {
                "id": 8,
                "title": "游子吟",
                "author": "孟郊",
                "dynasty": "唐",
                "content": "慈母手中线，\n游子身上衣。\n临行密密缝，\n意恐迟迟归。\n谁言寸草心，\n报得三春晖。",
                "translation": "慈祥的母亲手里把着针线，\n为即将远游的孩子赶制新衣。\n临行前一针针密密地缝缀，\n怕儿子回来得晚衣服破损。\n有谁敢说，子女像小草那样微弱的孝心，\n能够报答得了像春晖普泽的慈母恩情呢？",
                "appreciation": "这是一首母爱的颂歌。全诗共六句三十字，采用白描的手法，通过回忆一个看似平常的临行前缝衣的场景，凸显并歌颂了母爱的伟大与无私，表达了诗人对母爱的感激以及对母亲深深的爱与尊敬。",
                "tags": ["母爱", "亲情", "感恩"]
            },
            {
                "id": 9,
                "title": "黄鹤楼送孟浩然之广陵",
                "author": "李白",
                "dynasty": "唐",
                "content": "故人西辞黄鹤楼，\n烟花三月下扬州。\n孤帆远影碧空尽，\n唯见长江天际流。",
                "translation": "友人在黄鹤楼向我挥手告别，\n阳光明媚的三月他要去扬州。\n他的帆影渐渐消失在碧空中，\n只看见滚滚长江在天边奔流。",
                "appreciation": "这首送别诗有它特殊的情味。它不同于王勃《送杜少府之任蜀州》那种少年刚肠的离别，也不同于王维《渭城曲》那种深情体贴的离别。这首诗，表现的是一种充满诗意的离别。",
                "tags": ["送别", "友情", "长江"]
            },
            {
                "id": 10,
                "title": "出塞",
                "author": "王昌龄",
                "dynasty": "唐",
                "content": "秦时明月汉时关，\n万里长征人未还。\n但使龙城飞将在，\n不教胡马度阴山。",
                "translation": "依旧是秦汉时期的明月和边关，\n守边御敌鏖战万里征人未回还。\n倘若龙城的飞将李广如今还在，\n绝不许匈奴南下牧马度过阴山。",
                "appreciation": "这是一首著名的边塞诗，表达了诗人希望起任良将，早日平息边塞战事，使人民过上安定的生活的愿望。诗人从描写景物入手，首句勾勒出一幅冷月照边关的苍凉景象。",
                "tags": ["边塞", "战争", "爱国"]
            }
        ]
        
        # 添加更多示例数据
        for i in range(11, 51):
            poems.append({
                "id": i,
                "title": f"示例诗 {i}",
                "author": random.choice(["李白", "杜甫", "白居易", "王维", "孟浩然", "李商隐", "杜牧"]),
                "dynasty": "唐",
                "content": f"这是示例诗 {i} 的内容\n每首诗都有其独特的意义\n唐诗三百首经典永流传\n中华文化瑰宝代代传",
                "translation": f"这是示例诗 {i} 的翻译",
                "appreciation": f"这是示例诗 {i} 的赏析",
                "tags": random.choice([["自然"], ["思乡"], ["爱情"], ["友情"], ["哲理"], ["边塞"]])
            })
        
        return poems
    
    def load_favorites(self):
        """加载收藏夹"""
        try:
            with open("favorites.json", "r", encoding="utf-8") as f:
                self.favorites = json.load(f)
        except FileNotFoundError:
            self.favorites = []
    
    def save_favorites(self):
        """保存收藏夹"""
        with open("favorites.json", "w", encoding="utf-8") as f:
            json.dump(self.favorites, f, ensure_ascii=False, indent=2)
    
    def create_widgets(self):
        """创建界面组件"""
        # 主容器
        main_container = tk.Frame(self.root)
        main_container.pack(fill='both', expand=True, padx=10, pady=10)
        
        # 左侧控制面板
        control_panel = tk.Frame(main_container, width=300)
        control_panel.pack(side='left', fill='y', padx=(0, 10))
        
        # 搜索框
        search_frame = tk.Frame(control_panel)
        search_frame.pack(fill='x', pady=(0, 10))
        
        tk.Label(search_frame, text="搜索:", font=('宋体', 10)).pack(side='left')
        self.search_var = tk.StringVar()
        self.search_var.trace('w', self.on_search)
        search_entry = tk.Entry(search_frame, textvariable=self.search_var, width=20)
        search_entry.pack(side='left', padx=5)
        
        # 搜索选项
        search_options_frame = tk.Frame(control_panel)
        search_options_frame.pack(fill='x', pady=(0, 10))
        
        self.search_by = tk.StringVar(value="title")
        tk.Radiobutton(search_options_frame, text="标题", variable=self.search_by, 
                      value="title", command=self.on_search).pack(side='left')
        tk.Radiobutton(search_options_frame, text="作者", variable=self.search_by, 
                      value="author", command=self.on_search).pack(side='left', padx=5)
        tk.Radiobutton(search_options_frame, text="内容", variable=self.search_by, 
                      value="content", command=self.on_search).pack(side='left')
        
        # 标签筛选
        tags_frame = tk.LabelFrame(control_panel, text="按标签筛选")
        tags_frame.pack(fill='x', pady=(0, 10))
        
        self.tags_var = tk.StringVar(value="全部")
        tags = ["全部", "思乡", "爱情", "自然", "友情", "哲理", "边塞", "春天", "月亮", "夜晚", 
                "农民", "劳动", "母爱", "送别", "战争", "爱国", "孤独", "渔翁", "山水"]
        
        for i in range(0, len(tags), 3):
            row_frame = tk.Frame(tags_frame)
            row_frame.pack(fill='x', pady=2)
            for j in range(3):
                if i + j < len(tags):
                    tag = tags[i + j]
                    tk.Radiobutton(row_frame, text=tag, variable=self.tags_var, 
                                  value=tag, command=self.on_tag_filter).pack(side='left', padx=5)
        
        # 作者筛选
        author_frame = tk.LabelFrame(control_panel, text="按作者筛选")
        author_frame.pack(fill='x', pady=(0, 10))
        
        authors = ["全部"] + sorted(list(set(poem["author"] for poem in self.poems)))
        self.author_var = tk.StringVar(value="全部")
        
        author_menu = ttk.Combobox(author_frame, textvariable=self.author_var, 
                                  values=authors, state="readonly", width=18)
        author_menu.pack(pady=5)
        author_menu.bind('<<ComboboxSelected>>', self.on_author_filter)
        
        # 控制按钮
        button_frame = tk.Frame(control_panel)
        button_frame.pack(fill='x', pady=(0, 10))
        
        tk.Button(button_frame, text="随机一首", command=self.random_poem, 
                 width=12).pack(side='left', padx=2)
        tk.Button(button_frame, text="上一首", command=self.prev_poem, 
                 width=12).pack(side='left', padx=2)
        tk.Button(button_frame, text="下一首", command=self.next_poem, 
                 width=12).pack(side='left', padx=2)
        
        # 收藏按钮
        favorite_frame = tk.Frame(control_panel)
        favorite_frame.pack(fill='x', pady=(0, 10))
        
        self.favorite_btn = tk.Button(favorite_frame, text="加入收藏", 
                                     command=self.toggle_favorite, width=15)
        self.favorite_btn.pack(side='left', padx=2)
        
        tk.Button(favorite_frame, text="查看收藏", command=self.show_favorites, 
                 width=15).pack(side='left', padx=2)
        
        # 主题切换按钮
        theme_frame = tk.Frame(control_panel)
        theme_frame.pack(fill='x')
        
        self.theme_btn = tk.Button(theme_frame, text="🌙 夜间模式", 
                                  command=self.toggle_theme, width=15)
        self.theme_btn.pack()
        
        # 右侧显示区域
        display_panel = tk.Frame(main_container)
        display_panel.pack(side='right', fill='both', expand=True)
        
        # 诗歌列表
        list_frame = tk.LabelFrame(display_panel, text="诗歌列表", height=150)
        list_frame.pack(fill='x', pady=(0, 10))
        list_frame.pack_propagate(False)
        
        # 创建列表框和滚动条
        list_container = tk.Frame(list_frame)
        list_container.pack(fill='both', expand=True, padx=5, pady=5)
        
        scrollbar = tk.Scrollbar(list_container)
        scrollbar.pack(side='right', fill='y')
        
        self.poem_listbox = tk.Listbox(list_container, yscrollcommand=scrollbar.set,
                                      font=('宋体', 10), height=6)
        self.poem_listbox.pack(side='left', fill='both', expand=True)
        self.poem_listbox.bind('<<ListboxSelect>>', self.on_list_select)
        scrollbar.config(command=self.poem_listbox.yview)
        
        # 诗歌内容显示
        content_frame = tk.LabelFrame(display_panel, text="诗歌内容")
        content_frame.pack(fill='both', expand=True)
        
        # 创建标签页
        notebook = ttk.Notebook(content_frame)
        notebook.pack(fill='both', expand=True, padx=5, pady=5)
        
        # 原文标签页
        original_tab = tk.Frame(notebook)
        notebook.add(original_tab, text="原文")
        
        self.content_text = scrolledtext.ScrolledText(original_tab, wrap=tk.WORD, 
                                                     font=('楷体', 14))
        self.content_text.pack(fill='both', expand=True, padx=5, pady=5)
        
        # 翻译标签页
        translation_tab = tk.Frame(notebook)
        notebook.add(translation_tab, text="翻译")
        
        self.translation_text = scrolledtext.ScrolledText(translation_tab, wrap=tk.WORD,
                                                         font=('宋体', 12))
        self.translation_text.pack(fill='both', expand=True, padx=5, pady=5)
        
        # 赏析标签页
        appreciation_tab = tk.Frame(notebook)
        notebook.add(appreciation_tab, text="赏析")
        
        self.appreciation_text = scrolledtext.ScrolledText(appreciation_tab, wrap=tk.WORD,
                                                          font=('宋体', 12))
        self.appreciation_text.pack(fill='both', expand=True, padx=5, pady=5)
        
        # 状态栏
        status_frame = tk.Frame(display_panel, height=25, relief=tk.SUNKEN, bd=1)
        status_frame.pack(fill='x', pady=(5, 0))
        status_frame.pack_propagate(False)
        
        self.status_label = tk.Label(status_frame, text="就绪", anchor='w')
        self.status_label.pack(fill='x', padx=5)
        
        # 初始化列表
        self.filtered_poems = self.poems.copy()
        self.update_poem_list()
        self.current_index = 0
    
    def update_poem_list(self):
        """更新诗歌列表"""
        self.poem_listbox.delete(0, tk.END)
        for poem in self.filtered_poems:
            display_text = f"{poem['title']} - {poem['author']}"
            self.poem_listbox.insert(tk.END, display_text)
    
    def on_search(self, *args):
        """搜索处理"""
        search_term = self.search_var.get().lower()
        search_by = self.search_by.get()
        
        if not search_term:
            self.filtered_poems = self.poems.copy()
        else:
            self.filtered_poems = [
                poem for poem in self.poems 
                if search_term in poem[search_by].lower()
            ]
        
        # 应用标签筛选
        self.apply_filters()
    
    def on_tag_filter(self):
        """标签筛选处理"""
        self.apply_filters()
    
    def on_author_filter(self, event=None):
        """作者筛选处理"""
        self.apply_filters()
    
    def apply_filters(self):
        """应用所有筛选条件"""
        # 标签筛选
        selected_tag = self.tags_var.get()
        if selected_tag != "全部":
            self.filtered_poems = [
                poem for poem in self.filtered_poems
                if selected_tag in poem.get("tags", [])
            ]
        
        # 作者筛选
        selected_author = self.author_var.get()
        if selected_author != "全部":
            self.filtered_poems = [
                poem for poem in self.filtered_poems
                if poem["author"] == selected_author
            ]
        
        self.update_poem_list()
        if self.filtered_poems:
            self.display_poem(0)
        else:
            self.clear_display()
    
    def on_list_select(self, event):
        """列表选择处理"""
        selection = self.poem_listbox.curselection()
        if selection:
            self.display_poem(selection[0])
    
    def display_poem(self, index):
        """显示诗歌"""
        if 0 <= index < len(self.filtered_poems):
            poem = self.filtered_poems[index]
            self.current_index = index
            
            # 更新内容显示
            self.content_text.delete(1.0, tk.END)
            self.content_text.insert(tk.END, f"{poem['title']}\n\n")
            self.content_text.insert(tk.END, f"作者：{poem['author']} ({poem['dynasty']})\n\n")
            self.content_text.insert(tk.END, poem['content'])
            
            self.translation_text.delete(1.0, tk.END)
            self.translation_text.insert(tk.END, poem.get('translation', '暂无翻译'))
            
            self.appreciation_text.delete(1.0, tk.END)
            self.appreciation_text.insert(tk.END, poem.get('appreciation', '暂无赏析'))
            
            # 更新收藏按钮状态
            is_favorite = any(fav["id"] == poem["id"] for fav in self.favorites)
            self.favorite_btn.config(text="取消收藏" if is_favorite else "加入收藏")
            
            # 更新状态栏
            self.status_label.config(
                text=f"第 {index + 1}/{len(self.filtered_poems)} 首 | 标签：{', '.join(poem.get('tags', []))}"
            )
            
            # 选中列表中的对应项
            self.poem_listbox.selection_clear(0, tk.END)
            self.poem_listbox.selection_set(index)
            self.poem_listbox.see(index)
    
    def clear_display(self):
        """清空显示"""
        self.content_text.delete(1.0, tk.END)
        self.translation_text.delete(1.0, tk.END)
        self.appreciation_text.delete(1.0, tk.END)
        self.favorite_btn.config(text="加入收藏")
        self.status_label.config(text="没有找到符合条件的诗歌")
    
    def prev_poem(self):
        """显示上一首"""
        if self.filtered_poems:
            new_index = (self.current_index - 1) % len(self.filtered_poems)
            self.display_poem(new_index)
    
    def next_poem(self):
        """显示下一首"""
        if self.filtered_poems:
            new_index = (self.current_index + 1) % len(self.filtered_poems)
            self.display_poem(new_index)
    
    def random_poem(self):
        """随机一首"""
        if self.filtered_poems:
            new_index = random.randint(0, len(self.filtered_poems) - 1)
            self.display_poem(new_index)
    
    def toggle_favorite(self):
        """切换收藏状态"""
        if not self.filtered_poems or self.current_index >= len(self.filtered_poems):
            return
        
        poem = self.filtered_poems[self.current_index]
        poem_id = poem["id"]
        
        # 检查是否已收藏
        is_favorite = any(fav["id"] == poem_id for fav in self.favorites)
        
        if is_favorite:
            # 取消收藏
            self.favorites = [fav for fav in self.favorites if fav["id"] != poem_id]
            self.favorite_btn.config(text="加入收藏")
            messagebox.showinfo("提示", f"已取消收藏《{poem['title']}》")
        else:
            # 添加收藏
            self.favorites.append({
                "id": poem_id,
                "title": poem["title"],
                "author": poem["author"],
                "date_added": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            })
            self.favorite_btn.config(text="取消收藏")
            messagebox.showinfo("提示", f"已收藏《{poem['title']}》")
        
        self.save_favorites()
    
    def show_favorites(self):
        """显示收藏夹"""
        if not self.favorites:
            messagebox.showinfo("收藏夹", "收藏夹为空")
            return
        
        # 创建收藏夹窗口
        fav_window = tk.Toplevel(self.root)
        fav_window.title("我的收藏")
        fav_window.geometry("600x500")
        
        # 创建列表框
        list_frame = tk.Frame(fav_window)
        list_frame.pack(fill='both', expand=True, padx=10, pady=10)
        
        scrollbar = tk.Scrollbar(list_frame)
        scrollbar.pack(side='right', fill='y')
        
        listbox = tk.Listbox(list_frame, yscrollcommand=scrollbar.set,
                           font=('宋体', 11), selectmode=tk.SINGLE)
        listbox.pack(side='left', fill='both', expand=True)
        
        scrollbar.config(command=listbox.yview)
        
        # 添加收藏的诗歌
        for fav in self.favorites:
            for poem in self.poems:
                if poem["id"] == fav["id"]:
                    listbox.insert(tk.END, 
                                 f"《{poem['title']}》 - {poem['author']} (收藏于：{fav['date_added']})")
                    break
        
        # 控制按钮
        button_frame = tk.Frame(fav_window)
        button_frame.pack(fill='x', padx=10, pady=(0, 10))
        
        tk.Button(button_frame, text="查看选中", width=12,
                 command=lambda: self.view_selected_favorite(listbox, fav_window)).pack(side='left', padx=5)
        tk.Button(button_frame, text="删除选中", width=12,
                 command=lambda: self.delete_selected_favorite(listbox)).pack(side='left', padx=5)
        tk.Button(button_frame, text="关闭", width=12,
                 command=fav_window.destroy).pack(side='right', padx=5)
    
    def view_selected_favorite(self, listbox, window):
        """查看选中的收藏"""
        selection = listbox.curselection()
        if selection:
            index = selection[0]
            if index < len(self.favorites):
                fav = self.favorites[index]
                # 在主窗口中显示这首诗
                for i, poem in enumerate(self.poems):
                    if poem["id"] == fav["id"]:
                        # 清空筛选条件
                        self.search_var.set("")
                        self.tags_var.set("全部")
                        self.author_var.set("全部")
                        self.filtered_poems = self.poems.copy()
                        self.update_poem_list()
                        
                        # 找到并显示这首诗
                        for j, filtered_poem in enumerate(self.filtered_poems):
                            if filtered_poem["id"] == fav["id"]:
                                self.display_poem(j)
                                window.destroy()
                                return
    
    def delete_selected_favorite(self, listbox):
        """删除选中的收藏"""
        selection = listbox.curselection()
        if selection:
            index = selection[0]
            if index < len(self.favorites):
                # 确认删除
                if messagebox.askyesno("确认", "确定要删除这个收藏吗？"):
                    del self.favorites[index]
                    self.save_favorites()
                    
                    # 更新收藏列表
                    listbox.delete(index)
                    
                    # 如果删除的是当前显示的诗歌，更新按钮状态
                    if self.filtered_poems and self.current_index < len(self.filtered_poems):
                        current_poem = self.filtered_poems[self.current_index]
                        is_favorite = any(fav["id"] == current_poem["id"] for fav in self.favorites)
                        self.favorite_btn.config(text="取消收藏" if is_favorite else "加入收藏")
    
    def toggle_theme(self):
        """切换主题"""
        if self.current_theme == "light":
            self.apply_dark_theme()
            self.current_theme = "dark"
            self.theme_btn.config(text="☀️ 日间模式")
        else:
            self.apply_light_theme()
            self.current_theme = "light"
            self.theme_btn.config(text="🌙 夜间模式")
    
    def apply_light_theme(self):
        """应用浅色主题"""
        bg_color = "#f0f0f0"
        fg_color = "black"
        
        self.root.configure(bg=bg_color)
        
        # 更新所有widget的颜色
        for widget in self.root.winfo_children():
            self.update_widget_theme(widget, bg_color, fg_color)
    
    def apply_dark_theme(self):
        """应用深色主题"""
        bg_color = "#2b2b2b"
        fg_color = "white"
        
        self.root.configure(bg=bg_color)
        
        # 更新所有widget的颜色
        for widget in self.root.winfo_children():
            self.update_widget_theme(widget, bg_color, fg_color)
    
    def update_widget_theme(self, widget, bg_color, fg_color):
        """递归更新widget主题"""
        try:
            widget_type = widget.winfo_class()
            
            if widget_type in ['Frame', 'LabelFrame', 'Labelframe']:
                widget.configure(bg=bg_color)
            elif widget_type == 'Label':
                widget.configure(bg=bg_color, fg=fg_color)
            elif widget_type == 'Button':
                widget.configure(bg=bg_color, fg=fg_color, 
                               activebackground=bg_color, activeforeground=fg_color)
            elif widget_type == 'Entry':
                widget.configure(bg='white' if bg_color == "#f0f0f0" else "#3c3c3c",
                               fg='black' if fg_color == "white" else fg_color,
                               insertbackground=fg_color)
            elif widget_type == 'Listbox':
                widget.configure(bg='white' if bg_color == "#f0f0f0" else "#3c3c3c",
                               fg='black' if fg_color == "white" else fg_color,
                               selectbackground='lightblue' if bg_color == "#f0f0f0" else "#505050")
            elif widget_type == 'Text':
                widget.configure(bg='white' if bg_color == "#f0f0f0" else "#3c3c3c",
                               fg='black' if fg_color == "white" else fg_color,
                               insertbackground=fg_color)
        except:
            pass
        
        # 递归更新子widget
        for child in widget.winfo_children():
            self.update_widget_theme(child, bg_color, fg_color)

def main():
    root = tk.Tk()
    app = TangPoetryApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()