Jak przekazać zmienną do funkcji, podłączony do przycisku pyqt5 python [zamknięte]

0

Pytanie

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

"i" - jest to zmienna, i nie mogę znaleźć sposób, aby nacisnąć przycisk self.name_label, a następnie podłączyć ją do funkcji i przekazać zmienną "i". gdy próbowałem go uruchomić, otrzymałem komunikat o błędzie

image of error

wygląda na to, że zmienna "i" jest nie zastąpiona jedną z liczb w zakresie przedstawionym przez "i", i zamiast i litera próbuje być przekazana.

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

Najlepsza odpowiedź

1

Jeśli chcesz przypisać funkcję z argumentem, można użyć lambda aby utworzyć funkcję bez argumentu

connect( lambda:open_browser(i) )

ale jeśli go uruchomić w pętli, konieczne może również skopiować wartość i do nowej zmiennej.

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

Jeśli używasz bezpośrednio i wtedy wszystkie przyciski będą korzystać link do zmiennej ia nie wartości z i - i wreszcie, wszystkie przyciski otrzymają taką samą wartość - ostatnia wartość przypisana i w pętli.


Kod connect(open_browser(i)) działa jak

result = open_browser(i) 
connect(result)

i dlatego, że def open_browser() nie używa return w ten sposób, że uruchamia się automatycznie return None i twój kod działa tak

result = None
connect(result)

i masz

connect(None)

i nowsza błąd pokazuje Unexpected type "NoneType"


Przy OKAZJI:

Jeśli używasz for-cykl dla tworzenia obiektów, a następnie wykorzystać lepiej list aby zapisać te przedmioty. Nie ma takiej potrzeby exec() i to może być bardziej przydatne później, bo później będziesz mógł go użyć ponownie for-cykl do sprawdzenia wszystkich obiektów z listy.

Do tego wygląda bardzo dziwnie, kiedy ktoś musi exec() do tworzenia kodu.

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

W innych językach

Ta strona jest w innych językach

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