切换页面时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
相关产品推荐
相关产品推荐

