2017-10-09 31 views
2

我正在使用kivy,無法獲取kivy界面進行更新。獲取一個kivy應用程序來更新可見界面(無小部件)

我已經基於current_node這個填充其他變量的字典條目來佈局佈局。理想情況下,佈局應該取決於當前節點。

當我運行應用程序時,current_node及其所有子變量在MyApp類中更新,在python代碼中 - 但不在kivy接口上。任何想法爲什麼?

的東西,我已經試過了沒有奏效:

  • 創建一個單獨的類佈局(不能動態地改變按鍵的數量)更改update_node功能包括MyApp.build()
  • (失蹤位置自我)

在此先感謝您的任何建議。

tree = { 
    '0' : ['Hi!', 'A', 'B'], 
    'A' : ['Yes', 'AA', 'AB','AC'], 
    'AA': ['Seneca', 'AAA', 'AAB'], 
    'AAA': ['Yes', 'AAA', 'AAB'], 
    'AAB': ['No', 'AAA', 'AAB'], 
    'AB' : ['Cato', "AA", "AB"], 
    'AC' : ['Neither'], 
    'B' : ["No",'BA','BB'], 
    'BA': ['xx'], 
    'BB': ['xxx'] 
} 

class MyApp(App): 
    current_node = '0' 

    def update_node(self, *args): 
     self.current_node = args[0] 
     self.build() 

    def build(self): 
     layout = FloatLayout() 
     child_nodes = tree[self.current_node][1:] 
     j = len(child_nodes) 
     # Answer Buttons 
     for i in child_nodes: 
      answer_button = Button(
        text=tree[i][0], 
        pos=(100, j*75), 
        size_hint = (0.8, 0.1), 
        ) 
      button_callback = partial(self.update_node, i) 
      answer_button.bind(on_release=button_callback) 
      layout.add_widget(answer_button) 
      j -= 1 
      print(i) 
     return layout 

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

回答

0
def update_node(self, *args): 
    self.current_node = args[0] 
    self.build() 

self.build() - is該應用程序本身調用獲得root控件的方法。你不應該手動調用它,你不能用它重新創建。

你應該改變根小部件的孩子的,而不是:

from functools import partial 

from kivy.app import App 

from kivy.uix.button import Button 
from kivy.uix.floatlayout import FloatLayout 


tree = { 
    '0': ['Hi!', 'A', 'B'], 
    'A': ['Yes', 'AA', 'AB','AC'], 
    'AA': ['Seneca', 'AAA', 'AAB'], 
    'AAA': ['Yes', 'AAA', 'AAB'], 
    'AAB': ['No', 'AAA', 'AAB'], 
    'AB': ['Cato', "AA", "AB"], 
    'AC': ['Neither'], 
    'B': ["No",'BA','BB'], 
    'BA': ['xx'], 
    'BB': ['xxx'] 
} 


class RootWidget(FloatLayout): 
    current_node = '0' 

    def __init__(self, **kwargs): 
     super(FloatLayout, self).__init__(**kwargs) 
     self._rebuild() 

    def update_node(self, i, *args): 
     self.current_node = i 
     self._rebuild() 

    def _rebuild(self, *args): 
     self.clear_widgets() # clear current buttons 

     child_nodes = tree[self.current_node][1:] 
     j = len(child_nodes) 
     # Answer Buttons 
     for i in child_nodes: 
      answer_button = Button(
       pos=(100, j*75), 
       size_hint=(0.8, 0.1), 
       text=tree[i][0], 
      ) 
      answer_button.bind(
       on_release=partial(self.update_node, i) 
      ) 
      j -= 1 
      print(i) 
      self.add_widget(answer_button) 


class MyApp(App): 
    def build(self): 
     return RootWidget() 


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

謝謝!這個解釋和例子非常有用。 – Locke

相關問題