Проблема с "StringVar" в программе Python

Я пытаюсь написать очень простой пользовательский интерфейс в Python с помощью Tkinter. Я столкнулся с небольшой проблемой с StringVar класса. Дело в том, что когда я запускаю скрипт python, я получаю ошибку в строке, которая инициализирует StringVar переменной. Я написал пример программы с этой проблемой, которую я хотел бы получить работу:

from Tkinter import *

var = StringVar()
var.set('test');

когда я запускаю его через python, я вижу эту ошибку:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    var = StringVar()
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 254, in __init__
    Variable.__init__(self, master, value, name)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 185, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
Exception AttributeError: "StringVar instance has no attribute '_tk'" in <bound method StringVar.__del__ of <Tkinter.StringVar instance at 0xb73cc80c>> ignored

у меня такое чувство, что это проблема с моей установкой Python, но может быть, я делаю что-то не так? Я использую python версии 2.6.5 на Ubuntu Linux, если это имеет значение.

2 ответов


Я думаю, вам может потребоваться вызвать TK() явно перед вызовом StringVar.

просто сделать это:

from Tkinter import *
Tk() # Add this
var = StringVar()
var.set('test');

Я никогда ничего не делал с Tkinter сам, но здесь похоже, что этот класс StringVar наследуется от базового класса переменных, как вы можете видеть в обратной трассировке с вызовом Variable.__init__(). Исключение было сделано с заявлением " self.tk = мастер.tk". Следующее сообщение об ошибке указывает, что этот параметр" master " не является типом и, следовательно, не будет иметь такого атрибута tk. Глядя на документацию Tkinter для StringVar здесь: http://epydoc.sourceforge.net/stdlib/Tkinter.StringVar-class.html

для параметра master по умолчанию установлено значение None. Похоже, master должен быть предоставлен как виджет, который может содержать этот StringVar (т. е. имеет ли смысл иметь StringVar, не связанный с виджетом?). Я бы сказал, что вам определенно нужно связать объект StringVar с виджетом, чтобы он имел атрибут "tk".