我的问题与本主题的上一个问题有关:Decorator adds an unexpected argument
问题是,如果我使用同一组装饰器创建更多方法,则每个信号都调用相同的装饰器,这是多么奇怪。下面的示例:
signal_1.connect(fun_1)
signal_2.connect(fun_2)
@pyqtSlot()
@handle_exceptions
def fun_1():
print('aaaaa')
@pyqtSlot()
@handle_exceptions
def fun_2():
print('bbbbb')
signal_1.emit()
signal_2.emit()
输出:
aaaaa
aaaaa
您必须使用@functools.wraps
(有关需要的更多信息,请阅读@functools.wraps
的答案)
What does functools.wraps do?
创建装饰器后,它将接收该函数作为参数,并且PyQt将该函数的名称用作指向将用于该插槽的实际函数的“指针”,除非指定了特定名称,否则它实际上返回该函数的“包装器”。
由于您是针对同一包装器(import functools
def handle_exceptions(func):
@functools.wraps(func)
def func_wrapper(*args, **kwargs):
try:
print(args)
return func(*args, **kwargs)
except Exception as e:
print(e)
return None
return func_wrapper
)使用插槽装饰器,因此PyQt会认为它们具有相同的功能,并且会覆盖前一个(或忽略下一个,我不确定:我已经得到不同的结果,有时调用第一个函数,其他调用第二个)。
这与eyllanesc在func_wrapper
中的解释有关,我认为这是更正确的方法。
尽管如此,另一种解决方案可能是将唯一名称设置为广告位的参数:
his answer