pyqt4 connect arguments - указываем параметры (аргументы) вызова функции при подключении сигнала к слоту
Primary tabs
во-первых вот такой пример:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyForm(QMainWindow):
def __init__(self, parent=None):
super(MyForm, self).__init__(parent)
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 1')
button1.clicked.connect(lambda: self.on_button(1))
button2.clicked.connect(lambda: self.on_button(2))
layout = QHBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame)
def on_button(self, n):
print('Button {0} clicked'.format(n))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
form = MyForm()
form.show()
app.exec_()
альтернативой использования lambda может служить:
button1.clicked.connect(partial(self.on_button, 1)) button2.clicked.connect(partial(self.on_button, 2))
Два предыдущих клёвых примера взяты отсюда
далее мои примечания -
использование лямбды - не всегда удобно, так например если передавать в качестве аргумента переменную изменяющующся в цикле -то использовано будет всегда только последнее значение, приведу пример:
import functools # необходимо чтобы использовать partial
i = 1 # счётчик цикла
while i < 15: # прописываем условие
text = "Сообщение " + str(i);
button = QPushButton(text) # (конкатенация) добавляем номер сообщения
#button.clicked.connect(lambda: self.show_message(text)) # не катит (i окажется = 15 для всех кнопок)
button.clicked.connect(functools.partial(self.show_message, text)) # c i работает корректно
messages.append(button)
i = i + 1кстати, функция show_message может быть определена (в последнем куске кода она находится в том же классе, что и приведённый код) так = http://fkn.ktu10.com/?q=node/4341
- Log in to post comments
- 5867 reads