【问题标题】:Change screens with python logic (Kivy Screen manager)使用 python 逻辑更改屏幕(Kivy 屏幕管理器)
【发布时间】:2016-02-13 00:54:50
【问题描述】:

我找不到在 python 代码中设置on_press 以在任何地方更改屏幕的语法。我不断收到Button(text = 'hi', on_press = self.current = 'start_menu 之类的错误。这是代码,它按原样工作。

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代码中设置它?

【问题讨论】:

    标签: python screen kivy


    【解决方案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()
    

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

    【讨论】:

    • 感谢您非常深入的回答!这很有帮助。实际上,我现在在手机的标签中打开了它,哈哈。我会确保仔细查看该页面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多