Kivy Python - 部分回调函数
Kivy Python - Callback Function with partial
我想 'pull' 我的 Arduino in kivy on Raspberry 的一些值,它通过无线 NRF24 模块连接。我正在使用 this library with a python wrapper
在纯 Python 中,代码运行良好,现在我想将它集成到 Kivy 中。
为此,我在 zimmerwetter.py
中创建了两个函数:
一个用于设置无线电设备和returns无线电对象(应用程序启动后应该是运行):
def radiosetup():
radio = RF24(RPI_BPLUS_GPIO_J8_22, RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ)
# doing setup stuff...
return radio
和另一个向 Arduino 发送请求的函数,它提供一些环境数据(温度、湿度等)。
def getenviroment(self,radio):
millis = lambda: int(round(time.time() * 1000))
# send command
send_payload = 'getdata'
# First, stop listening so we can talk.
radio.stopListening()
# Take the time, and send it. This will block until complete
print 'Now sending length ', len(send_payload), ' ... ',
radio.write(send_payload[:len(send_payload)])
a = datetime.datetime.now()
# Now, continue listening
radio.startListening()
# Wait here until we get a response, or timeout
started_waiting_at = millis()
timeout = False
while (not radio.available()) and (not timeout):
if (millis() - started_waiting_at) > 1000:
timeout = True
# Describe the results
if timeout:
b = datetime.datetime.now()
# print(b - a)
print 'failed, response timed out.'
else:
# Grab the response, compare, and send to debugging spew
length = radio.getDynamicPayloadSize()
receive_payload = []
receive_payload = radio.read(length)
print 'got response size=', length
print struct.unpack("bbbbhbbbb", ''.join(chr(c) for c in receive_payload))
b = datetime.datetime.now()
print(b - a)
return receive_payload
getenviroment 函数应该每隔 x 秒从 kivy 应用程序调用一次,部分函数按照 the kivy clock module
中的建议使用
from zimmerwetter import *
class PyowmApp(App):
def build(self):
radio = radiosetup()
Clock.schedule_interval(partial(getenviroment,radio), 10)
错误是:
File "/home/pi/pyscripts/pyowm/zimmerwetter.py", line 83, in getenviroment
radio.stopListening()
AttributeError: 'float' object has no attribute 'stopListening'
我想知道为什么返回一个 float 对象,当我使用 help(radio) 打印无线电对象时,它 returns class RF24(Boost.Python.instance)
并且函数 stoplistening() 存在。
我自己查出来的,把schedule语句改成
Clock.schedule_interval(partial(getenviroment,radio=radio), 10)
成功了。
Clock.schedule_interval
调用的函数在经过partial
之后,会接收到dt
作为参数。您的函数的签名是 getenviroment(self,radio)
,因此 radio
将分配给 self
,dt
将分配给 radio
。
而是使用 lambda
:
Clock.schedule_once(lambda dt: self.getenviroment(radio), 10)
我想 'pull' 我的 Arduino in kivy on Raspberry 的一些值,它通过无线 NRF24 模块连接。我正在使用 this library with a python wrapper
在纯 Python 中,代码运行良好,现在我想将它集成到 Kivy 中。
为此,我在 zimmerwetter.py
中创建了两个函数:
一个用于设置无线电设备和returns无线电对象(应用程序启动后应该是运行):
def radiosetup():
radio = RF24(RPI_BPLUS_GPIO_J8_22, RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ)
# doing setup stuff...
return radio
和另一个向 Arduino 发送请求的函数,它提供一些环境数据(温度、湿度等)。
def getenviroment(self,radio):
millis = lambda: int(round(time.time() * 1000))
# send command
send_payload = 'getdata'
# First, stop listening so we can talk.
radio.stopListening()
# Take the time, and send it. This will block until complete
print 'Now sending length ', len(send_payload), ' ... ',
radio.write(send_payload[:len(send_payload)])
a = datetime.datetime.now()
# Now, continue listening
radio.startListening()
# Wait here until we get a response, or timeout
started_waiting_at = millis()
timeout = False
while (not radio.available()) and (not timeout):
if (millis() - started_waiting_at) > 1000:
timeout = True
# Describe the results
if timeout:
b = datetime.datetime.now()
# print(b - a)
print 'failed, response timed out.'
else:
# Grab the response, compare, and send to debugging spew
length = radio.getDynamicPayloadSize()
receive_payload = []
receive_payload = radio.read(length)
print 'got response size=', length
print struct.unpack("bbbbhbbbb", ''.join(chr(c) for c in receive_payload))
b = datetime.datetime.now()
print(b - a)
return receive_payload
getenviroment 函数应该每隔 x 秒从 kivy 应用程序调用一次,部分函数按照 the kivy clock module
中的建议使用from zimmerwetter import *
class PyowmApp(App):
def build(self):
radio = radiosetup()
Clock.schedule_interval(partial(getenviroment,radio), 10)
错误是:
File "/home/pi/pyscripts/pyowm/zimmerwetter.py", line 83, in getenviroment
radio.stopListening()
AttributeError: 'float' object has no attribute 'stopListening'
我想知道为什么返回一个 float 对象,当我使用 help(radio) 打印无线电对象时,它 returns class RF24(Boost.Python.instance)
并且函数 stoplistening() 存在。
我自己查出来的,把schedule语句改成
Clock.schedule_interval(partial(getenviroment,radio=radio), 10)
成功了。
Clock.schedule_interval
调用的函数在经过partial
之后,会接收到dt
作为参数。您的函数的签名是 getenviroment(self,radio)
,因此 radio
将分配给 self
,dt
将分配给 radio
。
而是使用 lambda
:
Clock.schedule_once(lambda dt: self.getenviroment(radio), 10)