【问题标题】:How to switch screens from a dynamically created button in kivy recycleview如何从 kivy recycleview 中动态创建的按钮切换屏幕
【发布时间】:2020-02-20 06:34:58
【问题描述】:

问题

如果有要处理的数据,我有一个屏幕 (OrderScreen),其中填充有按钮。我希望用户单击其中一个按钮被带到另一个屏幕(MenuScreen)来处理数据。虽然我的意图是使用按钮中的数据填充下一个屏幕,但我目前只是试图让 ScreenManager 在按下按钮后更改为下一个屏幕。我在OrderButton 中添加了pass_data() 方法并尝试在那里触发屏幕管理器,但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()
                    

【问题讨论】:

    标签: python android-recyclerview kivy kivy-language


    【解决方案1】:

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

    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
    

    【讨论】:

    • app.sm.current 工作,但我必须将WindowManager 初始化为ScreenManager 的子类才能让app.sm.transition.direction 工作。 root.manager.current 适用于其他屏幕转换。我应该将它们全部更改为 app.sm.current 以保持一致还是有理由使用其中一个?
    • @Jason H 你的 WindowManager 类继承了 ScreenManager (这是 Kivy 类),你第一次这样做。这里 app.sm 和 root.manager 指向一个对象,所以没有区别。但是 app.sm 可以在任何地方工作,而 root.manager 只能在 Screen 类中工作。
    • class WindowManager(ScreenManager): pass 本身启用了app.sm.current 工作,但我必须def __init__super(WindowManager, self) 才能让app.sm.transition.direction 工作。它会完美过渡,但在过渡回来后,它使用的是上次使用的过渡方向
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多