Python 在Pycharm和Kivy中使用while循环
如何在代码中使用while循环每隔2秒读取一次序列并在标签中显示它?这个应用程序将在运行时挂起,我是python新手,无法解决这个问题Python 在Pycharm和Kivy中使用while循环,python,while-loop,pycharm,kivy,Python,While Loop,Pycharm,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):
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的循环不断前进。这不仅仅是一个奇维的东西,它也是其他gui框架的工作方式,尽管不是所有的gui框架都在主线程中运行 睡眠也会做同样的事情——任何时候你睡觉,它都会做同样的事情,gui会冻结直到它完成 解决方案是连接到Kivy的事件系统并使用其内部while循环。最简单的方法可能是向LoginScreen添加一个新方法,如下所示 在
\uuuu init\uuuu
中:
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秒调用一次