2012-01-06 13 views
6
(versione di Python: 3.1.1)

Python Tkinter StringVar() errore sul init

Sto avendo un problema strano con StringVar in Tkinter. Durante il tentativo di mantenere costantemente aggiornato un widget Messaggio in un progetto, ho continuato a ricevere un errore durante il tentativo di creare la variabile. Sono passato a una shell python interattiva per indagare e questo è quello che ho ottenuto:

>>> 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' 
>>> 

Qualche idea? Ogni esempio ho visto su Tkinter mostra l'utilizzo di inizializzazione variabile con niente inviato al costruttore quindi sono in perdita, se mi manca qualcosa ...

risposta

10

StringVar ha bisogno di un maestro:

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

o più comunemente:

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

Quando si crea un'istanza Tk viene creato un nuovo interprete. Prima che nulla funziona:

>>> 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> 

Il problema con gli esempi che avete trovato è che probabilmente nella letteratura mostrano frammenti parziali che dovrebbero essere all'interno di una classe o in un programma più lungo in modo che le importazioni e altro codice sono non indicato esplicitamente.