На этом шаге мы рассмотрим различные способы передачи данных в обработчик.
При назначении обработчика в метод connect() передается ссылка на функцию или метод. Если после названия функции (метода) указать внутри круглых скобок какой-либо параметр, то это приведет к вызову функции (метода) и вместо ссылки будет передан результат ее выполнения, что вызовет ошибку. Передать данные в обработчик можно следующими способами:
self.button1.clicked.connect(lambda: self.on_clicked_button1(10))
Если передаваемое обработчику значение вычисляется в процессе выполнения кода, переменную, хранящую это значение, следует указывать в анонимной функции как значение по умолчанию, иначе функции будет передана ссылка на это значение, а не оно само. Пример:
у = 10
self.button1.clicked.connect(lambda x=y: self.on_clicked_button1(x))
class MyClass(): def __init__(self, x=0): self.x = x def __call__(self): print("x =", self.x) . . . . self.button1.clicked.connect(MyClass(10))
partial(<Функция>[, *<Неименованные параметры>][, **<Именованные параметры>])
Пример передачи параметра в обработчик:
from functools import partial self.buttonl.clicked.connect(partial(self.on_clicked_button1, 10))
Если при генерации сигнала передается предопределенное значение, то оно будет доступно в обработчике после остальных параметров. Назначим обработчик сигнала clicked, принимающего логический параметр, и дополнительно передадим число:
self.button1.clicked.connect(partial(self.on_clicked_button1, 10))
Обработчик будет иметь следующий вид:
def on_clicked_button1 (self, x, status): print("Нажата кнопка button1", x, status)
Нажата кнопка button1 10 False
На следующем шаге мы рассмотрим использование таймеров.