2015-12-12 22 views
5

Come posso utilizzare il ciclo while in questo codice per leggere seriale ogni 2 secondi e mostrarlo in un'etichetta? questa applicazione verrà appesa in esecuzione e sono nuova in Python per risolvere questo problema.Uso del ciclo while in Pycharm e 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() 

risposta

1

Non è possibile eseguire un 'po' True' ciclo del genere - questo è ciò che Kivy si sta facendo internamente, ad ogni iterazione controlla ingresso, aggiorna l'interfaccia grafica, ecc facendo da soli si smette ciclo di Kivy da sempre avanzando. Anche questa non è solo una cosa kivy, è anche il modo in cui funzionano gli altri framework GUI, anche se non tutti eseguono le cose gui nel thread principale.

Anche il sonno fa la stessa cosa: ogni volta che dormi, fa esattamente questo, e il gui si congela fino a quando non finisce.

La soluzione è collegare il sistema degli eventi di Kivy e utilizzare il suo ciclo while interno. Il modo più semplice è probabilmente quello di aggiungere un nuovo metodo al tuo LoginScreen, come di seguito.

in __init__:

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

e un nuovo metodo:

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

... e poi metodo

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

L'aggiornamento sarà poi chiamato ogni 2 secondi.