Cum să treacă o variabilă într-o funcție conectat la un buton pyqt5 python [închis]

0

Problema

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

"eu" este o variabilă și nu pot găsi o modalitate de a faceți clic pe butonul auto.name_label și apoi conectați-vă că pentru o funcție și să treacă în variabila "i". când am încercat să-l rulați primesc eroarea

image of error

se pare că variabila "i" nu este înlocuit de unul dintre numere în intervalul reprezentat de "eu" și în loc să am scrisoarea este încercarea de a fi trecut în.

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

Cel mai bun răspuns

1

Dacă doriți să atribuiți funcția cu argument, atunci puteți folosi lambda pentru a crea funcția fara argument

connect( lambda:open_browser(i) )

dar dacă tu a alerga în buclă atunci ai putea avea nevoie, de asemenea, să copiați valoarea i pentru noua variabilă.

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

Dacă utilizați direct i apoi toate butoanele vor folosi referire la variabile i, nu valori de la i - și în cele din urmă toate butoanele vor obține aceeași valoare - ultima valoare atribuită i în buclă.


Cod connect(open_browser(i)) funcționează ca

result = open_browser(i) 
connect(result)

și pentru că def open_browser() nu utilizați return deci, se execută automat return None și codul funcționează ca

result = None
connect(result)

și ai

connect(None)

și mai târziu, spectacole de eroare Unexpected type "NoneType"


BTW:

Dacă utilizați for-bucla pentru a crea obiecte, apoi o mai bună utilizare list pentru a păstra aceste obiecte. Ea nu are nevoie de exec() și acesta poate fi mai util mai târziu - pentru că mai târziu, puteți utiliza din nou for-bucla pentru a verifica toate obiectele din lista.

În plus se pare foarte ciudat când cineva nevoie exec() pentru a crea cod.

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

În alte limbi

Această pagină este în alte limbi

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