Ako prejsť premenná, do funkcie pripojené na tlačidlo pyqt5 python [zatvorené]

0

Otázka

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

"ja" je variabilný a nemôžem nájsť spôsob, ako kliknite na tlačidlo samostatne.name_label a potom sa pripojiť k funkcii a odovzdať v premennej "ja". keď som sa pokúsil spustiť to som si chybu

image of error

zdá sa, že premennú "i", nie je nahradený jedným z uhlíkov v rozmedzí zastúpená "i" a namiesto toho som list sa snaží byť odovzdaná.

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

Najlepšiu odpoveď

1

Ak chcete priradiť funkcie s argumentom potom môžete použiť lambda ak chcete vytvoriť funkciu bez argumentu

connect( lambda:open_browser(i) )

ale ak ho spustiť v slučky potom budete musieť tiež skopírovať hodnoty i do novej premennej.

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

Ak použijete priamo i potom všetky tlačidlá budú používať odkaz na premenná inie hodnoty z i - a nakoniec sa všetky tlačidlá budú mať rovnaké hodnoty - posledná hodnota priradená i v slučky.


Kód connect(open_browser(i)) ako funguje

result = open_browser(i) 
connect(result)

a pretože def open_browser() nepoužíva return tak to automaticky spustí return None a váš kód funguje ako

result = None
connect(result)

a máte

connect(None)

a neskôr sa chyba zobrazuje Unexpected type "NoneType"


BTW:

Ak používate for-slučku na vytvorenie objekty potom lepšie využitie list aby sa tieto objekty. Nie je potrebné exec() a to môže byť viac užitočné neskôr, pretože neskôr môžete použiť znova, for-slučky, na kontrolu všetkých objektov zo zoznamu.

Okrem toho, že vyzerá veľmi zvláštne, keď niekto je potrebné exec() ak chcete vytvoriť kód.

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

V iných jazykoch

Táto stránka je v iných jazykoch

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