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

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

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

Пример:

on_press: root.manager.current = 'screen2'

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

screenmanager.current = 'screen2'

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

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 , и часто бывает полезно создавать подобные обратные вызовы с предустановленным параметром.

  • Использование класса ObjectProperty
  • Как центрировать текст по вертикали внутри текстового ввода в файле kv?
  • Kivy - привязать текст метки к переменной (только для Python)
  • Как центрировать текст по горизонтали в текстовом вводе kivy?
  • Как получить исполняемый файл Windows из моего приложения kivy (Pyinstaller)?
  • Как сделать GPS-приложение для android с помощью kivy, pyjnius?
  • Разница между Kivy и Java для приложений для Android
  • kivy: изменение текста ярлыка динамически созданной метки
  • Python - лучший язык программирования в мире.