Tkinter复选框程序运行时出现冗余窗口,如何消除?
解决Tkinter脚本运行时出现冗余窗口的问题
问题原因
冗余窗口是Tkinter的默认行为导致的:当你直接创建Toplevel实例但没有显式初始化主窗口(Tk实例)时,Tkinter会自动生成一个默认的主窗口并显示出来。
解决方案
这里提供两种可行的解决方法:
方法一:显式创建主窗口并隐藏
在程序入口处先创建Tk主窗口,调用withdraw()方法将其隐藏后,再初始化你的Toplevel窗口:
import Tkinter as tk class PageCanvas1(tk.Toplevel): def __init__(self, parent): self.arr = {} # 替换全局变量为实例属性,代码更规范 tk.Toplevel.__init__(self, parent) self.title('Canvas') self.geometry('400x600') canvas = tk.Canvas(self, bg='white', scrollregion=(0, 0, 400, 20000)) canvas.pack(fill='both', expand=True) vbar = tk.Scrollbar(canvas, orient='vertical') vbar.pack(side='right', fill='y') vbar.config(command=canvas.yview) canvas.config(yscrollcommand=vbar.set) canvas.create_text(5, 0, anchor='nw', text="Choose users: ") f = tk.Frame(canvas) canvas.create_window((200, 0), window=f, anchor="n") for i in range(0, 1000): self.arr[i] = tk.IntVar() tk.Checkbutton(f, text=str(i), variable=self.arr[i]).pack() if __name__ == "__main__": root = tk.Tk() root.withdraw() # 隐藏默认主窗口 app = PageCanvas1(root) app.mainloop()
方法二:将自定义类改为继承Tk
既然PageCanvas1是程序的主窗口,直接继承Tk而非Toplevel更符合设计逻辑,同时也能避免冗余窗口:
import Tkinter as tk class PageCanvas1(tk.Tk): def __init__(self): self.arr = {} tk.Tk.__init__(self) self.title('Canvas') self.geometry('400x600') canvas = tk.Canvas(self, bg='white', scrollregion=(0, 0, 400, 20000)) canvas.pack(fill='both', expand=True) vbar = tk.Scrollbar(canvas, orient='vertical') vbar.pack(side='right', fill='y') vbar.config(command=canvas.yview) canvas.config(yscrollcommand=vbar.set) canvas.create_text(5, 0, anchor='nw', text="Choose users: ") f = tk.Frame(canvas) canvas.create_window((200, 0), window=f, anchor="n") for i in range(0, 1000): self.arr[i] = tk.IntVar() tk.Checkbutton(f, text=str(i), variable=self.arr[i]).pack() if __name__ == "__main__": app = PageCanvas1() app.mainloop()
额外提示
代码中原有的全局变量arr建议改为实例属性self.arr,这样可以避免全局变量带来的命名冲突和维护问题,让代码结构更清晰。
内容的提问来源于stack exchange,提问作者Abbas Molaei
相关产品推荐
相关产品推荐

