Как передать аргументы в функции нажатием кнопки в PyQt? - PullRequest
18 голосов
/ 22 июля 2011

Я хочу передать аргументы функции, когда нажимаю кнопку.Что я должен добавить к этой строке button.connect(button, QtCore.SIGNAL('clicked()'), calluser(name)), чтобы она передавала значение функции:

def calluser(name):
    print name

def Qbutton():
    button = QtGui.QPushButton("button",widget)
    name = "user"
    button.setGeometry(100,100, 60, 35)
    button.connect(button, QtCore.SIGNAL('clicked()'), calluser(name))

Еще одна вещь, кнопки будут генерироваться с использованием цикла for;так что name значение будет меняться.Поэтому я хочу прикрепить каждое имя с помощью кнопки.Я сделал то же самое в Pytk, используя цикл for и вызывая базовую функцию аргумента при нажатии.

Ответы [ 5 ]

28 голосов
/ 22 июля 2011

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

Я попробовал эффективный способ сделать это, и у меня все получилось. Вы можете использовать код:

from functools import partial

def calluser(name):
    print name

def Qbutton():
    button = QtGui.QPushButton("button",widget)
    name = "user"
    button.setGeometry(100,100, 60, 35)
    button.clicked.connect(partial(calluser,name))
3 голосов
/ 18 декабря 2013

Вот другой способ. --- ЧАСТИЧНО - Я считаю это самое простое:

    widget = QWidget()
    widgetLayout = QVBoxLayout()

    for action in list:

        button = QPushButton("{action}".format(action=action['name']),self)
        button.clicked.connect(partial(self.action_selected,action=action['name']))
        widgetLayout.addWidget(button)

    widget.setLayout(widgetLayout)

def action_selected(self,action):
    print action

найдено на: http://tech -artists.org / форум / showthread.php? 3118-PyQt-майя Как к пасс аргументы к-а-функции, когда-подсоединение его к PyQt-кнопка

0 голосов
/ 05 августа 2016

В Python экземпляры классов могут быть вызваны. Вы можете просто использовать экземпляр класса в качестве функции. Этот класс может содержать все, что вы хотите. (В некоторых языках или средах вызываемый объект называется функтором или функциональным объектом .)

class CallUser:
    def __init__(self, name):
        self.name = name
    def __call__(self):
        print(self.name)

def Qbutton():
    button = QtGui.QPushButton("button",widget)
    name = "user"
    button.setGeometry(100,100, 60, 35)
    button.clicked.connect(CallUser(name))
    # Object of type CallUser will work as a function!
0 голосов
/ 20 апреля 2016

Код, показанный ниже, иллюстрирует способ связывания данных с генерируемыми кнопками.Например, вы можете изменить оператор self.keydata[b] = key, чтобы хранить кортеж данных в self.keydata[b] для использования при последующей обработке события кнопки.

Обратите внимание, что в следующем коде assets - это ранееопределенный словарь, содержащий заголовки для кнопок.В подпрограмме processButton(self) self.sender() соответствует записи в переменной класса buttons[].

class Tab5(QtGui.QWidget):
    buttons, keydata = {}, {}
    def __init__(self, fileInfo, parent=None):
        super(Tab5, self).__init__(parent)
        layout = QtGui.QVBoxLayout()

        for key in sorted(assets):
            b = self.buttons[key] = QtGui.QPushButton(assets[key], self)
            b.clicked.connect(self.processButton)
            layout.addWidget(b)
            print 'b[key]=',b, ' b-text=',assets[key]
            self.keydata[b] = key

        layout.addStretch(1)
        self.setLayout(layout)

    def processButton(self):
         print 'sender=',self.sender(), ' s-text=',self.sender().text(), ' data[.]=', self.keydata[self.sender()] 
         pass

Вывод был похож на следующий, где первые четыре строки печатались во время цикла forи последние четыре напечатаны, когда четыре кнопки были нажаты по порядку.

b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca830>  b-text= K1
b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca908>  b-text= K2
b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca950>  b-text= K3
b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca998>  b-text= K4
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca830>  s-text= K1  data[.]= L1
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca908>  s-text= K2  data[.]= L2
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca950>  s-text= K3  data[.]= L3
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca998>  s-text= K4  data[.]= L4
...