我想看看是否存在Tkinter小部件,所以我可以删除它。
此网站上的另一个answer使用widget.winfo_exists
,但即使尚未创建窗口小部件,也会返回1
,如果窗口小部件已被销毁,则仅返回0
:< / p>
import Tkinter as tk
root = tk.Tk()
label = tk.Label(root)
print label.winfo_exists() # returns 1
和
import Tkinter as tk
root = tk.Tk()
#label = tk.Label(root)
print label.winfo_exists() # also returns 1
,而:
import Tkinter as tk
root = tk.Tk()
label = tk.Label(root)
label.destroy()
print label.winfo_exists() # returns 0
我试图以这种方式使用它:
import Tkinter as tk
root = tk.Tk()
# label may exist
if label.winfo_exists() == 1:
label.destroy() # doesn't work
答案 0 :(得分:6)
您对winfo_exists()
为尚未创建的窗口小部件返回1
的观察结果是错误的。 python的规则绝对会阻止你的场景以这种方式运行。
即便:
$ python -i
Python 2.7.6 (default, Dec 2 2013, 11:20:48)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter as tk
>>> root = tk.Tk()
>>> print label.winfo_exists()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'label' is not defined
>>>
以上就是我所期待的。在这种情况下,您无法让winfo_exists
返回1
。
“如何确定窗口小部件是否存在”的正确答案是使用winfo_exists
。这是正确的方法。假设对象是或者是Tkinter小部件类的实例,它将始终有效。
答案 1 :(得分:5)
看来你在持有对Tk小部件的引用的Python变量和Tk窗口本身之间感到困惑。仅当Tk小部件具有窗口时,winfo_exists
才返回true。在销毁小部件后,python变量可能继续存在,在这种情况下,winfo_exists
将返回false。
由于Tk destroy函数在调用已经销毁的窗口小部件时不会抛出错误,因此您应该能够在不进行任何检查的情况下调用它。但是,您确实需要一个最初包含Tk小部件的值python变量。
以下交互式会话应显示此操作:
>>> from tkinter import *
>>> root = Tk()
>>> label = Label(root)
>>> label.destroy()
>>> label
<tkinter.Label object at 0x02B88310>
>>> label.destroy()
>>> label.winfo_exists()
0
在此示例中,将立即创建并销毁标签窗口小部件。这会留下一个python对象,我们可以在其上调用winfo_exists
并正确返回false。另请注意,label.destroy()
被调用了两次,没有任何不良影响。
答案 2 :(得分:0)
我一直使用try / except
,而except: pass
通常不赞成,但它可以在这里运作。
try:
label.destroy()
except (NameError, AttributeError):
pass
此外:
import Tkinter as tk
root = tk.Tk()
#label = tk.Label(root)
print label.winfo_exists() # also returns 1
这不会返回1,因为label
未定义,因此它可能不会winfo_exists()
。