Python Tkinter重新打开窗口按钮重复且报TclError错误如何解决?
问题1:按钮重复问题
原因
你每次触发打开子窗口的函数(如customthemehub、colors、themes)时,都会在已有的窗口对象内重新创建一遍按钮控件,哪怕窗口只是处于隐藏状态,每次调用函数都会新增一批按钮并调用pack(),多次打开就会出现按钮堆叠重复的问题。
同时你当前子窗口的关闭按钮绑定的是destroy方法,该方法会直接销毁整个窗口对象,而非你预期的仅隐藏,后续再调用deiconify也无法恢复已销毁的窗口,反而会触发异常。
解决方案
- 所有子窗口的按钮控件仅在初始化窗口时创建一次,不要放在打开窗口的函数内重复创建。例如
customthemehub函数仅保留root4.deiconify()逻辑,把b10、b23的创建和pack代码移动到root4 = tk.Toplevel(root)初始化之后,仅执行一次。colors、themes函数同理,只保留窗口显示逻辑,控件初始化全部提前。 - 所有子窗口的关闭按钮将
destroy改为withdraw,仅隐藏不销毁。同时给每个子窗口配置关闭拦截,避免点击右上角叉号销毁窗口,示例代码如下:
# 每个子窗口初始化后都加上这行配置,以root2为例 root2.protocol("WM_DELETE_WINDOW", root2.withdraw) root3.protocol("WM_DELETE_WINDOW", root3.withdraw) root4.protocol("WM_DELETE_WINDOW", root4.withdraw) root5.protocol("WM_DELETE_WINDOW", root5.withdraw)
问题2:_tkinter.TclError: bad window path name报错
原因
触发这个报错是因为你要操作的root5窗口已经被销毁了:你没有给root5加自定义关闭按钮,用户点击窗口右上角的叉号时,Tkinter默认会执行destroy销毁窗口,后续再调用root5.deiconify()时,对应的窗口对象已经不存在,就会抛出路径无效的错误。
另外你colors函数里还存在笔误:root3.deiconify没有加括号,属于方法引用而非方法调用,会导致点击颜色选择按钮无法正常显示窗口。
解决方案
- 给
root5添加关闭按钮,绑定root5.withdraw方法,配合上文提到的窗口关闭拦截配置,避免root5被销毁。 - 修正
colors函数的笔误,将root3.deiconify改为root3.deiconify()。
内容的提问来源于stack exchange,提问作者peleg siegel
相关产品推荐
相关产品推荐

