如何用Tkinter创建含框架的下拉控件?仿Windows更新UI实现
用Tkinter实现Windows更新风格的可折叠UI
Tkinter没有现成的带复杂内容的下拉控件,但可以通过自定义Frame组件实现这种可展开/折叠的面板效果,核心思路是把每个可折叠项拆成标题栏和内容区域,通过按钮控制内容区域的显示/隐藏。
实现步骤与代码示例
下面是完整的可运行代码,模拟Windows更新界面的核心功能:
import tkinter as tk from tkinter import ttk # 自定义可折叠面板组件 class CollapsibleFrame(tk.Frame): def __init__(self, parent, title="", *args, **kwargs): super().__init__(parent, *args, **kwargs) # 标题栏:包含标题文本和折叠按钮 self.title_frame = ttk.Frame(self) self.title_frame.pack(fill="x", padx=5, pady=2) self.title_label = ttk.Label(self.title_frame, text=title, font=('Arial', 10, 'bold')) self.title_label.pack(side="left", padx=5, pady=3) self.toggle_btn = ttk.Button(self.title_frame, text="▼", width=2, command=self.toggle) self.toggle_btn.pack(side="right", padx=5, pady=3) # 内容区域:初始隐藏 self.content_frame = ttk.Frame(self) self.content_frame.pack(fill="x", padx=5, pady=0) self.content_frame.pack_forget() self.is_expanded = False # 切换展开/折叠状态 def toggle(self): if self.is_expanded: self.content_frame.pack_forget() self.toggle_btn.config(text="▼") else: self.content_frame.pack(fill="x", padx=5, pady=0) self.toggle_btn.config(text="▲") self.is_expanded = not self.is_expanded # 主窗口 if __name__ == "__main__": root = tk.Tk() root.title("Windows 更新") root.geometry("650x450") root.resizable(False, False) # 模拟更新列表 # 第一个更新项 update_item1 = CollapsibleFrame(root, title="2024-05 累积更新 for Windows 11 版本22H2 (KB5037768)") update_item1.pack(fill="x", padx=15, pady=8) # 内容区:左侧说明 + 右侧操作按钮 content1 = ttk.Frame(update_item1.content_frame) content1.pack(fill="x", pady=8) ttk.Label(content1, text="此更新包含关键安全修复和系统稳定性改进,建议优先安装。").pack(side="left", padx=10, pady=12) ttk.Button(content1, text="下载并安装").pack(side="right", padx=10, pady=12) # 第二个更新项 update_item2 = CollapsibleFrame(root, title="2024-04 .NET Framework 安全更新 (KB5036987)") update_item2.pack(fill="x", padx=15, pady=8) content2 = ttk.Frame(update_item2.content_frame) content2.pack(fill="x", pady=8) ttk.Label(content2, text="修复.NET Framework中的多个远程代码执行漏洞,提升应用安全性。").pack(side="left", padx=10, pady=12) ttk.Button(content2, text="下载并安装").pack(side="right", padx=10, pady=12) # 已安装的更新项 update_item3 = CollapsibleFrame(root, title="2024-03 可选功能更新 (KB5035853) - 已安装") update_item3.pack(fill="x", padx=15, pady=8) content3 = ttk.Frame(update_item3.content_frame) content3.pack(fill="x", pady=8) ttk.Label(content3, text="已成功安装此可选更新,包含新的系统主题和功能优化。").pack(side="left", padx=10, pady=12) ttk.Button(content3, text="卸载").pack(side="right", padx=10, pady=12) root.mainloop()
关键说明
- 自定义CollapsibleFrame:封装了折叠逻辑,点击标题栏按钮即可切换内容区域的显示状态
- 内容区域自由布局:每个折叠项的内容区可以添加任意Tkinter控件,示例中用
side="left"和side="right"实现了文本与右侧按钮的排版 - 样式调整:可以通过ttk的
Style类修改控件外观,比如按钮颜色、标题字体,让界面更贴近Windows原生风格
内容的提问来源于stack exchange,提问作者Shakir
相关产品推荐
相关产品推荐

