#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()
. Это означает, что графический интерфейс вашего приложения состоит только из aScreen
(mainwindow
) с noScreenManager
. Таким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