Kivy Python - 部分回调函数

时间:2016-05-03 13:29:49

标签: python kivy raspberry-pi3

我希望在Raspberry上通过无线NRF24模块连接我的Arduino中的一些值。我正在使用带有this

python wrapper

在纯Python中,代码运行良好,现在我想将它集成到Kivy中。

为此,我在zimmerwetter.py中创建了两个函数:

一个用于设置无线电设备并返回无线电对象(应用程序启动时应该运行):

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

应该从kivy应用程序每隔x秒调用一次getenviroment函数,部分函数按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)打印无线电对象时,它返回class RF24(Boost.Python.instance)并且函数stoplistening()存在。

2 个答案:

答案 0 :(得分:2)

Clock.schedule_interval调用的函数将在通过dt之后接收partial作为参数。您的函数的签名为getenviroment(self,radio),因此radio将分配给selfdt将分配给radio

相反,请使用lambda

Clock.schedule_once(lambda dt: self.getenviroment(radio), 10)

答案 1 :(得分:0)

我自己发现了,将日程表声明改为

Clock.schedule_interval(partial(getenviroment,radio=radio), 10)

做了这个伎俩。