2015-12-12 5 views
5

このコードでwhileループを使用すると、2秒ごとにシリアルを読み込んでラベルに表示できますか?このアプリケーションは実行中にハングして、私はこれを解決するためにPythonには新しくあります。あなたはそのような「しばらく真の」ループを実行することはできませんPycharmとKivyのwhileループの使用

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

- それはKivy自体が内部的にやっていることだし、それは入力をチェックし、すべての反復は、それを自分で行うことにより、GUIなどを更新あなたは今までからKivyのループを停止前進。これは単なるキビのことではなく、他の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秒ごとに呼び出されます。

関連する問題