2011-08-03 9 views
6

Próbuję napisać bardzo prosty interfejs użytkownika w Pythonie za pomocą Tkinter. Wystąpił mały problem z klasą StringVar. Problem polega na tym, że po uruchomieniu skryptu Pythona pojawia się błąd w linii, która inicjuje zmienną StringVar. Napisałem program próbki z tej kwestii, które chciałbym, aby dostać pracę:Problem z "StringVar" w Python Program

from Tkinter import * 

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

Kiedy uruchamiam go przez pytona widzę ten błąd:

$ 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 

Mam wrażenie, że jest to problem z moją instalacją w Pythonie, ale może być tak, że robię coś nie tak? Używam Pythona w wersji 2.6.5 na Ubuntu Linux, jeśli to robi różnicę.

Odpowiedz

10

Myślę, że może być konieczne jawne wywołanie funkcji Tk() przed wywołaniem StringVar.

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

Dlaczego trzeba zadzwonić 'Tk()' wyraźnie przed utworzeniem 'StringVar' obiektu:

Wystarczy to zrobić? – nbro

1

Ja sam nigdy nie zrobiłem nic z Tkinter, ale tutaj wygląda na to, że klasa StringVar dziedziczy z podstawowej klasy Variable, jak widać w systemie traceback z wywołaniem na Variable.__init__(). Wyjątek został podniesiony za pomocą instrukcji "self.tk = master.tk". Poniższy komunikat o błędzie wskazuje, że ten parametr "główny" to NoneType, a zatem nie ma takiego atrybutu tk. Przeglądając dokumentację Tkintera dla StringVar tutaj: http://epydoc.sourceforge.net/stdlib/Tkinter.StringVar-class.html

parametr główny jest ustawiony jako domyślny na Brak. Wygląda na to, że master powinien być dostarczony jako widget, który może zawierać tę wartość StringVar (tzn. Czy ma sens mieć StringVar nie skojarzoną z widżetem?). Muszę powiedzieć, że zdecydowanie powinieneś powiązać obiekt StringVar z widżetem, aby miał atrybut "tk".

Powiązane problemy