如何在 tkinter 中限制 Toplevel windows 的数量

How to limit number of Toplevel windows in tkinter

我有一些代码可以在用户身上创建一个顶级 window 按下一个按钮。

但是我想将顶层 windows 的数量限制为一个,这样用户就无法通过垃圾邮件按钮打开五十个 windows。

import tkinter as tk

class app():

    def __init__(self,master):

        self.master = master    
        master.configure(background = '#002e3d')
        master.title('Test!')
        master.geometry = master.geometry('660x550+200+200')
        master.resizable(width = False,height = False)
        self.button = tk.Button(master,text = 'Test'command = self.searchmenu)
        self.button.pack()

    def searchmenu(self):
        Demo()


class Demo():

    def __init__(self):
        self.top = tk.Toplevel()
        self.top.title('Search!')


def main():

    root = tk.Tk()
    window = app(root)
    root.mainloop()

如果您引用您创建的 Demo 对象(无论如何我都会推荐),这将变得非常简单:

class app():

    def __init__(self,master):
        ...
        self.popup = None

    def searchmenu(self):
        if self.popup is None:
            self.popup = Demo()

虽然一旦创建的 window 被销毁,这将不允许重新打开它,因此您可能还想检查顶部是否仍然存在 winfo_exists():

def searchmenu(self):
    if self.popup is None or not self.popup.top.winfo_exists():
        self.popup = Demo()

编辑:如果弹出窗口已经打开,那么按下按钮应该 lift 它到 window 堆栈的顶部:

def searchmenu(self):
    if self.popup is None or not self.popup.top.winfo_exists():
        self.popup = Demo()
    else:
        self.popup.top.lift(self.master)