2011-07-01 27 views

Respuesta

50

Agregue un Tkinter StringVar a su widget de Entrada. Enlace su devolución de llamada a StringVar usando el método de rastreo.

from Tkinter import * 

def callback(sv): 
    print sv.get() 

root = Tk() 
sv = StringVar() 
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv)) 
e = Entry(root, textvariable=sv) 
e.pack() 
root.mainloop() 
+0

Perfecto, gracias! – bfops

+0

Su solución no parece funcionar con el componente "propio". – Nicholas

+0

@Nicholas: el ejemplo de código funciona tal cual. ¿Qué encuentras que falta? –

8

Gracias Steven! El Tkinter Folklore de Russell Owen explica cómo obtener el valor de StringVar directamente del argumento de nombre (PY_VAR #) usando globalgetvar(), pero no cómo asignar el nombre a un widget. Su método lambda para cambiar los argumentos de devolución de llamada es como magia (para nosotros los novatos de Python, al menos).

Cuando hay más de una entrada, a menudo es necesario conocer no solo el valor, sino también la entrada que se modificó. Ampliando ligeramente el ejemplo de Steven, el siguiente (Python3) pasa un índice que se puede utilizar para realizar un seguimiento de múltiples entradas.

from tkinter import Tk, Frame, Label, Entry, StringVar 

class fruitlist: 
    def entryupdate(self, sv, i): 
     print(sv, i, self.fruit[i], sv.get()) 

    def __init__(self, root): 
     cf = Frame(root) 
     cf.pack() 
     self.sva = [] 
     self.fruit = ("Apple", "Banana", "Cherry", "Date") 
     for f in self.fruit: 
      i = len(self.sva) 
      self.sva.append(StringVar()) 
      self.sva[i].trace("w", lambda name, index, mode, var=self.sva[i], i=i: 
           self.entryupdate(var, i)) 
      Label(cf, text=f).grid(column=2, row=i) 
      Entry(cf, width=6, textvariable=self.sva[i]).grid(column=4, row=i) 

root = Tk() 
root.title("EntryUpdate") 
app = fruitlist(root) 
root.mainloop() 
6

En el momento de escribir (2017, Python 3.6, tkinter versión 8.6.6) los documentos sugieren que .trace está en desuso. La forma sugerida ahora parece ser:

sv.trace_add("write", callback) 

Esto funciona muy bien si desea notificación siempre que se cambie la variable. Sin embargo, mi aplicación solo quiere una notificación cuando el usuario termina de editar el texto. He encontrado que llevan a cuestas en el mecanismo de "validación" para trabajar bien aquí:

from tkinter import * 

root = Tk() 
sv = StringVar() 

def callback(): 
    print(sv.get()) 
    return True 

e = Entry(root, textvariable=sv, validate="focusout", validatecommand=callback) 
e.grid() 
e = Entry(root) 
e.grid() 
root.mainloop() 

Esto invocará callback cada vez que el widget de entrada pierde el foco (he añadido un widget segunda entrada por lo que el primero uno realmente puede perder el foco!)

0

conozco otra variante. antes de introducir el código, se podría explicar mejor camino de codificación: Reed aquí http://stupidpythonideas.blogspot.com/2013/12/tkinter-validation.html?view=classic

y no es mi código:

from Tkinter import * 
 

 
class ttt: 
 
    def __init__(self): 
 
     self.str1 = StringVar() 
 
     self.e1 = Entry(root, textvariable=self.str1) 
 
     self.str1.trace('w', self.callback_1) 
 
     self.e1.pack() 
 
     
 
     self.str2 = StringVar() 
 
     self.e2 = Entry(root, textvariable=self.str2, state='readonly') 
 
     self.e2.pack() 
 
     
 
     self.str3 = StringVar() 
 
     self.e3 = Entry(root, textvariable=self.str3, state='readonly') 
 
     self.e3.pack() 
 
     
 
     bt = Button(root, text = 'ещё', command = self.callback_2) 
 
     bt.pack() 
 
    
 
    def callback_1(self, name='', index='', mode=''): 
 
     tmp = self.str1.get() 
 
     if tmp: 
 
     self.str2.set(int(tmp) * 6) 
 
     print self.str2.get() 
 
    
 
    def callback_2(self, name='', index='', mode=''): 
 
     tmp = self.str1.get() 
 
     if tmp: 
 
     self.str3.set(int(tmp) * 6) 
 
     print self.str3.get() 
 

 
root = Tk() 
 
t = ttt() 
 
root.mainloop()

hay 2 variantes: mediante el botón de prensa y entrar a la entrada ahora puede seleccionar cualquier variante

Cuestiones relacionadas