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.


@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
~ DtxdF