在Pycharm和Kivy中使用while循环

7

我该如何在这段代码中使用while循环每隔2秒读取串口数据并显示在标签中?由于对Python不熟悉,这个应用程序在运行时可能会挂起。

from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from time import sleep
import serial


class LoginScreen(GridLayout):
  def __init__(self, **kwargs):
    super(LoginScreen, self).__init__(**kwargs)
    self.cols = 2
    self.rows = 2
    ser = serial.Serial('COM3', 9600, timeout=0)
    while 1:
        sleep(2)
        ser.read()
        data = ser.read()
        self.add_widget(Label(text=str(data)))


class MyApp(App):
  def build(self):
    return LoginScreen()


if __name__ == '__main__':
  MyApp().run()
1个回答

3
你不能像那样运行一个“while True”循环 - 那就是Kivy本身在内部执行的操作,每次迭代它都会检查输入、更新GUI等。如果你自己这样做,就会阻止Kivy的循环前进。这不仅仅是Kivy的问题,其他GUI框架也是如此,尽管并非所有框架都在主线程中运行GUI相关内容。
睡眠也会有同样的问题 - 每次睡眠时,它都会完全冻结GUI,直到完成为止。
解决方案是连接到Kivy的事件系统并使用其内部while循环。最简单的方法可能是向你的LoginScreen添加一个新方法,如下所示。
__init__中:
self.ser = serial.Serial('COM3', 9600, timeout=0)

还有一种新方法:

def update(self, dt):
    self.ser.read()  # Not sure if you're deliberately or accidentally reading twice
    data = self.ser.read()
    self.add_widget(Label(text=str(data)))    

…然后

from kivy.clock import Clock
from functools import partial
Clock.schedule_interval(self.update, 2)

更新方法将每2秒钟调用一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接