【问题标题】:Using while loop in Pycharm and Kivy在 Pycharm 和 Kivy 中使用 while 循环
【发布时间】:2016-03-18 14:48:51
【问题描述】:

如何在此代码中使用 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()

【问题讨论】:

    标签: python while-loop pycharm kivy


    【解决方案1】:

    你不能像那样运行“while True”循环——这就是 Kivy 本身在内部做的事情,每次迭代它都会检查输入,更新 gui 等。通过自己做,你可以阻止 Kivy 的循环继续前进。这也不仅仅是一个 kivy 的事情,它也是其他 gui 框架的工作方式,尽管并非所有的 gui 框架都在主线程中运行。

    sleep 也做同样的事情 - 任何时候你睡觉时,它都会做同样的事情,并且 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 秒调用一次更新方法。

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2021-07-18
      • 2019-02-19
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多