2015-11-26 140 views
1

試圖弄清楚如何使用setter在kivy中進行綁定。我發現API中的文檔非常糟糕。他們非常期待在他們的kivy引擎周圍有大量的假設知識。Kivy按功能更新標籤

ANYWAY,咆哮過來。這是我的代碼。

class ScreenOne(Screen): 
     story = StringProperty('') 
     def __init__ (self,**kwargs): 
      super (ScreenOne, self).__init__(**kwargs) 

      Buttonlayout = GridLayout(orientation='vertical',cols=1, spacing=2, size_hint_y=None) 
      Buttonlayout.bind(minimum_height=Buttonlayout.setter('height')) 

      btn = Button(text="change the text", size_hint_y=None, height=80,text_size=(350,None),font_size='12sp') 
      btn.bind(on_press=partial(self.changer,"text has changed")) 

      Buttonlayout.add_widget(btn) 
      root.add_widget(Buttonlayout) 
      self.add_widget(root) 

     def changer(self,*args): 

      self.story = args[0] 
      self.manager.current = 'screen2' 

    class ScreenTwo(Screen): 

     def __init__(self,**kwargs): 
      super (ScreenTwo,self).__init__(**kwargs) 
      my_box1 = BoxLayout(orientation='vertical') 
      L1 = Label(text=self.screenOne.story,font_size='24dp') 
      L1.bind(self.L1.setter('text')= story) 
      my_button1 = Button(text="Go to screen 1",size_hint_y=None, size_y=100) 
      my_button1.bind(on_press=self.changer) 

      my_box1.add_widget(self.L1) 
      my_box1.add_widget(my_button1) 
      self.add_widget(my_box1) 

     def changer(self,*args): 
      self.manager.current = 'screen1' 

這個想法是,當我按下類screenOne中的按鈕,它改變屏幕它應該改變screenTwo中的標籤。我想最好的方法是使用屬性,然後將標籤綁定到StringProperty中的更改。我可以改變故事中的字符串,如果我向它添加打印指令,我可以看到它發生了變化。它只是更新我遇到的標籤。

我似乎無法得到它的工作。幫助和指導將不勝感激。

myapp.py

from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.properties import StringProperty, ObjectProperty 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.label import Label 
from kivy.uix.button import Button 
from kivy.app import App 

class ScreenOne(Screen): 
    story = StringProperty('') 

    def changer(self,*args): 
     self.story += args[0] 
     self.manager.current = 'screen2' 

class ScreenTwo(Screen): 
    pass 

class MyApp(App): 
    pass 

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

my.kv

回答

1

需要注意的是所期望的行爲可以是(幾乎)完全只用kv語言實現

ScreenManager: 
    ScreenOne: 
     id: screen_one 
     name: 'screen1' 
     GridLayout: 
      orientation:'vertical' 
      cols:1 
      spacing:2 
      size_hint_y:None 
      on_minimum_height: self.setter('height') 
      Button: 
       text:"change the text" 
       size_hint_y:None 
       height: 80 
       text_size: (350,None) 
       font_size: '12sp' 
       on_press: screen_one.changer("text ") 
    ScreenTwo: 
     name: 'screen2' 
     BoxLayout: 
      orientation: 'vertical' 
      Label: 
       id: L1 
       text: screen_one.story 
       font_size: '24dp' 
      Button: 
       text: "Go to screen 1" 
       size_hint_y: None 
       size_y:100 
       on_press: root.current = 'screen1' 

但是,如果你想使用Label的setter,更改MyApp類的定義:

class MyApp(App): 
    def build(self): 
     print self.root.ids 
     S1 = self.root.ids['screen_one'] 
     L1 = self.root.ids['L1'] 
     S1.bind(story=L1.setter('text')) 

,並確保該Labeltext是靜態的:text: 'start ...'