Kivy: изменение экранов в экранном менеджере с событием on_press

Я хотел бы знать, как менять экраны с помощью события on_press, привязанного к кнопке, без использования файла KV / KV.

Я прочитал документацию Kivy, но смог найти решения только с использованием файла KV.

Пример:

on_press: root.manager.current = 'screen2'

Я также могу изменить экран в главном файле python, используя:

screenmanager.current = 'screen2'

Но я не могу понять, как добиться этого, используя кнопку.

  • Связывание экранов с классами GridLayout в киви
  • Как сделать GPS-приложение для android с помощью kivy, pyjnius?
  • Kivy: BoxLayout против GridLayout
  • Взаимодействие между виджетами Kivy в Python
  • Множественный выбор Kivy с флажками
  • Как получить доступ к id / widget из другого класса из файла kivy (.kv)?
  • Как связать id дочерних элементов в холсте в Kivy?
  • Игры Python, Kivy и Android
  • 3 Solutions collect form web for “Kivy: изменение экранов в экранном менеджере с событием on_press”

    Один простой способ добиться этого – определить свой собственный подкласк кнопок:

     class ScreenButton(Button): screenmanager = ObjectProperty() def on_press(self, *args): super(ScreenButton, self).on_press(*args) self.screenmanager.current = 'whatever' 

    Метод on_press автоматически вызывается при нажатии кнопки, поэтому current свойство screenmanager будет изменено.

    Тогда вы можете иметь код вроде:

     sm = ScreenManager() sc1 = Screen(name='firstscreen') sc1.add_widget(ScreenButton(screenmanager=sm)) sc2 = Screen(name='whatever') sc2.add_widget(Label(text='another screen')) sm.add_widget(sc1) sm.add_widget(sc2) 

    При щелчке по кнопке следует переключать экраны по мере необходимости.

    Другой способ (вероятно, как это делает на самом деле язык kv) – это вручную использовать метод bind .

     def switching_function(*args): some_screen_manager.current = 'whatever' some_button.bind(on_press=switching_function) 

    Это означало бы, что some_button вызывается всякий раз, когда some_button . Конечно, здесь много гибкости в отношении того, как и когда вы определяете функцию, поэтому (например) вы можете сделать что-то более общее, например, передать screenmanager в качестве первого аргумента функции.

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

    Рабочий пример с двумя экранами, без файла kv, все сделано в Python:

     import kivy kivy.require('1.8.0') from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.uix.button import Button from kivy.properties import ObjectProperty class ScreenOne(Screen): def __init__ (self,**kwargs): super (ScreenOne, self).__init__(**kwargs) my_box1 = BoxLayout(orientation='vertical') my_label1 = Label(text="BlaBlaBla on screen 1", font_size='24dp') my_button1 = Button(text="Go to screen 2",size_hint_y=None, size_y=100) my_button1.bind(on_press=self.changer) my_box1.add_widget(my_label1) my_box1.add_widget(my_button1) self.add_widget(my_box1) def changer(self,*args): self.manager.current = 'screen2' class ScreenTwo(Screen): def __init__(self,**kwargs): super (ScreenTwo,self).__init__(**kwargs) my_box1 = BoxLayout(orientation='vertical') my_label1 = Label(text="BlaBlaBla on screen 2",font_size='24dp') my_button1 = Button(text="Go to screen 1",size_hint_y=None, size_y=100) my_button1.bind(on_press=self.changer) my_box1.add_widget(my_label1) my_box1.add_widget(my_button1) self.add_widget(my_box1) def changer(self,*args): self.manager.current = 'screen1' class TestApp(App): def build(self): my_screenmanager = ScreenManager() screen1 = ScreenOne(name='screen1') screen2 = ScreenTwo(name='screen2') my_screenmanager.add_widget(screen1) my_screenmanager.add_widget(screen2) return my_screenmanager if __name__ == '__main__': TestApp().run() 

    Другим решением было использовать метод setter EventDispatcher, чтобы получить ссылку на функцию setter для screen_manager.current

     button.bind(on_press=partial(sm.setter('current'), (sm, 'whatever')) 

    конечно, это не очень сексуально, поэтому kv часто является более чистым решением для этих вещей, но оно должно работать.

    ps: в случае, если вы не знаете об этом, partial поступают из модуля functools , и часто бывает полезно создавать подобные обратные вызовы с предустановленным параметром.

    Interesting Posts

    Как поместить продукт в корзину через tasytpie API?

    Остановить прокрутку в динамической странице с помощью Selenium в Python

    Отображение значений в словаре python

    Как отключить предупреждения «missing docstring» на уровне файлов в Pylint?

    psycopg2 "TypeError: не все аргументы, преобразованные во время форматирования строки"

    Обновление файлов cookie в сеансе с помощью модуля python-requests

    Как создать фиксированный размер, изменяемый массив объектов Python в Cython?

    Скрытие пароля в скрипте python (небезопасная обфускация)

    Драйвер драйвера Datastax Python cassandra не работает на Ubuntu

    Python: ulimit и nice для subprocess.call / subprocess.Popen?

    Как отслеживать предыдущий столбец записи даты в кадре данных pandas?

    Как правильно настроить Windows7 для использования Selenium с Firefox ?

    Использование многопроцессорности для поиска сетевых путей

    Взаимодействие пользователя в скрученном процессе

    Как использовать переменные в инструкции SQL в Python?

    Python - лучший язык программирования в мире.