Kivy — передача значения с одного экрана на другой с помощью настройки текущей страницы

#python #kivy #kivy-language

#python #kivy #kivy-language

Вопрос:

Я пытаюсь изменить экран в Kivy на экран выхода, где у меня есть две кнопки. Yes , No . Если я нажму Yes , я хочу нормально завершить код. Когда No я хотел бы вернуться на предыдущую страницу, но я не могу передать имя предыдущей страницы на exit page

Метод моего класса приложения

     def change_screen(self, screen_name, type_=SlideTransition(), page_before=None):
        # Get screen_manager from main.kv file
        screen_manager = self.root.ids['screen_manager']

        # Set transition (https://kivy.org/doc/stable/api-kivy.uix.screenmanager.html)
        if type_ == "RiseInTransition":
            screen_manager.transition = RiseInTransition()
        else:
            screen_manager.transition = SlideTransition()

        if page_before: #tried **kwargs, doesn't work, because current accept only str
            page_before = {"page_before": page_before}
            screen_manager.current = screen_name
  

.kv файл

             Button:
                text: "end"
                size_hint : .2, .1
                pos: ((root.width - self.width) -20, 20)
                background_color : 0.1, 0.5, 0.6, 1
                on_release:
                    app.change_screen("exit_screen", type_="RiseInTransition", page_before="something")
  

Как я мог бы передать page_before переменную в

 class ExitScreen(Screen):
    pass
  

???

Ответ №1:

Вы можете вызвать on_press: root.manager.current = 'YourScreenName' непосредственно на языке kv, чтобы немного упростить переходы между экранами?

Попробуйте приведенный ниже пример:

 from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string("""
<MainScreen1>:
    GridLayout:
        cols: 2
        Button:
            text: 'Yes'
            on_press: root.buttonpress()
        Button:
            text: 'No'
            on_press: 
                root.manager.transition.direction = 'left'
                root.manager.current = 'screen2'
                root.otherfunction()

<MainScreen2>:
    GridLayout:
        cols: 2
        Button:
            text: 'No'
            on_press: root.buttonpress()
        Button:
            text: 'Yes'
            on_press: 
                root.manager.transition.direction = 'up'
                root.manager.current = 'screen1'
                root.otherfunction()
                    
""")

# Declare both screens
class MainScreen1(Screen):
    def buttonpress(self):  # load in new bdf function graph
        print("You pressed a button on screen1")
    def otherfunction(self):
        print("do other function")
        
class MainScreen2(Screen):
    def buttonpress(self):  # load in new bdf function graph
        print("You pressed a button on screen2")
    def otherfunction(self):
        print("do other function")
        
# Create the screen manager
sm = ScreenManager()
sm.add_widget(MainScreen1(name='screen1'))
sm.add_widget(MainScreen2(name='screen2'))

class TestApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()
  

Любые вопросы просто задавайте.