如何正确地修饰PyQt回调函数?

2024-10-03 15:24:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,PyQt signal的回调函数也有“hidden”参数“state”。这个参数使得用户定义的decorator更难进行函数修饰。你知道吗

我的代码和装饰的例子。在我的解决方案中,对于每个没有lambda的回调,我必须承认由不正确的参数计数引起的类型错误,否则我无法修饰。有没有更好的方法,我可以排除承认打字错误?我可以忽略装饰器中的“state”参数吗?你知道吗

代码示例:decorator和程序示例。你知道吗

from PyQt4 import QtCore, QtGui

def decor(func_fuc):
    def new_func(*args, **kwargs):
        #do something
        try:
            func_fuc(*args, **kwargs)
        except TypeError as TypE:
            if all(i in TypE.args[0] for i in ['takes', 'positional', 'argument' ,'but', 'given']):
                args = tuple([args[ar] for ar in range(len(args)-1)])
                func_fuc(*args, **kwargs)
            else:
                raise TypE
        #etc
    return new_func

class MainWind(QtGui.QMainWindow):
    @decor
    def __init__(self,parent=None,geometry = QtCore.QRect(100,100,800,800)):
        super(MainWind, self).__init__(parent,geometry=geometry)
        self.pushik = QtGui.QPushButton(
            self, clicked = self.vasa
            ,geometry = QtCore.QRect(100,100,50,50), text = 'vasa'
        )

        self.petjaBtn = QtGui.QPushButton(
            self, clicked = lambda state : self.petja()
            ,geometry = QtCore.QRect(100,200,50,50), text = 'petja'

        )

        self.someBtn = QtGui.QPushButton(
            self, clicked = self.someBtnClick
            ,geometry = QtCore.QRect(100,300,50,50), text = 'someBtn'
        )

        self.show()
    #@decor
    def vasa(*args):
        print('vasa call')
        print(args) #(<__main__.MainWind object at 0x018FF940>, False)
    #@decor
    def petja(*args):
        print('petja call')
        print(args) #(<__main__.MainWind object at 0x018FF940>,)

    def someBtnClick(self): # usual usage
        print('someBtnClick call')
        # signature : accept only "self", but works fine on button click(with 2 params, self and state)
        # if i write empty decorator, that just returns original call, i will get typeError (reason - extra argument)
        #how to decorate without admitting "argument" TypeError?

app=QtGui.QApplication([])
wind = MainWind()
app.exec_()

Tags: self参数defargsfuncstateprintgeometry
1条回答
网友
1楼 · 发布于 2024-10-03 15:24:52

如果您检查inspect.getfullargspec()修饰函数,您将看到它们的签名是“wong”。 见Fix Your Decoratorswrapt library。你知道吗

但是不幸的是,使用@wrapt.decorator()编写decorator仍然不能解决问题,尽管getfullargspec()看起来是正确的。PyQt似乎又做了一次代码检查来计算函数属性。你知道吗

相关问题 更多 >