我在python shell中做了这个:
from Tkinter import *
v = BooleanVar()
但是我收到了以下错误:
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
v = BooleanVar()
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 320, in __init__
Variable.__init__(self, master, value, name)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 185, in __init__
self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
>>>
然后在试图让它发挥作用时,我尝试了这个:
v = BooleanVar
这很有效。
所以我继续做下一个合乎逻辑的事情,检查变量是否已经初始化并得到了这个:
>>> v
<class Tkinter.BooleanVar at 0xb6f666bc>
然后我尝试使用值True
进行初始化,为此我使用了set
方法:
v.set(True)
我得到了以下错误:
Traceback (most recent call last):
File "<pyshell#63>", line 1, in <module>
v.set(True)
TypeError: unbound method set() must be called with BooleanVar instance as first argument (got bool instance instead)
正在进行什么?
请帮我解决这个问题
目标我想将此作为与菜单中的复选按钮相关联的变量
specs Linux mint 14,python 2.7,Tkinter 8.5
答案 0 :(得分:5)
简答:首先致电root = tk.Tk()
。
答案很长: 引发错误的行
self._tk = master.tk
失败,因为master
是None
。但是,请查看此行上方的代码(在Tkinter.py中):
class Variable:
def __init__(self, master=None, value=None, name=None):
if not master:
master = _default_root
...
self._tk = master.tk
如果您明确地将master
窗口小部件传递给BooleanVar
(Variable
的子类),则master
将不是None
。或者,如果_default_root
不是None
,则master
将不是None
。
在普通的Tkinter应用程序中,您将在创建BooleanVar
之前创建一个根窗口。在这种情况下,tk.BooleanVar()
不会引发错误。
root = tk.Tk()
将_default_root
全局变量设置为自身(只要useTk
参数为True
- 默认情况下就是这样)。 _default_root
被BooleanVar
用作小部件的主人,如果没有使用tk.BooleanVar(master)
明确设置主人。
总而言之,要么在调用root = tk.Tk()
之前调用_default_root
或类似的东西来设置tk.BooleanVar()
,要么将显式主窗口小部件作为第一个参数传递:tk.BooleanVar(master)
。
In [1]: import Tkinter as tk
In [2]: root = tk.Tk()
In [3]: x = tk.BooleanVar()
In [4]: x.set(True)
In [5]: x.get()
Out[5]: 1