2015-11-26 142 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 ...'