2015-11-03 108 views
1

我有一個有兩個屏幕的小型kivy應用程序。我想從第一如何更新第二個kivy屏幕上的標籤文本

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.properties import StringProperty 

# Declare both screens 
class MainScreen(Screen): 
    def SetText(self): 
     text='Total='+str(17*21) 
     StrategyScreen().SetText(text) 

class StrategyScreen(Screen): 
    labelText = StringProperty() 
    labelText='My label' 
    print 'start' 

    def SetText(self, text): 
     print 'a', self.labelText 
     self.labelText=text 
     print 'b', self.labelText 

class TestApp(App): 
    def build(self): 
     # Create the screen manager 
     screenManager = ScreenManager() 
     screenManager.add_widget(MainScreen(name='main')) 
     screenManager.add_widget(StrategyScreen(name='strategy')) 
     return screenManager 

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

更新第二標籤與KV文件:

<MainScreen>: 
    BoxLayout: 
     orientation: "vertical" 
     Button: 
      text: 'Goto strategy' 
      on_press: root.manager.current = 'strategy' 
     Button: 
      text: 'Set text' 
      on_press: root.SetText() 

<StrategyScreen>: 
    BoxLayout: 
     orientation: "vertical" 
     Label: 
      text: root.labelText 
     Button: 
      text: 'Back to menu' 
      on_press: root.manager.current = 'main' 

從上看「開始」,只有一個StrategyScreen的實例和的setText的調用是否正確,但標籤仍然顯示舊文本。

任何人都可以請幫

+0

我想我在這裏誤解OOP。 StrategyScreen類沒有__init__,它如何知道'self'是什麼?我很困惑 – Psionman

回答

1

問題就出在你的MainScreenSetText方法。調用StrategyScreen().SetText(text)會創建StrategyScreen()類型的新臨時對象,調用方法SetText,然後丟棄它,因爲不再需要它。爲了讓現有的屏幕使用self.manager.get_screen()方法:

class MainScreen(Screen): 
    def SetText(self): 
     text = 'Total=' + str(17*21) 
     self.manager.get_screen('strategy').SetText(text) 

與其說StrategyScreen方法,你纔可以直接改變其屬性:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.properties import StringProperty 

Builder.load_string(''' 
<MainScreen>: 
    BoxLayout: 
     orientation: "vertical" 
     Button: 
      text: 'Goto strategy' 
      on_press: root.manager.current = 'strategy' 
     Button: 
      text: 'Set text' 
      on_press: root.SetText() 

<StrategyScreen>: 
    BoxLayout: 
     orientation: "vertical" 
     Label: 
      text: root.labelText 
     Button: 
      text: 'Back to menu' 
      on_press: root.manager.current = 'main' 
''') 

class MainScreen(Screen): 
    def SetText(self): 
     text = 'Total=' + str(17*21) 
     self.manager.get_screen('strategy').labelText = text 

class StrategyScreen(Screen): 
    labelText = StringProperty('My label') 

class TestApp(App): 
    def build(self): 
     # Create the screen manager 
     screenManager = ScreenManager() 
     screenManager.add_widget(MainScreen(name='main')) 
     screenManager.add_widget(StrategyScreen(name='strategy')) 
     return screenManager 

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

謝謝Nykakin。我看不到我的方式,但你幫我做到了 – Psionman

相關問題