как переключаться между двумя экранами в kivy python?

#python #python-3.x #kivy #kivy-language #split-screen-multitasking

#python #python-3.x #kivy #kivy-язык #разделение экрана -многозадачность

Вопрос:

Я пытаюсь переключаться между двумя экранами.. но это не работает .. он ничего не показывал или не выдавал ошибок Я не знаю, в чем проблема, вот мой код

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


class mainWindow(Screen):
    pass


class secondWindow(Screen):
    pass


class windowManager(ScreenManager):
    pass

sm = ScreenManager()
sm.add_widget(mainWindow(name='main'))
sm.add_widget(secondWindow(name='second'))


class multApp(App):
    def build(self):
        return mainWindow()


if __name__ == "__main__":
    multApp().run()
  

и mult.kv

 windowManager:
    mainWindow:
    secondWindow:

<mainWindow>:
    name: "main"

    Button:
        text: "Submit"
        on_press : root.manager.current = "second"

<secondWindow>:
    name: "second"

    Button:
        text: "go back"
        on_press : root.manager.current = "main"
  

Ответ №1:

У вас есть несколько проблем в вашем коде.

  • Ваш build() метод возвращает mainWindow() . Это означает, что графический интерфейс вашего приложения состоит только из a Screen ( mainwindow ) с no ScreenManager . Таким root.manager.current = образом, строки в вашем kv будут завершены с ошибкой, потому что нет менеджера.
  • Ваш mult.kv файл содержит правило ( windowManager: ) для построения графического интерфейса пользователя, но это правило переопределяется вашим build() методом.
  • В вашем коде у вас есть три строки (начинающиеся с sm = ScreenManager() ), которые также создают графический интерфейс, но вы ничего не делаете с результатами этих строк. Таким образом, эти строки не имеют никакого эффекта.
  • Имена ваших классов должны начинаться с символа верхнего регистра. При использовании kv , как вы, это является обязательным требованием.

Принимая все это во внимание, вот модифицированная версия вашего кода, которая должна работать:

код python:

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

class MainWindow(Screen):
    pass


class SecondWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass

# sm = ScreenManager()
# sm.add_widget(mainWindow(name='main'))
# sm.add_widget(secondWindow(name='second'))


class multApp(App):
    pass
    # def build(self):
    #     return mainWindow()


if __name__ == "__main__":
    multApp().run()
  

mult.kv:

 WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"

    Button:
        text: "Submit"
        on_press : root.manager.current = "second"

<SecondWindow>:
    name: "second"

    Button:
        text: "go back"
        on_press : root.manager.current = "main"
  

Ответ №2:

Я согласен с ответами Джона, просто чтобы добавить к этому. Если вы объявляете manager как класс, я всегда возвращаю manager в методах сборки, также рекомендуется создавать идентификаторы для ваших экранов под вашим корневым менеджером, так как это облегчит обращение к ним

 <WindowManager>:
    id: screen_manager

    MainWindow:

         id: main_window
         name: "main_window"
         manager: screen_manager   

    SecondWindow:

         id: second_window
         name: "second_window"
         manager: screen_manager