我感觉有点像Python编程可能不是我的事情....
我创建了一个tkinter GUI,它使用一个按钮回调来打开另一个窗口(其他搜索说这个窗口应该是一个顶级窗口)并且它工作得非常好,但是每次按下按钮它都会打开另一个窗口相同(据我所知)窗口。
问题:如何测试窗口(用按钮打开)是否已经存在,从而防止生成重复项???
注意:我不是(还)OOP程序员,所以如果可能的话请避免使用这个范例......
的问候,
Bill W。
答案 0 :(得分:5)
我不是(还)OOP程序员,所以请尽可能避免使用这种范例......
如果你想成功地用Python编程,你迟早要理解面向对象的编程。替代方案(全局变量和函数无处不在)并不是一个好方法。甚至Tkinter也有很多带有各自方法的类,所以它看起来像你的目的是必要的。
回到你的问题,解决方案可能是将Toplevel窗口设置为包装所有应用程序的类的属性,如果此属性为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()
答案 1 :(得分:0)
您可以使用此方法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