如何防止tkinter生成重复窗口

2024-05-16 09:57:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用TKInter创建一个窗口来显示一些信息,比如一个通知。单击主应用程序的“查看详细信息”按钮时,该窗口应显示出来。你知道吗

这是我刚才说的窗户的密码。单击上述按钮时,将调用Categories()方法。你知道吗

from tkinter import *
from tkinter import ttk

def Categories():


    roots = Tk()
    roots.minsize(600, 600)
    roots.title("Category Details")



    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = W)


    labelClass = Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)
    roots.mainloop()




我遇到的问题是,每次按下按钮,它都会创建一个新窗口,但会使当前窗口保持打开状态。所以如果我点击10次,它会打开10个类似的窗口。但我希望它只打开一个窗口,无论按钮被点击多少次,应该只有一个这样的窗口。怎么做?你知道吗


Tags: textfromimportfalsetkintercolumn按钮grid
2条回答

而不是禁用按钮

为什么不使用顶层的属性名?你知道吗

这将允许您使用顶级的单个实例。你知道吗

请尝试下面的代码。你知道吗

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def new_window():
    #a.config(command="")
    #use instead name='something'
    roots = tk.Toplevel(name='goofy') #Use Toplevel instead if you simply want another window
    roots.minsize(600, 600)
    roots.title("Category Details")

    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = tk.W)

    labelClass = tk.Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)

    def quit_window():
        a.config(command=new_window)
        roots.destroy()

    roots.protocol("WM_DELETE_WINDOW",quit_window)

a = tk.Button(root,text="Click to open new win",command=new_window)
a.pack()

root.mainloop()

看起来您的函数Categories是从另一个Tk实例的按钮命令调用的。通常,您希望避免创建一个以上的Tk实例。你知道吗

对于你的问题,有很多方法。一种方法是在单击时禁用按钮命令,然后在窗口销毁时重新激活该命令:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

def new_window():
    a.config(command="")
    roots = tk.Toplevel() #Use Toplevel instead if you simply want another window
    roots.minsize(600, 600)
    roots.title("Category Details")

    labelFrameCategory = ttk.LabelFrame(roots,text="Financial")
    labelFrameCategory.configure()
    labelFrameCategory.grid(column=0 ,row=0, pady=10, padx = 30 , sticky = tk.W)

    labelClass = tk.Label(labelFrameCategory, text="Documents related to finance")
    labelClass.grid(column=0, row=1)
    labelClass.config(font=("Courier", 15))

    roots.resizable(False, False)

    def quit_window():
        a.config(command=new_window)
        roots.destroy()

    roots.protocol("WM_DELETE_WINDOW",quit_window)

a = tk.Button(root,text="Click to open new win",command=new_window)
a.pack()

root.mainloop()

或者,您也可以设置一个类似window_open=True的标志并检查该标志。你知道吗

相关问题 更多 >