2015-04-02 80 views
2

基本上我正在观察某种变化的逻辑电平,然后计算持续时间有多长。由于我有许多不同的线路可供观看,因此我开始为每条线路创建一个功能。所以我想,为什么不根据触发的线创建一个使用不同参数的函数。在Python中,如何在线程回调中传递参数?

def myCallBack(pin, bool, Ftimer, Etimer): 
    ## some more code here for checking bools and using timers 

GPIO.add_event_detect(pin1, GPIO.both, callback=myCallBack(pin1, bool1, Ftimer1, Etimer1), bouncetime=200) 
GPIO.add_event_detect(pin2, GPIO.both, callback=myCallBack(pin2, bool2, Ftimer2, Etimer2), bouncetime=200) 
... 

目前,我得到错误“类型错误:参数必须是可调用的” 是这种做法甚至可能吗?我是否以正确的方式去做这件事? 任何帮助,将不胜感激。 谢谢。

回答

0

我不知道为什么这解决了我的问题,但它确实有效。我创建了一个类来创建对象,因为我在每个逻辑行上执行相同的功能集。我发现这stackoverflow link并遵循相同的模式。这对我需要完成的工作很好。

2
from functools import partial 
callback=partial(myCallBack, pin1, bool1, Ftimer1, Etimer1) 

这将产生不带参数的函数,调用时pin1bool1Ftimer1Etimer1调用myCallBack。或者,请尝试:

callback=lambda *a: myCallBack(pin1, bool1, Ftimer1, Etimer1) 

另请参阅Python, how to pass an argument to a function pointer parameter?

+0

我仍然'TypeError:Parameter必须可调用' 我做了一些更深入的Partial,发现您可以在创建部分对象或调用它时添加参数。无论哪种方式,我仍然得到错误。 如果我只是调用myCallBack,它会运行该功能就好了。当我从GPIO.add_event_detect – Matt 2015-04-02 21:38:13

+0

@MattMumm中调用它时,似乎有问题您可以尝试上面的第二种方法吗? – matsjoyce 2015-04-03 17:32:52

+0

对不起,由于某种原因我错过了。 刚刚尝试过,它与您建议的第一种方法具有相同的反应。 – Matt 2015-04-06 21:12:56