如何防止Tkinter生成重复窗口

时间:2019-05-28 03:37:13

标签: python user-interface tkinter tkinter-layout

我正在使用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个类似的窗口。但是我希望它仅打开1个窗口,无论单击按钮多少次,都应该只有1个这样的窗口。该怎么做?

2 个答案:

答案 0 :(得分:1)

好像您的函数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之类的标志并检查该标志。

答案 1 :(得分:0)

而不是禁用按钮

为什么不使用顶层的属性名称?

这将允许您使用顶级实例。

尝试下面的代码。

mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);