Обычно графические интерфейсы создаются с использованием классов. Используя связанные методы в качестве обратных вызовов (см. 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_()