4

我在 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)

是怎么回事?

帮我解决这个问题

目标我想将其用作与菜单中的复选按钮关联的变量

规格Linux mint 14、python 2.7、Tkinter 8.5

4

1 回答 1

6

简短的回答:root = tk.Tk()先打电话。


长答案:引发错误的行,

self._tk = master.tk

失败是因为masteris 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_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
于 2013-03-25T09:43:21.970 回答