Search code examples
pythonpython-2.7python-3.xpyqtpyqt4

Connect to a Class Method by it's method name holded into a var in a for loop in python


I'm connecting some buttons in PyQt4 into the same function, this function will look up for the match between the Button name or title and a Class instance method name what manage different operations.

I'm getting in different ways the class instance methods into a list, iterate over and try to connect its respective function to its button. but i can't make work the method callback() in any way.

##############################################
# Operatios RIG class INSTANCE
#
self.OperationsRig = OperationsFile.Operations()
#### BUTTONS TO CONNECT -----------------------#

mirrorButton.clicked.connect(self.operations_module)
flipButton.clicked.connect(self.operations_module)
resetButton.clicked.connect(self.operations_module)
visibilityButton.clicked.connect(self.operations_module)

def operations_module(self):
    # Text gives me the name to Match ------------------#
    text = self.sender().text()
    # ------------------------#
    # have 3 ways of getting the class instance methods into a list to iterate ..
    method_list = [func for func in dir(self.OperationsRig) if callable(getattr(self.OperationsRig, func))]
    methods = vars(self.OperationsRig.__class__).items()
    member =inspect.getmembers(self.OperationsRig, predicate=inspect.ismethod)

    # This var is a list to pass to the Method
    Sel_list = cmds.ls(sl=True)

    # iterate over the "self.OperationsRig" methods
    #
    """ option 1 """
    for meth in method_list:
        if text.strip().lower() in meth.lower()[:]:
            # if match, and it does, will call the class method and send the data.
            pass
            #getattr(self.OperationsRig,meth)(Sel_list)  # Executes the funcion instance, but is not
                                                         # sending the data, I've checked printing inside.
                                                         # NoneTypeObject is not iterable. no data sent.

    """ option 2 """
    for meth in methods:
        if text.strip().lower() in meth[0].lower()[:]:
            pass
            # if match, and it does, will call the class method and send the data.
            #method = meth[1]   # Gets the memory address of the function. Good.
            #method(Sel_list)   # Does not return anything, the process of the funcion gets an
                                # error at the very beggining of the method process

    """ option 3 """
    for meth in member:
        if text.strip().lower() in meth[0].lower()[:]:
            meth[1](Sel_list)  # Gets the memory address of the function. Good. as a bound method
                               # Same result as option 1 - # NoneTypeObject is not iterable. no data sent.
# --------------------------------------------------------------------------------------------------#

the matching goes fine, the problem is calling the functions. what im doing wrong?


Solution

  • I don't know the OperationsRig class definition, so I define one by myself.

    Since it could successfully match, I think it is not the problem of pyqt.

    Here is my code:

    class OperationsRig:
        def foo(self, msg):
            print('foo:' + str(msg))
            return 'foo OK'
    
        def foo1(self, msg):
            print('foo1:' + str(msg))
            return 'foo1 OK'
    
    
    opr = OperationsRig()
    
    def operations_module(text):
        # Text gives me the name to Match ------------------#
        # ------------------------#
        # have 3 ways of getting the class instance methods into a list to iterate ..
        method_list = [func for func in dir(opr) if callable(getattr(opr, func))]
    
        # This var is a list to pass to the Method
        Sel_list = [1,2,3]
    
        # iterate over the "self.OperationsRig" methods
        #
        """ option 1 """
        for meth in method_list:
            if text.strip().lower() in meth.lower()[:]:
                # if match, and it does, will call the class method and send the data.
                pass
                return getattr(opr, meth)(Sel_list)  # Executes the funcion instance, but is not
                                                             # sending the data, I've checked printing inside.
                                                             # NoneTypeObject is not iterable. no data sent.
    print(operations_module('foo'))
    print(operations_module('foo1'))
    

    And this is the result:

    foo:[1, 2, 3]
    foo OK
    foo1:[1, 2, 3]
    foo1 OK
    
    Process finished with exit code 0
    

    It runs as my expectation, I still can not figure out why your code is failed. Or if you can give further explanation.