Jak předat proměnné do funkce připojená k tlačítku pyqt5 python [uzavřen]

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

"já" je variabilní a nemůžu najít způsob, jak klepněte na tlačítko vlastní.name_label a pak připojte že do funkce a předat v proměnné "já". když jsem se pokusil jej spustit, dostanu chybu

image of error

zdá se, že proměnná "i" je nahrazena jedno z čísel v rozsahu zastoupena "já" a místo toho jsem dopis se snaží být předány.

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

Nejlepší odpověď

1

Pokud chcete přiřadit funkci s argumentem, pak můžete použít lambda vytvořit funkce bez argumentu

connect( lambda:open_browser(i) )

ale pokud jej běžet ve smyčce pak budete potřebovat také zkopírovat hodnotu i do nové proměnné.

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

Pokud používáte přímo i pak všechna tlačítka bude používat odkaz na proměnnou ine hodnoty z i - a konečně, všechny tlačítka budou mít stejná hodnota - poslední hodnota přiřazena i ve smyčce.


Kód connect(open_browser(i)) pracuje jako

result = open_browser(i) 
connect(result)

a protože def open_browser() nepoužívá return tak se to automaticky spustí return None a váš kód funguje jako

result = None
connect(result)

a máte

connect(None)

a později chybové ukazuje, Unexpected type "NoneType"


BTW:

Pokud používáte for-smyčky vytvářet objekty, které pak lepší použít list udržet tyto objekty. To nepotřebuje exec() a to může být užitečné později, protože později můžete použít znovu for-smyčky zkontrolujte, zda všechny objekty ze seznamu.

Kromě toho to vypadá velmi zvláštní, když někdo potřebovat exec() vytvořit 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 jiných jazycích

Tato stránka je v jiných jazycích

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