Como passar uma variável para uma função ligada a um botão pyqt5 python [fechado]

0

Pergunta

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

"eu" é uma variável e eu não consigo encontrar uma maneira de clicar o botão auto.name_label e, em seguida, conectar-se de que para uma função e passar a variável "i". quando eu tentei executá-lo recebo a mensagem de erro

image of error

parece que a variável "i" não está a ser substituído por um dos números no intervalo representado pelo "eu" e, em vez disso, eu a letra está tentando ser transmitida.

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

Melhor resposta

1

Se você deseja atribuir a função com argumento, em seguida, você pode usar lambda para criar a função sem argumento

connect( lambda:open_browser(i) )

mas se você executá-lo no loop, em seguida, você pode precisar também de cópia valor i a nova variável.

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

Se você usar diretamente i em seguida, todos os botões de referência para a variável i, não valores a partir de i - e, finalmente, todos os botões terá o mesmo valor - último valor atribuído à i em loop.


Código connect(open_browser(i)) como funciona

result = open_browser(i) 
connect(result)

e porque def open_browser() não use return assim ele é executado automaticamente return None e o seu código funciona como

result = None
connect(result)

e você tem

connect(None)

e mais tarde de erro mostra Unexpected type "NoneType"


BTW:

Se você usar for-o loop para criar objetos, em seguida, usar melhor list para manter esses objetos. Ele não precisa exec() e ele pode ser mais útil posterior -, porque mais tarde você pode usar novamente for-ciclo para verificar todos os objetos da lista.

Além disso, parece muito estranho quando alguém precisa exec() para criar o código.

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

Em outros idiomas

Esta página está em outros idiomas

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