2015-12-12 8 views
5

Jak mogę używać pętli while w tym kodzie do czytania seryjnego co 2 sekundy i pokazywania go na etykiecie? ta aplikacja zostanie zawieszona podczas uruchamiania i jestem nowa dla Pythona, aby rozwiązać ten problem.Używanie pętli w Pycharmie i 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() 

Odpowiedz

1

Nie można uruchomić „podczas true” pętla tak - to samo Kivy robi wewnętrznie każdej iteracji to sprawdza dane wejściowe, aktualizuje GUI itd. Robiąc to sam pan zatrzymać pętlę Kivy jest od zawsze postęp. To nie jest tylko kwestia kivy, ale także inne frameworki GUI, ale nie wszystkie działają w głównym wątku.

Sen też robi to samo - za każdym razem, gdy śpisz, robi to dokładnie, a gui zamarza, aż się skończy.

Rozwiązaniem jest podpięcie się do systemu zdarzeń Kivy i użycie wewnętrznej pętli. Najprostszym sposobem jest prawdopodobnie dodanie nowej metody do swojego LoginScreen, jak poniżej.

w __init__:

self.ser = serial.Serial('COM3', 9600, timeout=0) 

i nowa metoda:

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)))  

... a metoda

from kivy.clock import Clock 
from functools import partial 
Clock.schedule_interval(self.update, 2) 

Aktualizacja zostaną zaproszeni co 2 sekundy.