CustomTkinter是否有CTkTreeview?外观回调与字体缩放报错求助
解决CustomTkinter Treeview组件、外观回调及字体KeyError问题
一、处理KeyError: 'font'错误
- 问题原因:
ThemeManager.theme["CTkLabel"]中不存在"font"键,CustomTkinter不同版本的主题结构存在差异,直接按该路径取值会报错。 - 修复方案:
- 直接用
CTkFont创建适配缩放和外观的字体,无需从ThemeManager读取:import customtkinter as ctk text_font = ctk.CTkFont(family="Arial", size=ctk.CTkFont.scaled_size(12)) - 若要从主题获取,先打印主题结构确认路径,再调整代码:
# 先输出主题结构查看具体键名 print(ctk.ThemeManager.theme) # 根据实际结构修改,示例: text_font = self._apply_appearance_mode(ctk.ThemeManager.theme.get("font", {}).get("CTkLabel", ctk.CTkFont()))
- 直接用
二、添加明暗模式变更回调
- 实现步骤:
- 导入
AppearanceModeTracker:from customtkinter import AppearanceModeTracker - 定义回调函数,接收当前模式("Light"或"Dark")参数:
def on_mode_change(new_mode): # 写入模式切换后的逻辑,比如更新Treeview样式、字体 # 示例:self.custom_tree.update_style(new_mode) pass - 注册回调:
AppearanceModeTracker.add(on_mode_change)
- 导入
三、自定义适配CustomTkinter的Treeview组件
基于tkinter原生Treeview封装,适配明暗模式与UI缩放:
import customtkinter as ctk import tkinter as tk from tkinter import ttk from customtkinter import AppearanceModeTracker class CTkTreeview(ttk.Treeview): def __init__(self, master, **kwargs): super().__init__(master, **kwargs) self._init_style() # 注册外观模式回调 AppearanceModeTracker.add(self._update_style) # 绑定缩放事件 master.bind("<Configure>", self._adjust_font_scale) def _init_style(self): # 根据当前模式设置样式 mode = ctk.get_appearance_mode() style = ttk.Style() if mode == "Dark": style.configure("CTkTree.Treeview", background="#2b2b2b", foreground="white", fieldbackground="#2b2b2b") style.configure("CTkTree.Treeview.Heading", background="#4a4a4a", foreground="white") else: style.configure("CTkTree.Treeview", background="white", foreground="black", fieldbackground="white") style.configure("CTkTree.Treeview.Heading", background="#e0e0e0", foreground="black") self.configure(style="CTkTree.Treeview") def _update_style(self, new_mode): self._init_style() def _adjust_font_scale(self, event): # 适配UI缩放调整字体 scaled_size = ctk.CTkFont.scaled_size(10) style = ttk.Style() style.configure("CTkTree.Treeview", font=("Arial", scaled_size)) style.configure("CTkTree.Treeview.Heading", font=("Arial", scaled_size, "bold"))
使用示例
class App(ctk.CTk): def __init__(self): super().__init__() self.title("Custom Treeview Demo") self.geometry("600x400") self.tree = CTkTreeview(self) self.tree.pack(fill="both", expand=True, padx=20, pady=20) # 添加测试数据 self.tree.insert("", "end", text="父节点1", values=("数据1", "数据2")) parent_node = self.tree.insert("", "end", text="父节点2", values=("数据3", "数据4")) self.tree.insert(parent_node, "end", text="子节点1", values=("子数据1", "子数据2")) ctk.CTkButton(self, text="切换明暗模式", command=ctk.toggle_appearance_mode).pack(pady=10) if __name__ == "__main__": app = App() app.mainloop()
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

