kivy.uix.screenmanage
Простейшее использование:
from kivy.uix.screenmanager import ScreenManager, Screen sm = ScreenManager() # Create the manager for i in range(4): # Add few screens screen = Screen(name='Title %d' % i) sm.add_widget(screen) # By default, the first screen added into the ScreenManager will be # displayed. You can then change to another screen. # A transition will automatically be used. sm.current = 'Title 2' # Let's display the screen named 'Title 2'
ScreenManager по умолчанию настроен слайд-переход с параметрами направления и продолжительности.
Обратите внимание, что по умолчанию на экране ничего не отображается: это просто RelativeLayout. Вам нужно использовать этот класс в качестве корневого виджета для вашего собственного экрана, лучший способ-подкласс.
Внимание! Поскольку Screen является RelativeLayout, важно понимать общие подводные камни (в то время как ScreenManager наследован от FloatLayout — прим. переводчика для общего развития).
Вот пример с «экран меню» и » экран настроек’:
from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen # Create both screens. Please note the root.manager.current: this is how # you can control the ScreenManager from kv. Each screen has by default a # property manager that gives you the instance of the ScreenManager used. Builder.load_string(""" <MenuScreen>: BoxLayout: Button: text: 'Goto settings' on_press: root.manager.current = 'settings' Button: text: 'Quit' SettingsScreen>: BoxLayout: Button: text: 'My settings button' Button: text: 'Back to menu' on_press: root.manager.current = 'menu' """) # Declare both screens class MenuScreen(Screen): pass class SettingsScreen(Screen): pass # Create the screen manager sm = ScreenManager() sm.add_widget(MenuScreen(name='menu')) sm.add_widget(SettingsScreen(name='settings')) class TestApp(App): def build(self): return sm if __name__ == '__main__': TestApp().run()
Изменение ориентации:
Общий случай использования для ScreenManager включает использование перехода слайда, который скользит вправо к следующему экрану и скользит влево к предыдущему экрану. Основываясь на предыдущем примере, это может быть выполнено следующим образом:
Builder.load_string(""" <MenuScreen>: BoxLayout: Button: text: 'Goto settings' on_press: root.manager.transition.direction = 'left' root.manager.current = 'settings' Button: text: 'Quit' <SettingsScreen>: BoxLayout: Button: text: 'My settings button' Button: text: 'Back to menu' on_press: root.manager.transition.direction = 'right' root.manager.current = 'menu' """)
Другое использование:
Начиная с версии 1.8.0, теперь вы можете динамически переключаться на новый экран, изменять параметры перехода и удалять предыдущий с помощью switch_to():
sm = ScreenManager() screens = [Screen(name='Title {}'.format(i)) for i in range(4)] sm.switch_to(screens[0]) # later sm.switch_to(screens[1], direction='right')
Обратите внимание, что этот метод добавляет экран к экземпляру ScreenManager и не должен использоваться, если ваши экраны уже были добавлены к этому экземпляру. Чтобы переключиться на экран, который уже добавлен, вы должны использовать текущее свойство.
Изменения переходов:
По умолчанию доступно несколько переходов, например:
NoTransition — switches screens instantly with no animation
SlideTransition — slide the screen in/out, from any direction
CardTransition — new screen slides on the previous or the old one slides off the new one depending on the mode
SwapTransition — implementation of the iOS swap transition
FadeTransition — shader to fade the screen in/out
WipeTransition — shader to wipe the screens from right to left
FallOutTransition — shader where the old screen ‘falls’ and becomes transparent, revealing the new one behind it.
RiseInTransition — shader where the new screen rises from the screen centre while fading from transparent to opaque.
Вы можете легко переключать переходы, изменяя свойство ScreenManager.transition: sm = ScreenManager(transition=FadeTransition())
Примечание:
В настоящее время ни один из переходов на основе шейдеров не использует сглаживание. Это потому, что они используют FBO, который не имеет никакой логики для обработки суперсэмплирования. Это известная проблема, и мы работаем над прозрачной реализацией, которая даст такие же результаты, как если бы она была отображена на экране.
Чтобы быть более конкретным, если вы видите резкий обрезанный текст во время анимации, это нормально
API
class kivy.uix.screenmanager.Screen(**kw)
События:
- on_pre_enter: () — Событие срабатывает, когда экран собирается быть использован: ввод анимации запускается.
- on_enter: () — Событие запускается при отображении экрана: анимация ввода завершена.
- on_pre_leave: () — Событие запускается, когда экран собирается быть удален: начинается анимация выхода.
- on_leave: () — Событие запускается при удалении экрана: анимация выхода завершена.
transition_state=’out’ — Значение, представляющее состояние перехода:
- ‘in’, если переход будет показывать ваш экран
- «out» если переход будет скрывать ваш экран
После завершения перехода состояние сохранит свое последнее значение (in или out).
ScreenManager
class kivy.uix.screenmanager.
ScreenManager
(**kwargs)
Диспетчер экрана. Это основной класс, который будет управлять стеком экрана и памятью.
По умолчанию менеджер будет показывать только один экран одновременно.
Методы:
add_widget
(screen)clear_widgets
(screens=None)current=None
— задает имя экрана, который отображается в данный момент, или экран для отображения:from kivy.uix.screenmanager import ScreenManager, Screen sm = ScreenManager() sm.add_widget(Screen(name='first')) sm.add_widget(Screen(name='second')) # By default, the first added screen will be shown. If you want to # show another one, just set the 'current' property. sm.current = 'second'
current_screen
— Содержит текущий экран. Вы не должны изменять это свойство вручную, вместо этого используйте current.get_screen
(name) — Возврат виджета экрана, связанного с именем, или вызов диспетчера экрана Exceptionifnotfound.
has_screen
(name) — Возвращает имя следующего экрана из списка экранов.
on_touch_down
(touch),on_touch_move
(touch),on_touch_up
(touch) — события, наследуемые от RelativeLayout и имеющие сходное поведение.previous
() — Возвращает имя предыдущего экрана из списка экранов.
remove_widget
(*l) — аналогично RelativeLayoutscreen_names
— Список имен всех добавленных виджетов экрана. Список доступен только для чтения. screens_names является свойством псевдонима и доступен только для чтения. Он обновляется при изменении списка экранов или имени экрана.screens
— Список всех добавленных виджетов экрана. Этот список не следует изменять вручную. Вместо этого используйте метод add_widget.экраны-это свойство ListProperty и по умолчанию [], только для чтения.switch_to
(screen, **options) — Добавьте новый или существующий экран в Диспетчер экранов и переключитесь на него. Предыдущий экран будет «выключен». параметры-это параметры перехода, которые будут изменены до того, как произойдет анимация.Если предыдущие экраны недоступны, экран будет использоваться в качестве основного:sm = ScreenManager() sm.switch_to(screen1) # later sm.switch_to(screen2, direction='left') # later sm.switch_to(screen3, direction='right', duration=1.)
Если какая-либо анимация выполняется, она будет остановлена и заменена этой: вы должны избегать этого, потому что анимация будет просто выглядеть странно. Использовать switch_to() или current, но не оба.
Имя экрана будет изменено, если есть какой-либо конфликт с текущим экраном.transition
— Объект перехода, используемый для анимации перехода от текущего экрана к следующему показываемому.Например, если вы хотите использовать переход Wipe между слайдами:from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition sm = ScreenManager(transition=WipeTransition()) sm.add_widget(Screen(name='first')) sm.add_widget(Screen(name='second')) # by default, the first added screen will be shown. If you want to # show another one, just set the 'current' property. sm.current = 'second'
transition — это ObjectProperty и по умолчанию имеет значение
SlideTransition
.