Que tal usuarios de undercode. tengo el siguiente problema, me pudrian ayudar porfavor.
Intento decirle a un boton que tenga como accion una funcion.
self.accion = Button(text='Mensaje', command=self.impr_datos(informacion))
si se dan cuenta esta funcion recibe un parametro el cual lo agrego desde el constructor.
from tkinter import *
# parametro que vamos a tecibir
cliente = ['Juan', 18, 'Basica']
class Test():
def __init__(self, informacion):
El codigo completo queda de esta manera.
from tkinter import *
# parametro que vamos a tecibir
cliente = ['Juan', 18, 'Basica']
class Test():
def __init__(self, informacion):
self.ventana = Tk()
self.ventana.geometry('500x500')
self.ventana.title('con clases')
self.accion = Button(text='Mensaje', command=self.impr_datos(informacion))
self.accion.pack()
self.ventana.mainloop()
def mensaje(self):
print('Alerta buena', 'con exito')
def impr_datos(self, datos_cliente):
print('Nombre: {}'.format(datos_cliente[0]))
print('Edad: {}'.format(datos_cliente[1]))
print('Suscripcion: {}'.format(datos_cliente[2]))
comando = Test(cliente)
al momento que le asigno el metodo "mensaje" se ejecuta sin ningun problema... primero la ventana y caca vez que doy click en el boton pues logicamente llama el metodo, pero al momento que le asigno el metodo "impr_datos" cuando le doy ejecutar se me ejecuta primero el metodo "impr_datos", posterior ya aparece la ventana y todo, le doy click en el boton y ya no ejecuta el metodo.
me prodrian ayudar.
@v3ngad0rx (https://underc0de.org/foro/index.php?action=profile;u=92788)
Es simple, está ejecutando la función en vez de pasarla. Lo explico mejor con el mismo código:
El siguiente código está mal:
...
self.accion = Button(text='Mensaje', command=self.impr_datos(informacion))
...
Cómo puede observar no está pasando la referencia a la función en sí, en su lugar está pasando el valor retornado, lo cual es 'None', para pasar la referencia haga lo siguiente:
...
self.accion = Button(text='Mensaje', command=self.impr_datos)
...
-Pero... ¿Cómo hago para pasar datos a la función de tkinter llamada 'Button' en mi callback?-, dirá usted, pero hay dos maneras (al menos mis soluciones para su problema). La primera es más fácil pero no recomendable para sub-procesos (hilos), al menos que se desee y la segunda yo se la recomiendo si va a usar o no sub-procesos.
Solución #1:
from tkinter import *
# parametro que vamos a tecibir
cliente = ['Juan', 18, 'Basica']
class Test():
def __init__(self, informacion):
self.ventana = Tk()
self.ventana.geometry('500x500')
self.ventana.title('con clases')
self.accion = Button(text='Mensaje', command=self.impr_datos)
self.accion.pack()
self.ventana.mainloop()
def mensaje(self):
print('Alerta buena', 'con exito')
def impr_datos(self):
datos_cliente = cliente
print('Nombre: {}'.format(datos_cliente[0]))
print('Edad: {}'.format(datos_cliente[1]))
print('Suscripcion: {}'.format(datos_cliente[2]))
comando = Test(cliente)
Solución #2:
from tkinter import *
# parametro que vamos a tecibir
cliente = ['Juan', 18, 'Basica']
class Test():
def __init__(self, informacion):
self.ventana = Tk()
self.ventana.geometry('500x500')
self.ventana.title('con clases')
self.accion = Button(text='Mensaje', command=lambda: self.impr_datos(cliente))
self.accion.pack()
self.ventana.mainloop()
def mensaje(self):
print('Alerta buena', 'con exito')
def impr_datos(self, datos_cliente):
print('Nombre: {}'.format(datos_cliente[0]))
print('Edad: {}'.format(datos_cliente[1]))
print('Suscripcion: {}'.format(datos_cliente[2]))
comando = Test(cliente)
~ DtxdF