Как переключать экраны с динамически создаваемой кнопки в kivy recycleview - PullRequest
0 голосов
/ 20 февраля 2020

Проблема

У меня есть экран (OrderScreen), который заполняется кнопками, если есть данные для обработки. Я бы хотел, чтобы пользователь нажал одну из кнопок для перехода на другой экран (MenuScreen) для обработки данных. Хотя я намерен заполнить следующий экран данными из кнопки, в настоящее время я просто пытаюсь заставить ScreenManager перейти к следующему экрану после нажатия кнопки. Я добавил pass_data() метод к OrderButton и попытался вызвать там менеджер экрана, но self.manager.current и root.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 голосов
/ 20 февраля 2020

Попробуйте создать объект диспетчера экрана:

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
...