Обычно GUI создаются с использованием классов. Используя связанные методы в качестве обратных вызовов (см. self.calluser
ниже), вы можете «передавать» информацию обратному вызову через атрибуты self
(например, self.name
):
Например, используя слегка измененный код из этого руководства:
import sys
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui
class QButton(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.button = QtGui.QPushButton('Button', self)
self.name='me'
self.button.clicked.connect(self.calluser)
def calluser(self):
print(self.name)
def demo_QButton():
app = QtGui.QApplication(sys.argv)
tb = QButton()
tb.show()
app.exec_()
if __name__=='__main__':
demo_QButton()
Поскольку обратный вызов сам по себе всегда вызывается без дополнительных аргументов, когда вам нужно передать отдельную дополнительную информацию многим обратным вызовам, вам нужно сделать разные обратные вызовы для каждой кнопки.
Поскольку это может быть трудоемко (если делать это вручную), вместо этого используйте фабрику функций. См. пример ниже. Фабрика функций — это замыкание. Ей могут быть переданы дополнительные аргументы, к которым может получить доступ внутренняя функция при вызове:
class ButtonBlock(QtGui.QWidget):
def __init__(self, *args):
super(QtGui.QWidget, self).__init__()
grid = QtGui.QGridLayout()
names = ('One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine', 'Ten')
for i, name in enumerate(names):
button = QtGui.QPushButton(name, self)
button.clicked.connect(self.make_calluser(name))
row, col = divmod(i, 5)
grid.addWidget(button, row, col)
self.setLayout(grid)
def make_calluser(self, name):
def calluser():
print(name)
return calluser
app = QtGui.QApplication(sys.argv)
tb = ButtonBlock()
tb.show()
app.exec_()
person
unutbu
schedule
22.07.2011