查看Tkinter小部件是否存在(不使用.winfo_exists)

时间:2015-03-16 11:51:15

标签: python tkinter

我想看看是否存在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

3 个答案:

答案 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()