Comment passer une variable dans une fonction reliée à un bouton pyqt5 python [fermé]

0

La question

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

"je" est une variable et je ne peux pas trouver un moyen de cliquer sur le bouton auto.name_label et puis le connecter à une fonction et passer dans la variable "i". quand j'ai tenté de l'exécuter, je reçois l'erreur

image of error

il semble que la variable "i" ne doit pas être remplacé par l'un des nombres de la plage représentée par le "je" et à la place j'ai la lettre est d'essayer d'être passée.

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

La meilleure réponse

1

Si vous souhaitez affecter une fonction avec l'argument, alors vous pouvez utiliser lambda pour créer la fonction sans argument

connect( lambda:open_browser(i) )

mais si vous l'exécutez en boucle, vous pouvez également copier la valeur i pour la nouvelle variable.

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

Si vous utilisez directement i ensuite, tous les boutons de référence pour la variable i, pas les valeurs de i - et enfin, tous les boutons d'obtenir la même valeur de la dernière valeur affectée à i dans la boucle.


Code connect(open_browser(i)) fonctionne comme

result = open_browser(i) 
connect(result)

et parce que def open_browser() ne pas utiliser return de sorte qu'il s'exécute automatiquement return None et votre code fonctionne comme

result = None
connect(result)

et vous avez

connect(None)

et plus tard de l'erreur montre Unexpected type "NoneType"


BTW:

Si vous utilisez for-boucle pour créer des objets, puis une meilleure utilisation list pour garder ces objets. Il n'a pas besoin exec() et il peut être plus utile plus tard - parce que plus tard, vous pouvez utiliser à nouveau for-boucle pour vérifier tous les objets de la liste.

En outre, il semble très étrange lorsque quelqu'un a besoin exec() pour créer un code.

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

Dans d'autres langues

Cette page est dans d'autres langues

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