2015-12-12 12 views
5

में लूप का उपयोग करते हुए मैं इस कोड में लूप को प्रत्येक 2 सेकंड में सीरियल पढ़ने और लेबल में दिखाने के लिए कैसे उपयोग कर सकता हूं? यह एप्लिकेशन रन में फांसी लगाएगा और मैं इसे हल करने के लिए अजगर के लिए नया हूं।पिचर्म और किवी

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 ही आंतरिक रूप से हर यात्रा यह इनपुट की जाँच करता है क्या कर रहा है, है, जीयूआई अद्यतन करता है आदि यह अपने आप को ऐसा करने से रोक Kivy के पाश बढ़ते। यह सिर्फ एक कीवी चीज नहीं है, यह भी है कि अन्य गुई ढांचे कैसे काम करते हैं, हालांकि सभी मुख्य धागे में गुई सामान नहीं चलाते हैं।

नींद भी वही काम करती है - जब भी आप सोते हैं, यह ठीक है, और गुई इसे समाप्त होने तक स्थिर हो जाएगा।

समाधान किवी की घटना प्रणाली में हुक करना और इसके आंतरिक लूप का उपयोग करना है। सबसे आसान तरीका शायद नीचे दी गई अपनी लॉगिन स्क्रीन पर एक नई विधि जोड़ना है।

__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 सेकंड बुलाया जाएगा।