es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python: Añadir argumento opcional en la función on_clicked de un botón en matplotlib.

Hice una función de esa clase:

import matplotlib.pyplot as plt
from matplotlib.widgets import Button

def clicked(event):
    print("Botón presionado")

button_pos = plt.axes([0.2, 0.9, 0.1, 0.075])
b1 = Button(button_pos, 'Botón 1')
b1.on_clicked(clicked)
button_pos = plt.axes([0.2, 0.8, 0.1, 0.075])
b2 = Button(button_pos, 'Botón 2')
b2.on_clicked(clicked)
plt.show()

Mi objetivo ahora es agregar un segundo argumento a la función clicked. La función ahora tiene la siguiente forma:

import matplotlib.pyplot as plt
from matplotlib.widgets import Button

def clicked(event, text):
    print("Botón presionado"+text)


button_pos = plt.axes([0.2, 0.9, 0.1, 0.075])
b1 = Button(button_pos, 'Botón 1')
b1.on_clicked(clicked(text=" es el primero"))
button_pos = plt.axes([0.2, 0.8, 0.1, 0.075])
b2 = Button(button_pos, 'Botón 2')
b2.on_clicked(clicked)
b2.on_clicked(clicked(text=" es el segundo"))
plt.show()

Pero con ese cambio obtengo el siguiente mensaje de error:

Traceback (most recent call last):
  File "/bla/main.py", line 24, in <module>
    b1.on_clicked(clicked(text=" es el primero"))
TypeError: clicked() missing 1 required positional argument: 'event'

¿Hay alguna manera de agregar un segundo argumento en una función como esta o es necesario en Python hacer dos funciones on_clicked en ese caso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para agregar un segundo argumento a la función clickeada, es necesario utilizar una función lambda. La función lambda se puede definir dentro del método on_clicked y puede tomar el objeto de evento como su primer parámetro y cualquier otro parámetro deseado como parámetros subsiguientes. Así es como puedes modificar el código:

    import matplotlib.pyplot as plt
    from matplotlib.widgets import Button
    
    def clicked(event, texto):
        print("Botón presionado" + texto)
    
    posicion_botón = plt.axes([0.2, 0.9, 0.1, 0.075])
    b1 = Button(posicion_botón, 'Botón1')
    b1.on_clicked(lambda event: clicked(event, " es el primero"))
    posicion_botón = plt.axes([0.2, 0.8, 0.1, 0.075])
    b2 = Button(posicion_botón, 'Botón2')
    b2.on_clicked(lambda event: clicked(event, " es el segundo"))
    plt.show()
    

    En este código modificado, utilizamos una función lambda para pasar el objeto de evento y la cadena de texto deseada a la función clickeada. La función lambda toma sólo un parámetro – el objeto de evento – y lo pasa junto con el parámetro de texto deseado a la función clickeada.

Comments are closed.