2015-12-12 2 views
5

Как я могу использовать цикл while в этом коде для чтения серийных каждые 2 секунды и показывать его в ярлыке? это приложение будет повешено в run, и я новичок в python, чтобы решить эту проблему.Использование цикла while в Pycharm и Kivy

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

Вы не можете запустить «в то время как True» петля так - это то, что само по себе 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 секунды.

Смежные вопросы