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