Error en botones en tkinter python

Iniciado por v3ngad0rx, Marzo 20, 2020, 11:18:21 AM

Tema anterior - Siguiente tema

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

Marzo 20, 2020, 11:18:21 AM Ultima modificación: Marzo 22, 2020, 07:57:27 PM por Gabriela
Que tal usuarios de undercode. tengo el siguiente problema, me pudrian ayudar porfavor.

Intento decirle a  un boton que tenga como accion una funcion.
Código: python
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.

Código: python
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.
Código: python
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.


@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

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:

Código: python
        ...
        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:

Código: python
        ...
        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:

Código: python
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:

Código: python
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
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF