2016-02-13 63 views
0

我找不到在python代码中设置on_press的语法来改变屏幕的任何地方。我不断收到错误,如Button(text = 'hi', on_press = self.current = 'start_menu。这是代码,它的工作原理。用python逻辑改变屏幕(Kivy Screen manager)

class LoadMenu(Screen): 
    def __init__(self, **kwargs): 
     super(LoadMenu, self).__init__(**kwargs) 
     Clock.schedule_once(self.update) 

    def update(self, dt): 
     L = [x for x in range(len(os.listdir('saves')))] 
     for x in L: 
      x = self.add_widget(Button(text = os.listdir('saves')[x])) 

我没有定位按钮,所以他们只是在彼此的顶部,但我可以稍后修复。我需要发生的是,每个按钮在按下时切换到play屏幕,以便每个按钮都相同,但我也需要每个按钮来加载他们引用的Shelve文件(我知道我需要另一个功能)我可以有一个on_press一次触发两个事件,我又如何设置它在Python代码?

回答

1

考虑下面的程序:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import Screen 
from kivy.uix.button import Button 
from kivy.clock import Clock 
from kivy.properties import StringProperty 

dirlist = ['aaa', 'bbb', 'ccc', 'ddd'] 

class MyButton(Button): 
    prop = StringProperty('') 
    def on_press(self): 
     print "Class-defined on_press handler (I'm {})".format(self.text) 

def other_on_press_handler(sender): 
    print "other_on_press_handler, from {}".format(sender.text) 

def some_func(text): 
    print "yeah: " + text 

class LoadMenu(Screen): 
    def __init__(self, **kwargs): 
     super(LoadMenu, self).__init__(**kwargs) 
     Clock.schedule_once(self.update) 

    def on_press_handler(self, sender): 
     print "on_press_handler, from {}".format(sender.text) 
     self.parent.current = 'sc2' 

    def yet_another_on_press_handler(self, sender): 
     print "yet_another_on_press_handler, from {}".format(sender.text) 
     self.parent.current = 'sc2' 

    def update(self, dt): 
     for x in range(len(dirlist)): 
      my_b = Button(text = dirlist[x], on_press=self.on_press_handler) 
      self.parent.ids.button_container.add_widget(my_b) 
      if x > 1: 
       my_b.bind(on_press=other_on_press_handler) 
      if x == 3: 
       my_b.bind(on_press=lambda sender: some_func("Whoa, lambda was here ({})".format(sender.text))) 
     for x in range(len(dirlist)): 
      my_b = MyButton(text = 'my '+ dirlist[x], prop="{} {}".format(dirlist[x], x)) 
      self.parent.ids.button_container.add_widget(my_b) 
      my_b.bind(on_press=self.yet_another_on_press_handler) 

root = Builder.load_string(""" 
ScreenManager: 
    LoadMenu: 
     name: 'sc1' 
     GridLayout: 
      cols: 4 
      id: button_container 
    Screen: 
     name: 'sc2' 
     BoxLayout: 
      Button: 
       text: "Go back" 
       on_press: root.current = 'sc1' 
""") 

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

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

让我们通过查看LoadMenuupdate方法开始:在第一环路中,产生一系列按钮,并且每一个在创建接收on_press回调。循环中的最后两个按钮被绑定到另一个回调,最后一个示例显示如何使用lambda表达式来生成回调。 在第二个for循环中,我们实例化MyButton类的对象,它是Button的子对象。请注意,我们还在类定义中定义了一个on_press处理程序;除了我们可能绑定的其他函数之外,这被调用。 但实际上,这实际上在kivy Events and Properties docs中都有很好的解释。

+0

非常感谢您的深入解答!这有很大帮助。我其实已经在我手机上的标签中打开了哈哈。我会确保仔细查看该页面 – Arkyris