Come passare una variabile in una funzione collegata ad un pulsante pyqt5 python [chiuso]

0

Domanda

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

"io" è una variabile e non riesco a trovare un modo per fare clic sul pulsante auto.name_label e quindi collegare ad una funzione e passare la variabile "i". quando ho tentato di eseguire ottengo l'errore

image of error

sembra che la variabile "i" non è per essere sostituito da uno dei numeri nell'intervallo rappresentato da "i" e invece ho la lettera è cercando di essere passata.

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

Migliore risposta

1

Se si desidera assegnare la funzione con argomento quindi è possibile utilizzare lambda per creare una funzione senza argomenti

connect( lambda:open_browser(i) )

ma se si esegue in loop, quindi potrebbe essere necessario anche per copiare il valore i per nuova variabile.

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

Se si utilizza direttamente i quindi tutti i tasti riferimento alla variabile inon valori i - e, infine, tutti i pulsanti ottenere lo stesso valore - ultimo valore assegnato a i in loop.


Codice connect(open_browser(i)) funziona come

result = open_browser(i) 
connect(result)

e perché def open_browser() non utilizzare return così viene eseguita automaticamente return None il tuo codice funziona come

result = None
connect(result)

e hai

connect(None)

e poi errore mostra Unexpected type "NoneType"


BTW:

Se si utilizza for-loop per creare oggetti, quindi meglio utilizzare list per mantenere questi oggetti. Non ha bisogno di exec() e può essere più utile in seguito - perché poi lo si può utilizzare di nuovo for-loop per controllare tutti gli oggetti dalla lista.

Oltre a questo, sembra molto strano quando qualcuno ha bisogno exec() per creare il codice.

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

In altre lingue

Questa pagina è in altre lingue

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