Pyqt5 python düğmesine bağlı bir işleve bir değişken nasıl iletilir [kapalı]

0

Soru

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 "bir değişkendir ve self.name_label düğmesini tıklatmanın ve bunu bir işleve bağlamanın ve" i " değişkenini iletmenin bir yolunu bulamıyorum. çalıştırmayı denediğimde hatayı alıyorum

image of error

"i" değişkeninin "i" ile temsil edilen aralıktaki sayılardan biriyle değiştirilmediği ve bunun yerine harfin aktarılmaya çalışıldığı anlaşılıyor.

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

En iyi cevabı

1

Bağımsız değişkenli bir işlev atamak istiyorsanız, şunları kullanabilirsiniz lambda bağımsız değişken olmadan işlev oluşturmak için

connect( lambda:open_browser(i) )

ancak döngüde çalıştırırsanız, değeri de kopyalamanız gerekebilir i yeni değişkene.

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

Doğrudan kullanırsanız i daha sonra tüm düğmeler değişkene referans kullanacaktır i, gelen değerler değil i - ve son olarak, tüm düğmeler aynı değeri alacak - atanan son değer i döngü içinde.


Kod connect(open_browser(i)) olarak çalışır

result = open_browser(i) 
connect(result)

ve çünkü def open_browser() kullanmıyor return böylece otomatik olarak çalışır return None ve kodunuz şu şekilde çalışır

result = None
connect(result)

ve sende

connect(None)

ve daha sonra hata gösterir Unexpected type "NoneType"


BTW:

Eğer kullanırsanız for- nesneleri oluşturmak için döngü daha sonra daha iyi kullanın list bu nesneleri saklamak için. İhtiyaç duymadığını exec() ve daha sonra daha kullanışlı olabilir - çünkü daha sonra tekrar kullanabilirsiniz for- listeden tüm nesneleri kontrol etmek için döngü.

Ayrıca, birinin ihtiyacı olduğunda çok garip görünüyor exec() kod oluşturmak için.

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

Diğer dillerde

Bu sayfa diğer dillerde

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