Rellenar una caja de tkinter "Entry" sin botones

Iniciado por PUAROT, 13 Julio 2016, 13:51 PM

0 Miembros y 1 Visitante están viendo este tema.

PUAROT

  Muy buenas, a ver si soy capaz de explicarme bien

Estoy intentando hacer una pequeña interface gráfica en tkinter y ando loco intentando que en un Entry (caja de texto ) aparezca el resultado de una operación pero sin botones.

El siguiente código, coge el numero que le pongamos en la caja1 y cuando pulsamos el botón, rellena la caja2 con el resultado de la operación asignada. cada caja esta asignada a un IntVar diferente.

Si yo asigno las dos cajas a una sola variable sin realizar operación ninguna, osea los dos Entry a un solo IntVar() lo que escribas en el primero se va actualizando y va apareciendo en el segundo, bien pues eso es lo quiero yo hacer, que se actualice conforme vaya escribiendo el numero en la primera caja vaya apareciendo en la segunda el resultado de la operación.

He probado a ponerle al entry  el update_idletasks() pero no ha servido o no se utilizarlo bien, he probado a poner ventana.update  y tampoco

Gracias de antemano !



from tkinter import *

#Ventana
ventana = Tk()
ventana.geometry("640x490")

#Variables
var1= IntVar()
var2= IntVar()

#Labels
etiquetaBinario = Label(ventana,text="Numero",font= ("Times",16)).place(x=20,y=200)
etiquetaOctal = Label(ventana,text="Convertido",font= ("Times",16)).place(x=20,y=240)


#Entry
caja1 = Entry(ventana.update_idletasks(),textvariable=var1,width=24).place(x=110,y=200)
caja2 = Entry(ventana.update_idletasks(),textvariable=var2,width=24,state=DISABLED).place(x=110,y=240)
def cambio():
    numero = var1.get() + 2
    var2.set(numero)

boton1 = Button(ventana,text="  OK  ", command=cambio ).place(x=350,y=350)


tincopasan

no sé si entendí bien, ¿lo que buscas es que al escribir en el entry 1 se vaya viendo el resultado en el entry2?

si es eso, modifique un poco tu script así lo probás.Por cierto seguro hay muchas formas de hacerlo, pero en este caso te muestro el método trace

Código (python) [Seleccionar]
from tkinter import *

def callback(var1):
    var2.set(int(var1.get())+2)

ventana = Tk()
ventana.geometry("640x490")

var1 = StringVar()
var1.trace("w", lambda name, index, mode, var1=var1: callback(var1))
var2 = StringVar()


#Labels
etiquetaBinario = Label(ventana,text="Numero",font= ("Times",16)).place(x=20,y=200)
etiquetaOctal = Label(ventana,text="Convertido",font= ("Times",16)).place(x=20,y=240)
#Entrys
caja1 = Entry(ventana, textvariable=var1,width=24).place(x=110,y=200)
caja2 = Entry(ventana,textvariable=var2,width=24,state=DISABLED).place(x=110,y=240)
ventana.mainloop()


si no era eso, perdón, soy muy perro!con perdón de los perros.
Saludos

PUAROT

Muchas gracias por la rapidez en contestar !!! ;-) ;-)

Efectivamente es lo que quiero, pero estoy un poco desconcertado  :o , en la documentación que tengo como por ejemplo http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html no encuentro por ningún lado la existencia de ese trace()

Me podrías indicar un sitio mas completo donde consultar la documentación de tkinter ?

Por otra parte conozco la existencia de lambda pero es un concepto que no he llegado a entender ni a saber utilizar me lo podrías explicar? es mucho pedir?

Muchas gracias !!!!  ;-) ;-) ;-) ;-)

tincopasan

soy muy malo explicando cosas que están recontra explicadas (hay toneladas de tutoriales), pero bueno, lo haré de la forma más simple que pueda.
suponete este código:
Código (python) [Seleccionar]

def cuadrado():
    b=[]              #lista vacia   
    for x in a:       #recorro cada uno de los elementos
        x= x*x        # a cada elemento le doy el valor de multiplicarse por si
        b.append(x)   #agrego a la lista vacia el valor obtenido
    print(b)
cuadrado()   



es totalmente entendible si sabés de funciones y listas
que nos dará:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


pero... podríamos simplificarlo de muchas formas faciles, en este caso usaré map y lambda

Código (python) [Seleccionar]

print(list(map(lambda x:x*x, a)))



que también dará:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

y que dice:
list(paso a  una  lista)
map(retorna cada valor de una lista y necesita 2 argumentos)1)una funcion, en este caso reemplazada por lambda que es una funcion de una sola linea!
lambda x=nombre de la variable de cada elemento : x*x es la operación de cada uno
a = la lista a leer

algo muy simple pero es lo mismo:
Código (python) [Seleccionar]

def suma(a,b):
return a + b

lambda a,b: a+b




insisto que hay demasiados tutoriales, busca en youtube y repetí cada uno hasta que veas como funciona.

Con respecto a trace, es de python no de tkinter.


PUAROT

Muchas gracias otra vez :-)

Buscaré mas información de trace() en python para enterarme de que hace, como funciona y como se utiliza jejee

Las funciones y las listas si las entiendo, y he deducido que tienes una lista llamada a con numeros del 1 al 10 pero con respecto a lambda pues me ha quedado algo mas claro que antes, pero bajo mi punto de vista de un neófito, le quita mucha legibilidad al código, supongo que será como todo, cuando haya visto un millon... pero ahora mismo no pillo lo que hace lambda en la primera respuesta que me has dado 

Ahora tocará hacer pruebas con el código y ver los posibles errores y resultados para ver si soy capaz de entenderlo y utilizarlo jejeje

Muchas gracias otra vez !