如何测试是否打开了一个顶层窗口?

3
我感觉Python编程可能不是我的强项... 我创建了一个使用按钮回调打开另一个窗口的tkinter GUI,它运行得非常好,但每次按下按钮时,它都会打开另一个相同的窗口(就我所知)。问题是:如何测试以查看已经存在的窗口(由按钮打开),从而防止生成重复的窗口?注意:我还不是面向对象的程序员,因此请尽可能避免使用该范例... 问候,Bill W.
2个回答

5

我目前还不是一个面向对象的程序员,所以请尽可能避免使用该范例...

如果你想成功地在Python中编程,迟早你会需要理解面向对象编程。另一种方法(到处都是全局变量和函数)绝对不是一个好的方式。即使Tkinter也有很多类及其相应的方法,因此它似乎对你的目的是必要的。

回到你的问题,一个解决方案可以是将Toplevel窗口设置为你包装所有应用程序的类的属性,并且仅在该属性为None时打开新窗口。为了在关闭窗口时将该属性设置为None,你可以使用protocol方法来设置回调。

这是一个小型的工作示例,你可以看到它如何工作:

import Tkinter as tk

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.button = tk.Button(self, text="Open a new window", command=self.openwindow)
        self.button.pack()
        self.toplevel = None
    def openwindow(self):
        if self.toplevel is None:
            self.toplevel = tk.Toplevel(self)
            self.toplevel.protocol('WM_DELETE_WINDOW', self.removewindow)
    def removewindow(self):
        self.toplevel.destroy()
        self.toplevel = None

app = App()
app.mainloop()

我非常感谢你的代码示例和关于OOP的建议。代码像你预期的那样工作。作为OOP的支持者,我会感激你所知道的任何对真正的OOP小白和抵抗者有帮助的资源...另外,我想让你知道,我找到了一个相当不错的解决方法,涉及禁用“新窗口”按钮。目前我还没有决定最好的方法。OOP代码有些诱人,但我需要更多的“研究”来发展一些使用它的信心...问候,比尔 - Bill Waters
1
@BillWaters 如果你仔细阅读,有关类的文档是非常清晰的,你可以掌握基础知识,然后再寻找更高级的资源。 - A. Rodas

1
您可以使用winfo_exists()方法来检查窗口是否存在。
如果返回值为0,则表示该窗口不存在。
如果返回值为1,则表示该窗口存在。
示例代码...
from tkinter import *

mainWindow = Tk()
mainWindow.title("This is main Window")

# create a top-level window
newWindow = Toplevel(mainWindow)
newWindow.title("This is Toplevel window")

print("Before destroying window = " + str(newWindow.winfo_exists()))
newWindow.destroy()
print("After destroying window = " + str(newWindow.winfo_exists()))

mainloop()

输出是...
# Before destroying window = 1
# After destroying window = 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接