Cómo pasar una variable en una función conectado a un botón pyqt5 python [cerrado]

0

Pregunta

def open_browser(i):
            print("open")

 for i in range(5):
     new_name_label = 'name_label'+str(i)
     list_names.append(new_name_label)
     setattr(self, list_names[i], QPushButton(str(ordered_names[i]),self))
     exec(f'self.name_label{i}.setGeometry(250,{y_axis_name},340,110)')
     exec(f'self.name_label{i}.clicked.connect(open_browser({i}))')
     y_axis_name= y_axis_name + 110

"yo" es una variable y no puedo encontrar una manera de hacer clic en el botón auto.name_label y, a continuación, conectarlo a una función y pasar en la variable "i". cuando intento ejecutarlo me sale el error

image of error

parece que la variable "i" no está siendo reemplazado por uno de los números en el rango representado por la "i" y en su lugar me la carta está tratando de ser pasado.

pyqt5 python
2021-11-22 17:19:19
1

Mejor respuesta

1

Si desea asignar la función con el argumento, a continuación, puede utilizar lambda para crear la función sin argumento

connect( lambda:open_browser(i) )

pero si se ejecuta en el bucle, a continuación, usted puede necesitar también para copiar el valor de i a la nueva variable.

connect( lambda x=i:open_browser(x) )

Si utiliza directamente i todos los botones se utilizan referencia a la variable i, no los valores de i - y por último, todos los botones se obtiene el mismo valor último valor asignado a i en el bucle.


Código connect(open_browser(i)) funciona como

result = open_browser(i) 
connect(result)

y porque def open_browser() no uso return por lo que se ejecuta automáticamente return None y el código funciona como

result = None
connect(result)

y usted tiene

connect(None)

y después de error de la muestra Unexpected type "NoneType"


BTW:

Si usted utiliza for-bucle para crear objetos, a continuación, un mejor uso list para mantener estos objetos. No es necesario exec() y puede ser más útiles más adelante -, porque más adelante puede utilizar de nuevo for-bucle para comprobar que todos los objetos de la lista.

Además se ve muy extraña cuando alguien necesita exec() para crear el código.

self.buttons = []

for i in range(5):
     b = QPushButton(str(ordered_names[i]), self)
     b.setGeometry(250, y_axis_name, 340, 110)
     b.clicked.connect( lambda x=i:open_browser(x) )

     self.buttons.append( b )

     y_axis_name += 110     
2021-11-22 21:28:58

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................