Как передать переменную в функцию, подключенную к кнопке pyqt5 python [закрыто]

0

Вопрос

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" - это переменная, и я не могу найти способ нажать кнопку self.name_label, а затем подключить ее к функции и передать переменную "i". когда я попытался запустить его, я получил сообщение об ошибке

image of error

похоже, что переменная "i" не заменяется одним из чисел в диапазоне, представленном "i", и вместо i буква пытается быть передана.

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

Лучший ответ

1

Если вы хотите назначить функцию с аргументом, вы можете использовать lambda чтобы создать функцию без аргумента

connect( lambda:open_browser(i) )

но если вы запустите его в цикле, вам может потребоваться также скопировать значение i к новой переменной.

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

Если вы используете напрямую i тогда все кнопки будут использовать ссылку на переменную i, а не значения из i - и, наконец, все кнопки получат одинаковое значение - последнее значение, присвоенное i в петле.


Код connect(open_browser(i)) работает как

result = open_browser(i) 
connect(result)

и потому что def open_browser() не использует return таким образом, он автоматически запускается return None и ваш код работает так

result = None
connect(result)

и у вас есть

connect(None)

и более поздняя ошибка показывает Unexpected type "NoneType"


КСТАТИ:

Если вы используете for-цикл для создания объектов, а затем лучше использовать list чтобы сохранить эти предметы. В этом нет необходимости exec() и это может быть более полезным позже - потому что позже вы сможете использовать его снова for-цикл для проверки всех объектов из списка.

К тому же это выглядит очень странно, когда кому-то нужно exec() для создания кода.

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

На других языках

Эта страница на других языках

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