4

私はこれをPythonシェル内で行いました:

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)

が起こっているのですか?

この問題で私を助けてください

目標これをメニューのチェックボタンに関連付けられた変数として使用したい

仕様Linuxmint14、python 2.7、Tkinter 8.5

4

1 に答える 1

6

簡単な答え: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限り、これはデフォルトです)。でマスターが明示的に設定されていない場合、はウィジェットのマスターとして使用されます。useTkTrue_default_rootBooleanVartk.BooleanVar(master)

したがって、要約すると、を呼び出すか、またはを呼び出す前root = tk.Tk()に設定するのと同様の何かを行うか、最初の引数として明示的なマスターウィジェットを渡します。_default_roottk.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 に答える