在 Pycharm 和 Kivy 中使用 while 循环
Using while loop in Pycharm and Kivy
如何在此代码中使用 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()
你不能 运行 像这样的 'while True' 循环 - 这就是 Kivy 本身在内部做的事情,每次迭代它都会检查输入,更新 gui 等。你自己做你就停止了 Kivy 的从不断前进循环。这不仅是 kivy 的事情,它也是其他 gui 框架的工作方式,尽管不是所有 运行 主线程中的 gui 东西。
睡眠也做同样的事情 - 任何时候你睡觉,它都会这样做,并且 gui 会冻结直到它结束。
解决方案是挂接到 Kivy 的事件系统并使用其内部的 while 循环。最简单的方法可能是向您的登录屏幕添加一个新方法,如下所示。
在__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 秒调用一次。
如何在此代码中使用 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()
你不能 运行 像这样的 'while True' 循环 - 这就是 Kivy 本身在内部做的事情,每次迭代它都会检查输入,更新 gui 等。你自己做你就停止了 Kivy 的从不断前进循环。这不仅是 kivy 的事情,它也是其他 gui 框架的工作方式,尽管不是所有 运行 主线程中的 gui 东西。
睡眠也做同样的事情 - 任何时候你睡觉,它都会这样做,并且 gui 会冻结直到它结束。
解决方案是挂接到 Kivy 的事件系统并使用其内部的 while 循环。最简单的方法可能是向您的登录屏幕添加一个新方法,如下所示。
在__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 秒调用一次。