Error en botones en tkinter python

  • 1 Respuestas
  • 182 Vistas

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

Desconectado v3ngad0rx

  • *
  • Underc0der
  • Mensajes: 27
  • Actividad:
    0%
  • Reputación 0
  • https://cdn2.ticbeat.com/src/uploads/2018/01/hacke
    • Ver Perfil

Error en botones en tkinter python

  • en: Marzo 20, 2020, 11:18:21 am
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
  1. 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
  1. from tkinter import *
  2.  
  3. # parametro que vamos a tecibir
  4. cliente = ['Juan', 18, 'Basica']
  5.  
  6. class Test():
  7.     def __init__(self, informacion):

El codigo completo queda de esta manera.
Código: Python
  1. from tkinter import *
  2.  
  3. # parametro que vamos a tecibir
  4. cliente = ['Juan', 18, 'Basica']
  5.  
  6. class Test():
  7.     def __init__(self, informacion):
  8.         self.ventana =  Tk()
  9.         self.ventana.geometry('500x500')
  10.         self.ventana.title('con clases')
  11.         self.accion = Button(text='Mensaje', command=self.impr_datos(informacion))
  12.         self.accion.pack()
  13.         self.ventana.mainloop()
  14.  
  15.  
  16.     def mensaje(self):
  17.         print('Alerta buena', 'con exito')
  18.        
  19.     def impr_datos(self, datos_cliente):
  20.         print('Nombre: {}'.format(datos_cliente[0]))
  21.         print('Edad: {}'.format(datos_cliente[1]))
  22.         print('Suscripcion: {}'.format(datos_cliente[2]))
  23.        
  24.  
  25.  
  26. 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.

« Última modificación: Marzo 22, 2020, 07:57:27 pm por Gabriela »

Conectado DtxdF

  • *
  • Moderator
  • Mensajes: 679
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:Error en botones en tkinter python

  • en: Marzo 24, 2020, 08:42:38 am
@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
  1.         ...
  2.         self.accion = Button(text='Mensaje', command=self.impr_datos(informacion))
  3.         ...

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
  1.         ...
  2.         self.accion = Button(text='Mensaje', command=self.impr_datos)
  3.         ...

-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
  1. from tkinter import *
  2.  
  3. # parametro que vamos a tecibir
  4. cliente = ['Juan', 18, 'Basica']
  5.  
  6. class Test():
  7.     def __init__(self, informacion):
  8.         self.ventana =  Tk()
  9.         self.ventana.geometry('500x500')
  10.         self.ventana.title('con clases')
  11.         self.accion = Button(text='Mensaje', command=self.impr_datos)
  12.         self.accion.pack()
  13.         self.ventana.mainloop()
  14.  
  15.  
  16.     def mensaje(self):
  17.         print('Alerta buena', 'con exito')
  18.        
  19.     def impr_datos(self):
  20.         datos_cliente = cliente
  21.         print('Nombre: {}'.format(datos_cliente[0]))
  22.         print('Edad: {}'.format(datos_cliente[1]))
  23.         print('Suscripcion: {}'.format(datos_cliente[2]))
  24.        
  25.  
  26.  
  27. comando = Test(cliente)

Solución #2:

Código: Python
  1. from tkinter import *
  2.  
  3. # parametro que vamos a tecibir
  4. cliente = ['Juan', 18, 'Basica']
  5.  
  6. class Test():
  7.     def __init__(self, informacion):
  8.         self.ventana =  Tk()
  9.         self.ventana.geometry('500x500')
  10.         self.ventana.title('con clases')
  11.         self.accion = Button(text='Mensaje', command=lambda: self.impr_datos(cliente))
  12.         self.accion.pack()
  13.         self.ventana.mainloop()
  14.  
  15.  
  16.     def mensaje(self):
  17.         print('Alerta buena', 'con exito')
  18.        
  19.     def impr_datos(self, datos_cliente):
  20.         print('Nombre: {}'.format(datos_cliente[0]))
  21.         print('Edad: {}'.format(datos_cliente[1]))
  22.         print('Suscripcion: {}'.format(datos_cliente[2]))
  23.        
  24.  
  25.  
  26. comando = Test(cliente)

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

 

[DUDA] Aprendo Python y tengo una duda

Iniciado por EXUMER

Respuestas: 2
Vistas: 1737
Último mensaje Noviembre 26, 2018, 01:27:32 pm
por <<Pyromaniac>>
[SOLUCIONADO] Correr paso a paso un Script de Python

Iniciado por Olger346

Respuestas: 2
Vistas: 2441
Último mensaje Febrero 11, 2018, 10:36:44 am
por Olger346
[SOLUCIONADO] Python Invalid Syntax "->"

Iniciado por DonPython

Respuestas: 1
Vistas: 488
Último mensaje Marzo 09, 2020, 01:46:47 pm
por DtxdF
[SOLUCIONADO] como usar en end = " ". En Python

Iniciado por oswil

Respuestas: 2
Vistas: 1696
Último mensaje Octubre 06, 2019, 08:53:11 pm
por oswil
Error con ffmpeg en android con android studio

Iniciado por $francisco

Respuestas: 6
Vistas: 4942
Último mensaje Mayo 16, 2015, 12:52:46 pm
por $francisco