Kivy:使用on_press事件更改屏幕管理器中的屏幕

Der*_*ick 7 python kivy

我想知道如何使用绑定到按钮的on_press事件来更改屏幕,而不使用KV文件/ KV语言.

我已经阅读了Kivy文档,但只能使用KV文件找到解决方案.

例:

on_press: root.manager.current = 'screen2'

我还可以使用以下命令更改主python文件中的屏幕:

screenmanager.current = 'screen2'

但我无法弄清楚如何使用按钮实现相同目标.

inc*_*ent 7

实现此目的的一种简单方法是定义自己的按钮子类:

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

按下按钮时会自动调用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)
Run Code Online (Sandbox Code Playgroud)

单击该按钮应根据需要切换屏幕.

另一种方式(可能是kv语言实际上是如何做的)将是手动使用该bind方法.

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

some_button.bind(on_press=switching_function)
Run Code Online (Sandbox Code Playgroud)

这意味着switching_function只要some_button按下就会调用它.当然,关于如何以及何时定义函数,这里有很多灵活性,因此(例如)你可以做一些更通用的事情,比如将screenmanager作为函数的第一个参数传递.

我没有测试这个代码,它不是一个完整的应用程序,但希望意义很明确.无论哪种方法都可以正常工作,您可以选择最合理的方式.我稍后可能会构建一个更完整的例子.


Tom*_*ivy 6

一个有两个屏幕的工作示例,没有用Python完成所有内容的kv文件:

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()
Run Code Online (Sandbox Code Playgroud)