2

我感觉有点像 Python 编程可能不是我的事....

我创建了一个 tkinter GUI,它使用按钮回调打开另一个窗口(其他搜索说这个窗口应该是一个顶级窗口)并且它工作得很好,但是每次按下按钮它都会打开另一个相同的(如据我所知)窗口。

问题:我怎样才能测试一个窗口(用按钮打开)是否已经存在,从而防止产生重复???

注意:我(还)不是 OOP 程序员,所以如果可能,请避免使用这种范式......

问候,

比尔·W。

4

2 回答 2

5

我(还)不是 OOP 程序员,所以请尽可能避免使用这种范式......

如果你想成功地用 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()
于 2013-06-15T20:57:11.753 回答
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
于 2017-06-13T03:16:29.090 回答