2017-11-24 4 views
0

Neu in Kivy und OOP.Kivy - Aktualisieren Sie ein Etikett mit Sensordaten?

Ich versuche, ein Etikett in Kivy mit Daten zu aktualisieren, die ich von einem Temperatursensor entnehme. Der Code zum Einlesen der Sensordaten befindet sich in labeltempmod. Ich habe eine Funktion getTheTemp() erstellt, die jede Sekunde aufgerufen wird. In der Funktion versuche ich den Text des Labels per Label zu vergeben (text = (format (thetemp)), font_size = 80). Das Programm ignoriert dies. Was mache ich hier falsch?

#This is a test to see if I can write the temp to label 
import labeltempmod 
import kivy 

from kivy.app import App 
from kivy.clock import Clock 
from kivy.uix.label import Label 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.textinput import TextInput 
from kivy.uix.boxlayout import BoxLayout 

def getTheTemp(dt): 
     thetemp = labeltempmod.readtemp() 
     Label(text=(format(thetemp)), font_size=80) 
     print thetemp 

class LabelWidget(BoxLayout): 
    pass 

class labeltestApp(App): 
    def build(self): 

     # call get_temp 0.5 seconds 
     Clock.schedule_interval(getTheTemp, 1) 

     return LabelWidget() 

if __name__ == "__main__": 
    labeltestApp().run() 

Hier ist die Kivy Sprachdatei:

<LabelWidget>: 
     orientation: 'vertical' 
     TextInput: 
       id: my_textinput 
       font_size: 80 
       size_hint_y: None 
       height: 100 
       text: 'default' 
     FloatLayout: 
       Label: 
         id: TempLabel 
         font_size: 150 
         text: 'Temp Test' 

Dank.

Antwort

0

Sorry, aber Sie nie aktualisieren etwas Sie erstellen nur ein weiteres Label

Try this:

class LabelWidget(BoxLayout): 

    def __init__(self, **kwargs): 
     super(LabelWidget, self).__init__(**kwargs) 
     Clock.schedule_interval(self.getTheTemp, 1) 

    def getTheTemp(self, dt): 
     thetemp = labeltempmod.readtemp() 
     self.ids.TempLabel.text = thetemp 
     print thetemp 

class labeltestApp(App): 

    def build(self): 
     return LabelWidget() 

if __name__ == "__main__": 
    labeltestApp().run() 

aktualisieren: Ihre letzte Anfrage, ich glaube, der beste Weg, das zu tun ist:

... 
class LabelWidget(BoxLayout): 

    def __init__(self, **kwargs): 
     super(LabelWidget, self).__init__(**kwargs) 
     self.Thetemp = None 
     Clock.schedule_interval(self.getTheTemp, 1) 

    def getTheTemp(self, dt): 
     if self.Thetemp is None: 
      self.thetemp = labeltempmod.readtemp() 
     else: 
      self.thetemp = labeltempmod.readtemp(self.theTemp) 
     self.ids.TempLabel.text = str(self.thetemp) 
+1

Vielen Dank, Sie wunderbare Person! Das funktioniert. Ich musste den Interessenten das Format (thetemp) hinzufügen. Der Etikettentext akzeptiert nur Zeichenfolgen. OOP ist diesem Noob etwas verwirrend. Aber ich werde weiter versuchen, es herauszufinden. – Core2

+0

Ich verwende einen Temperatursensor, der nicht sehr präzise ist. Ich möchte einen Verzögerungsfilter erster Ordnung einführen, um die Messwerte zu glätten. Dies führt dazu, dass die alte Temperatur zurück an die Datei labeltempmod.readtemp() übergeben werden muss. Das bedeutet, dass getTheTemp (self, dt) die Temperatur zurückgeben muss. Der getTheTemp (self, dt) wird von clock.schedule aufgerufen. Wie würde ich das temp auf die Funktion __init__ zurückgeben, damit es beim nächsten Aufruf an getTheTemp gesendet werden kann, damit es an labeltempmod.readtemp (thetemp) gesendet werden kann? – Core2

+0

@ Core2 Ich werde meine Antwort aktualisieren –

Verwandte Themen