Python PyQt 定时器 Firmata
我刚接触Python,正在用firmata玩Arduino。
我想实现的功能是:
- 把Arduino设置成可以控制一个LED灯,作为数字输出
把电位器设置为模拟输入0
在PyQt中设置一个定时器,用来更新电位器的位置
在应用程序中显示在PyQt中设置一个阈值,当电位器的值超过这个阈值时,点亮LED灯(模拟输入的分辨率是1024位,所以我设定800作为阈值)
我使用的firmata库是:链接
这是我遇到问题的代码:
import sys
from PyQt4 import QtCore, QtGui
from firmata import *
# Arduino setup
self.a = Arduino('COM3')
self.a.pin_mode(13, firmata.OUTPUT)
# Create timer
self.appTimer = QtCore.QTimer(self)
self.appTimer.start(100)
self.appTimer.event(self.updateAppTimer())
def updateAppTimer(self):
self.analogPosition = self.a.analog_read(self, 0)
self.ui.lblPositionValue.setNum()
我收到的错误信息是:
追踪(最近的调用在最前面):
文件 "D:\Programming\Eclipse\IO Demo\src\control.py",第138行,在
myapp = MainWindow()
文件 "D:\Programming\Eclipse\IO Demo\src\control.py",第56行,在 init
self.appTimer.event(self.updateAppTimer())
文件 "D:\Programming\Eclipse\IO Demo\src\control.py",第60行,在 updateAppTimer
self.analogPosition = self.a.analog_read(self, 0)
类型错误:analog_read() 需要2个参数(给了3个)
如果我把'self'去掉,还是会出现同样的错误信息,但提示只给了1个参数。
Python在背后做了什么我不知道的事情吗?
引用
2 个回答
其实不需要传递self这个参数。我也不知道为什么第一次会失败,或者为什么self已经包含在里面了。
在你的代码中,'a' 是一个类的实例,所以所有和它绑定的方法,第一参数都会自动传入一个叫做 self 的指针。欢迎来到 Python,某一天你会喜欢上它的 :)
相反,你可以把任何方法当作不绑定的方法来调用(我相信你在任何派生类的构造函数中都会这样做)。语法是:
instance = Type()
#bound method.
instance.methodName(params)
#unbound method call, 'instance' is the instance of some object, pointer to witch
#you want to pass to method. These calls are similar.
Type.methodName(instance, params)