Динамически вызывать функцию нажатием кнопки с разными входными значениями

У меня есть главное окно с панелью инструментов. У меня также есть класс, который обрабатывает действия, и класс, в котором есть все действия. Вот мой код:

import sys
from PyQt4 import QtGui, QtCore


buttonActions = ['actA', 'actB', 'actC']
img = '../../Images/logo.png'
tip = 'home'

class HandlerClass:

    def __init__(self):
        pass

    def loadAction(self, act, win):
        uiAct = ActionsClass()
        func = getattr(uiAct, act)
        func(win)

class ActionsClass:

    def __init__(self):
        pass

    def actA(self, win):
        print 'I am actA'

    def actB(self, win):
        print 'I am actB'

    def actC(self, win):
        print 'I am actC'


class TestWindow(object):
    '''
    classdocs
    '''
    def __init__(self):
        '''
        Constructor
        '''

        self.app = QtGui.QApplication(sys.argv)
        self.thisWin = QtGui.QMainWindow()

        self.buildButtons()

        self.thisWin.show()
        sys.exit(self.app.exec_())

    def buildButtons(self):

        thisBar = self.thisWin.addToolBar('Basic')        

        for i in range(0, len(buttonActions)):
            toolAct = QtGui.QAction(buttonActions[i], self.thisWin)
            toolAct.triggered.connect(lambda: actHandler.loadAction(buttonActions[i], self.thisWin))
            thisBar.addAction(toolAct)

if __name__ == '__main__':

    actHandler = HandlerClass()

    TestWindow()

Как видите, проблема в том, что какую бы кнопку я ни нажал на панели инструментов, всегда выполняется последний метод из ActionClass. Кажется, что lambda не работает как есть.

Есть ли решение?


person ioaniatr    schedule 17.08.2018    source источник
comment
Извините, я не следую полностью, но вы можете вернуть частичный   -  person bison    schedule 18.08.2018
comment
Pythonic способ перебора элементов массива: for item in my_array:   -  person Ozzy Walsh    schedule 18.08.2018
comment
используйте 1_   -  person eyllanesc    schedule 18.08.2018
comment
Если я поставлю lambda i=i:, то он всегда будет выполняться первым методом.   -  person ioaniatr    schedule 18.08.2018
comment
По предложению @eyllanesc я просмотрел здесь. state пропал. Если я напишу toolAct.triggered.connect(lambda state, i=i: actHandler.loadAction(buttonActions[i], self.thisWin)), я не знаю, что на самом деле делает слово состояния, но оно работает. Спасибо   -  person ioaniatr    schedule 18.08.2018