【问题标题】:Kivy graphics with ethernet data reception带有以太网数据接收的 Kivy 图形
【发布时间】:2019-06-02 20:03:41
【问题描述】:

我的 kivy 代码必须将小部件从 A 点平滑地线性移动到 B 点,并通过以太网电缆接收 UDP 数据包。现在,小部件从 A 平滑移动到 C(AB 线之间的 C),然后停止接收数据(可能是 0.5 到 1 秒),然后小部件再次移动。 因此,运动不顺畅。知道如何解决这个问题吗? 我正在使用 python 中的套接字模块进行数据接收。

我什至尝试过线程编程。它没有帮助,同样的问题。

class DemoCreator(AnchorLayout):

    ev_status = NumericProperty(None)  # get ev status(UDP packet)

    def receive_ev_status(self):
        r = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        r.bind(('', 5555))
        prev_data = 0
        data, _ = r.recvfrom(1024)

        if not data:
            data = prev_data
        return int.from_bytes(data, 'little')

    def update_ev_status(self, dt):
        self.ev_status = self.receive_ev_status()


class DemoApp(App):

    def build(self):

        hmi = DemoCreator()
        hmi.map_box.host_car.start((450, 0)

        Clock.schedule_interval(hmi.update_ev_status, 0.5)
        Clock.schedule_interval(hmi.map_box.update_car, 1 / 60)

        return hmi

if __name__ == '__main__':
    DemoApp().run()

如何在不影响图形的情况下使用 kivy 应用程序的端口接收数据?

【问题讨论】:

  • 为此使用线程是一个合适的解决方案。无论您以前尝试过什么,都可能在某种程度上是错误的。
  • @inclement 你能看看我的代码吗?
  • @inclement 你能告诉我关于 kivy 线程的任何资源吗?

标签: python python-3.x sockets kivy


【解决方案1】:

问题在于您使用Clock.schedule_interval() 进行以太网接收。 Clock.schedule 系列安排方法在主线程上运行,因此您的以太网工作与您的小部件运动在同一 (GUI) 线程上完成。这会影响 GUI 性能。使用threading.Thread(target=self.ethernet_recv).start() 之类的东西将您的以太网代码放在另一个线程中。目标方法需要循环调用您的self.receive_ev_status(),以 0.5 秒为间隔。

看看this documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多