2017-04-08 20 views
0

Kivyのウィジェットに対するデータ構造の解析に問題があり、構造にアクセスして画面上の値をクロック間隔で連続的に更新することができますまだこれを行うのがよいと確信している)。Kivy - 構造をウィジェットに構文解析

Iは、以下の(非稼働)コード内の問題を強調している:

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 

テスト。 kv

私の目的は、そのデータ構造にアクセスすることによって、画面上で常にtestValを更新することですが、現在はこれを達成できません。アドバイスをお願いしますか?あなたがtestStructTableを渡していると、あなたはあなたが明示的に割り当て作るそれまでは存在しないself.testStructTableにアクセスしようとしているあなたの__init__方法で

答えて

1

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

働いています、ありがとう!そのtestValを常に画面上で更新してもらう方法をアドバイスできますか? – Rekovni

+0

プロパティを 'kivy.clock'モジュールと組み合わせて使うのは正しい方法です。 kivyのプロパティはobservatorパターンを実装しているので、それらの変更をウィジェットに即座に反映させることができます。例については、[here](http://www.gurayyildirim.com.tr/kivy-course-5-properties-and-clock-definitions-1191.html)を参照してください。 – Nykakin