在Pycharm和Kivy中使用while循环

时间:2015-12-12 20:38:47

标签: python while-loop pycharm kivy

如何在此代码中使用while循环每2秒读取一次串行并在Label中显示?这个应用程序将在运行中挂起,我是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 个答案:

答案 0 :(得分:1)

你不能像那样运行'while True'循环 - 这就是Kivy本身在内部做的事情,它每次迭代检查输入,更新gui等。通过自己动手,你可以阻止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秒调用一次更新方法。