初始化时遇到tkinter StringVar()错误

8 投票
1 回答
11848 浏览
提问于 2025-04-17 09:41

(Python版本:3.1.1)

我在使用tkinter中的StringVar时遇到了一个奇怪的问题。在一个项目中,我想不断更新一个消息框,但在创建这个变量时总是出错。于是我跳到一个交互式的Python环境中去调查,结果得到了这个:

>>> StringVar
<class 'tkinter.StringVar'>
>>> StringVar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python31\lib\tkinter\__init__.py", line 243, in __init__
    Variable.__init__(self, master, value, name)
  File "C:\Python31\lib\tkinter\__init__.py", line 174, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
>>>

有没有什么想法?我看到的每个tkinter使用示例都是在初始化变量时没有传递任何东西给构造函数,所以我不知道自己是不是漏掉了什么……

1 个回答

16

StringVar 需要一个主控对象:

>>> StringVar(Tk())
<Tkinter.StringVar instance at 0x0000000004435208>
>>> 

或者更常见的写法是:

>>> root = Tk()
>>> StringVar()
<Tkinter.StringVar instance at 0x0000000004435508>

当你创建 Tk 的时候,会生成一个新的解释器。在这之前,什么都不能用:

>>> from Tkinter import *
>>> StringVar()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 251, in __init__
    Variable.__init__(self, master, value, name)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 182, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
>>> root = Tk()
>>> StringVar()
<Tkinter.StringVar instance at 0x00000000044C4408>

你找到的例子的问题在于,文献中可能只展示了部分代码片段,这些代码片段应该是在一个类里面或者更长的程序中,所以导入的库和其他代码没有明确显示出来。

撰写回答