Raspberry PI上的Kivy:取消安排事件的正确方法

时间:2019-04-09 10:13:48

标签: python arduino kivy

在这里,我正在通过串行端口从Arduino读取数据,Arduino不断以9600的波特率发送数据。数据发送类似于“ AGVtoUPF”,持续数十秒,然后发送下一个数据,数十秒,等等。

我需要根据收到的数据触发不同的事件。

在没有计划的情况下,我在这里观察到的是我收到的数据正确且快速。但是当计划中的一个被触发时,我在接收数据上出现了延迟(例如,Arduino正在发送下一个数据,但是Kivy仍然显示最后一个数据约3秒钟,这是一个巨大的延迟!)。

我不确定这是因为我以错误的方式安排/取消安排事件,还是因为在安排了某些事情后,kivy的fps不能赶上波特率。

这是时间表/时间表发生的代码

class OperationScreen(Screen):
    def __init__(self,**kwargs):
        super(OperationScreen,self).__init__(**kwargs)
        Clock.schedule_interval(self.Read,1.0/60.0)


    def Read(self,dt):
        data = arduino.readline()
        if data =='':
            pass
        if data != '' and data != self.ids.data_label.text:
            self.ids.data_label.text = data
            if data == 'AGVtoUPFt\r\n':
                print("1")
                Clock.schedule_interval(self.ids.upf.transfer,1.75)
                Clock.schedule_interval(self.ids.agvin.transfer,1.75)
            elif data =='AGVtoUPFv\r\n':
                print("2")
                Clock.schedule_interval(self.ids.upf.vacuum,1.75)
            elif data =='AGVtoUPFvi\r\n':
                print("3")
                Clock.schedule_interval(self.ids.upf.vacin,1.75)
            elif data =='AGVtoUPFi\r\n':
                print("4")
                Clock.schedule_interval(self.ids.upf.inert,1.75)            
            else:
                Clock.unschedule(self.ids.agvin.transfer)
                Clock.unschedule(self.ids.upf.inert)
                Clock.unschedule(self.ids.upf.transfer)
                Clock.unschedule(self.ids.upf.vacuum)
                Clock.unschedule(self.ids.upf.vacin)

我这样做的是if / else情况,因为我不希望同一事件被触发两次。

我尝试在event_trigger = ObjectProperty(None)下声明一个类似class OperationScreen(Screen)的事件,然后在event_trigger = Clock.schedule_interval(self.ids.agvin.transfer)上进行__init__,因此我可以直接使用event_trigger()和{ {1}}在if / else情况下进行排程/取消排程

但是当我执行event_trigger.cancel()时,它会以某种方式产生错误。因此,我提出了上述方法,我在Kivy文档中看到不建议使用event_trigger = Clock.schedule_interval(self.ids.agvin.transfer),这是导致程序延迟的原因吗?

请告知是否有人对此有所了解。

请告诉我是否也必须提供更多信息!

提前谢谢!

UPDATE

根据建议,我更改了调度方式,这是我的新代码

Clock.unschedule(self.ids.agvin.transfer)

但是接收数据的延迟仍然存在,并且仅在我播放动画时才会发生,请帮忙。

1 个答案:

答案 0 :(得分:0)

将调度或触发器分配给属性,例如

Creating Trigger Event

self.event_trigger = Clock.create_trigger(self.ids.agvin.transfer, 1.75)

Scheduling Event

self.event_trigger()
self.event_read = Clock.schedule_interval(self.Read,1.0/60.0)

Unschedule Event

Clock.unschedule(self.event_trigger)
Clock.unschedule(self.event_read)

self.event_trigger.cancel()
self.event_read.cancel()

参考

Kivy Clock Object