def connect(signal):
def result(func):
signal.connect(func)
return func
return inner
def safemode(msg):
def inner(func):
@wraps(func):
def result(*args, **kwargs):
print 'Args passed to func:', args, kwargs
try:
func(*args, **kwargs)
except:
print msg
return result
return inner
@connect(form.my_action.triggered)
@safemode('Something bad'?)
def my_action():
print 'Something good!'
所以,当我触发动作时,我看到:
Args passed to func: (False,) {}
Something bad?
由于my_action
不接受任何参数,因此调用func(*args, **kwargs)
func
为my_action
的{{1}}失败。
我知道一个解决方案就是删除*args, **kwargs
,但我想为Qt GUI函数和非GUI函数使用相同的装饰器。
堆栈跟踪不是很有帮助;它只显示app.exec_()
然后显示发生故障的行。
False
来自哪里,我该如何解决?
答案 0 :(得分:2)
有许多常用信号,其参数通过默认值。其中包括QAction.triggered和QAbstractButton.clicked。
实际上,就PyQt而言,这些信号有两个重载:一个传递默认值,另一个不传递默认值。 PyQt有一种显式选择使用哪种机制的机制 - 但如果不使用它,它将回退到硬编码的默认值。对于上述两个信号,默认重载是 传递默认值的那个。
要选择不传递值的重载,请执行以下操作:
form.my_action.triggered[()]
(注意:信号对象的 getitem 语法通常采用类型或类型的元组,因此需要一个空元组显式选择没有参数的重载。)