2013-03-25 93 views
2

我这样做蟒蛇壳内:布尔变量在使用TKinter 8.5

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) 

什么正在进行?

能帮我解决这个问题

目标我想用这个作为有检查按钮在菜单

规格 Linux Mint的14,蟒蛇2.7,Tkinter的相关变量8.5

回答

4

简答题:首先拨打root = tk.Tk()


龙答: 是提高误差线,

self._tk = master.tk 

失败,因为masterNone。然而,看代码(在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_rootBooleanVar用作小部件的主人,如果没有明确设置主人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