2016-05-20 2 views
1

Considérez ce code:Python Tkinter Entrée ne montrant pas la valeur actuelle de textvariable

from tkinter import * 
from tkinter.ttk import * 

tk=Tk() 

def sub(): 
    var=StringVar(value='default value') 

    def f(): pass 

    Entry(tk,textvariable=var).pack() 
    Button(tk,text='OK',command=f).pack() 

sub() 
mainloop() 

Nous nous attendons à la valeur de var apparaît dans l'entrée, mais en réalité il ne fonctionne pas.

nothing in the entry

La chose étrange est que si je mets la déclaration var.get() dans la fonction de rappel du bouton, la valeur de var apear.

the value appeared

Est-ce un bug causé par une sorte d'optimisation variable locale en Python? Et que puis-je faire pour m'assurer que la valeur de textvariable apparaîtra toujours dans l'entrée?

Veuillez m'excuser pour mon mauvais anglais.

+0

Il y a une solution à ce problème, mais vous voudrez peut-être envisager d'utiliser un '_not_ StringVar'; ils sont rarement nécessaires. Vous pouvez obtenir et définir la valeur via des méthodes sur le widget lui-même. –

Répondre

2

Les ordures sont collectées.

Vous pouvez simplement vous débarrasser de la fonction (vous aussi ne devrait pas imbriquer des fonctions comme celui-ci)

from tkinter import * 
from tkinter.ttk import * 

tk=Tk() 

var=StringVar(value="default value") 
Entry(tk, textvariable=var).pack() 
Button(tk,text='OK').pack() 

mainloop() 

Ou, si vous voulez garder la fonction .. définir la stringvar comme un attribut de tk ou rends-le global.

Rendre mondiale:

from tkinter import * 
from tkinter.ttk import * 

tk=Tk() 
var = StringVar(value="Default value") 

def sub(): 

    Entry(tk, textvariable=var).pack() 
    Button(tk,text='OK').pack() 

sub() 
mainloop() 

comme un attribut de tk:

from tkinter import * 
from tkinter.ttk import * 

tk=Tk() 

def sub(): 

    tk.var = StringVar(value="Default value") 
    Entry(tk, textvariable=tk.var).pack() 
    Button(tk,text='OK').pack() 

sub() 
mainloop()