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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:30:51