如何在kivy recycleview中从动态创建的按钮切换屏幕

时间:2020-02-20 06:34:58

标签: python android-recyclerview kivy kivy-language

问题

如果有要处理的数据,我有一个屏幕(OrderScreen),其中装有按钮。我希望用户单击其中一个按钮进入另一个屏幕(MenuScreen)以处理数据。虽然我的意图是用按钮中的数据填充下一个屏幕,但是我目前只是想让ScreenManager在按下按钮后切换到下一个屏幕。我向pass_data()添加了OrderButton方法,并试图在那里触发屏幕管理器,但是self.manager.currentroot.manager.current抛出了异常。任何帮助将不胜感激。

recycleview_test.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.recycleview import RecycleView
from kivy.uix.screenmanager import ScreenManager, Screen
from random import randint



class MenuScreen(Screen):
    def quit(self):
        App.get_running_app.stop()
        Window.close()

class OrderScreen(Screen):
    pass

class OrderButton(Button):
    def __init__(self, **kwargs):
        super(OrderButton, self).__init__(**kwargs)
        
    def pass_data(self):
        print("button pushed")

class OrderScroll(RecycleView):
    def __init__(self, **kwargs):
        super(OrderScroll, self).__init__(**kwargs)
        self.data = [{'text': str(f"Make {randint(10, 25)} items from package #{randint(1,4)}")} for x in range(12)]

class WindowManager(ScreenManager):
    pass

class RecycleApp(App):
    def build(self):
        return WindowManager()
    
if __name__ == "__main__":
    RecycleApp().run()

recycle.kv

#:import Factory kivy.factory.Factory
#: import ScreenManager kivy.uix.screenmanager.ScreenManager
#: import Screen kivy.uix.screenmanager.ScreenManager
#:import App kivy.app.App


<OrderScroll>:
    viewclass: 'OrderButton'
    manager: None
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
        padding: 20
        spacing: 10

<OrderButton>:
    manager: None
    font_size: 32
    bold: True
    on_release: 
        root.pass_data()

<WindowManager>:
    id: screen_manager
    OrderScreen:
        id: order_screen
        name: "OrderScreen"
        manager: screen_manager
    MenuScreen:
        id: menu_screen
        name: 'MenuScreen'
        manager: screen_manager

<OrderScreen>:
    BoxLayout:
        orientation: "vertical"
        Label:
            text: "Data Buttons"
            font_size: 64
            size_hint_y: None
            # pos_hint: {"x":0, "y":1} 
            height: 200
        OrderScroll:


<MenuScreen>:
    BoxLayout:
        orientation: "vertical"
        Label:
            text: "Made it"
            font_size: 64
        FloatLayout:
            Button:
                text: 'Keep going'
                font_size: 48
                size_hint: .8,.5
                pos_hint: {"center_x": .5, "center_y": .1}
        FloatLayout:
            Button:
                text: 'Quit'
                size_hint: .15,.3
                pos_hint: {"center_x": .5, "center_y": .5}
                on_release:
                    root.quit()
                    

1 个答案:

答案 0 :(得分:0)

尝试创建屏幕管理器的对象:

class RecycleApp(App):
    def build(self):
        self.sm = WindowManager()
        return self.sm

然后通过以下方式访问它:

App.get_running_app().sm.current = 'MenuScreen' # in Python
app.sm.current = 'MenuScreen' # in kv