You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CustomTkinter是否有CTkTreeview?外观回调与字体缩放报错求助

解决CustomTkinter Treeview组件、外观回调及字体KeyError问题

一、处理KeyError: 'font'错误

  • 问题原因:ThemeManager.theme["CTkLabel"]中不存在"font"键,CustomTkinter不同版本的主题结构存在差异,直接按该路径取值会报错。
  • 修复方案:
    1. 直接用CTkFont创建适配缩放和外观的字体,无需从ThemeManager读取:
      import customtkinter as ctk
      text_font = ctk.CTkFont(family="Arial", size=ctk.CTkFont.scaled_size(12))
      
    2. 若要从主题获取,先打印主题结构确认路径,再调整代码:
      # 先输出主题结构查看具体键名
      print(ctk.ThemeManager.theme)
      # 根据实际结构修改,示例:
      text_font = self._apply_appearance_mode(ctk.ThemeManager.theme.get("font", {}).get("CTkLabel", ctk.CTkFont()))
      

二、添加明暗模式变更回调

  • 实现步骤:
    1. 导入AppearanceModeTracker:
      from customtkinter import AppearanceModeTracker
      
    2. 定义回调函数,接收当前模式("Light"或"Dark")参数:
      def on_mode_change(new_mode):
          # 写入模式切换后的逻辑,比如更新Treeview样式、字体
          # 示例:self.custom_tree.update_style(new_mode)
          pass
      
    3. 注册回调:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:57:43