2017-04-08 5 views
0

Ich habe Probleme mit der Analyse einer Datenstruktur zu einem Widget in Kivy, die dann auf die Struktur zugreifen und in der Lage sein würde, einen Wert auf dem Bildschirm kontinuierlich über ein Taktintervall (nicht sicher von einem besseren, dies schon zu tun).Kivy - Parsing Struktur zu Widget

main.py

from kivy.app import App 
from test import TestWidget 

class TestApp(App): 

    def build(self): 
     testStructTable = {'randomVal1': 1, 'testVal': 2, 'randomVal2': 3} 

     # Issue here parsing the table like this? 
     return TestWidget(testStructTable) 

if __name__ == '__main__': 
    TestApp().run() 

test.py

from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.relativelayout import RelativeLayout 
from kivy.properties import NumericProperty 


class TestWidget(RelativeLayout): 

    def __init__(self, testStructTable, **kwargs): 
     super(TestWidget, self).__init__(**kwargs) 
     Builder.load_file('test.kv') 

     sm = ScreenManager() 
     sm.add_widget(MainScreen(name='MainScreen')) 
     self.add_widget(sm) 

     # Error accessing the table 
     print self.testStructTable 

     # Have the update_test_val continuously called 
     #Clock.schedule_interval(MainScreen.update_test_val(testStructTable), 1/60) 


class MainScreen(Screen): 

    def __init__(self, **kwargs): 
     testVal = NumericProperty(0) 

    def update_test_val(self, testStructTable): 
     # Get testVal from testStructTable 
     # Something like: 
     # self.testVal = testStructTable.testVal + 1 ? 
     self.testVal = self.testVal + 1 

Test:

Ich habe die Probleme in der (nicht funktionierenden) Code unten hervorgehoben. kv

Mein Ziel ist es, das TestVal ständig auf dem Bildschirm zu aktualisieren, indem ich auf diese Datenstruktur zugreife, jedoch kann ich das derzeit nicht erreichen, können Sie das bitte raten?

Antwort

1

In Ihrem __init__ Methode sind Sie testStructTable vorbei und dann sind Sie für den Zugriff self.testStructTable denen möchten, existiert nicht, bis Sie explizit einen Auftrag machen:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.relativelayout import RelativeLayout 
from kivy.properties import NumericProperty 


class TestWidget(RelativeLayout): 
    def __init__(self, testStructTable, **kwargs): 
     super(TestWidget, self).__init__(**kwargs) 

     print(testStructTable) 
     self.testStructTable = testStructTable 
     print(self.testStructTable) 


class TestApp(App): 
    def build(self): 
     testStructTable = {'randomVal1': 1, 'testVal': 2, 'randomVal2': 3} 
     # Issue here parsing the table like this? 
     return TestWidget(testStructTable) 

if __name__ == '__main__': 
    TestApp().run() 
+0

Das gearbeitet hat, danke! Könntest du auch beraten, wie der TestVal ständig auf dem Bildschirm aktualisiert wird? – Rekovni

+0

Die Verwendung von Eigenschaften in Kombination mit dem 'kivy.clock'-Modul ist ein richtiger Ansatz dafür. Eigenschaften in kivy implementieren das Observator-Muster, sodass Änderungen an ihnen sofort in Ihren Widgets widergespiegelt werden können. Ein Beispiel finden Sie [http://www.gurayyildirim.com.tr/kivy-course-5-properties-and-clock-definitions-1191.html]. – Nykakin