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

切换页面时Custom Tkinter组件缩放报错问题求助

问题解决:CustomTkinter切换页面时set_widget_scaling触发TclError

错误根源

你遇到的_tkinter.TclError: invalid command name ".!ctkoptionmenu.!dropdownmenu"错误,核心原因是执行顺序逻辑错误:

  • 切换页面时,你先调用Page2()/Page1()销毁了旧页面的所有组件
  • 接着调用set_widget_scaling(),这个函数会遍历所有已创建的CustomTkinter组件,尝试更新它们的缩放比例
  • 但之前页面的CTkOptionMenu(包括其内部的下拉菜单组件)已经被销毁,对应的Tcl命令已失效,因此触发错误

解决方案

调整lambda中的执行顺序:先调用缩放函数,再切换页面。让缩放操作在旧组件被销毁前完成,避免去处理已失效的组件实例。

修改后的代码:

import customtkinter as ct

class App(ct.CTk):
    def __init__(self):
        super().__init__()
        self.title("Test")
        self.geometry("640x480")
        self.Page1()

    def Page1(self):
        for i in self.winfo_children():
            i.destroy()
        # 先执行缩放,再切换到Page2
        self.page1 = ct.CTkButton(self, text="Page 2", command=lambda: (self.Resize(), self.Page2()))
        self.page1.pack()
        self.menu = ct.CTkOptionMenu(self)
        self.menu.pack()


    def Page2(self):
        for i in self.winfo_children():
            i.destroy()
        # 先执行缩放,再切换到Page1
        self.page2 = ct.CTkButton(self, text="Page 1", command=lambda: (self.Resize1(), self.Page1()))
        self.page2.pack()
        self.menu = ct.CTkOptionMenu(self)
        self.menu.pack()

    def Resize(self):
        ct.set_widget_scaling(2)

    def Resize1(self):
        ct.set_widget_scaling(0.5)

if __name__ == "__main__":
    app = App()
    app.mainloop()

补充说明

如果需要在页面切换完成后再调整缩放,可以在页面创建函数的末尾调用缩放方法,确保旧组件已销毁、新组件已初始化。不过上述调整执行顺序的方案是最直接且不易出错的。

内容的提问来源于stack exchange,提问作者Mohammad Ali Naanouh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:45:12