简体   繁体   English

通过py文件访问在kv文件中创建的kivy屏幕管理器

[英]Access a kivy screenmanager created in a kv file through the py file

i want to create the ScreenManager in the kv file, but i also need th change the shown screen in the .py file. 我想在kv文件中创建ScreenManager,但是我还需要在.py文件中更改显示的屏幕。 Thats because i have to create some buttons 那是因为我必须创建一些按钮
dynamically and bind a specific function to them, which will change to a specific (button related) screen. 动态地将特定功能绑定到它们,这将变为特定的(与按钮相关的)屏幕。 Creating the buttons is way more convient in python. 在python中创建按钮更为方便。 So the main question is: how to access the screenmanager created in a kv file through the py file? 因此,主要问题是:如何通过py文件访问在kv文件中创建的screenmanager? To explain it a bit futher, here is some code: 为了进一步解释,这是一些代码:

kv file KV文件

#: kivy 1.10.1

ScreenManager:
    id: screen_manager

    FirstScreen:
        id: first_screen
        name: 'FirstScreen'
        manager: 'screen_manager'
    SecondScreen:
        id: second_screen
        name: 'SecondScreen'
        manager: 'screen_manager'

py file py文件

from kivy.modules import console
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty


class FirstScreen(Screen):
    MenuScreen = ObjectProperty(None)

    def SwitchToSecond(self):
        print(ScreenManagement.current)
        ScreenManagement.current = "TestScreen"


class SecondScreen(Screen):
    pass


class testApp(App):
    pass

if __name__ == "__main__":
    testApp().run()

thank you for any guidance in advance 感谢您的任何提前指导

Here is a simple example using the ScreenManager (I also added a method inside of the MyScreenManager class that accepts a value , which would correspond to the name of the screen you would like to change to, but not necessary for this app to run): 这是一个使用ScreenManager的简单示例(我还在MyScreenManager类的内部添加了一个方法,该方法接受一个value ,该value对应于您想要更改为的屏幕名称,但对于运行此应用程序不是必需的):

Python 蟒蛇

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

class Screen1(Screen):

    pass

class Screen2(Screen):

    pass

class Screen3(Screen):

    pass

class MyScreenManager(ScreenManager):

    def changescreen(self, value):

        self.current = value

#Main application
class TestApp(App):

    def build(self):
        self.sm = MyScreenManager()
        return self.sm

if __name__ == '__main__':
    TestApp().run()

kv 千伏

<MyScreenManager>:

    Screen1:
        name: 'screen1'
    Screen2:
        name: 'screen2'
    Screen3:
        name: 'screen3'

<Screen1>:

    GridLayout:

        rows: 2
        padding: 20
        spacing: 20

        Button:
            text: 'Go to Screen 2'
            on_press: root.manager.current = 'screen2'

        Button:
            text: 'Go to Screen 3'
            on_press: root.manager.current = 'screen3'

        Label:
            text: 'You are on ' + root.name

<Screen2>:

    GridLayout:

        rows: 2
        padding: 20
        spacing: 20

        Button:
            text: 'Go to Screen 1'
            on_press: root.manager.current = 'screen1'

        Button:
            text: 'Go to Screen 3'
            on_press: root.manager.current = 'screen3'

        Label:
            text: 'You are on ' + root.name

<Screen3>:

    GridLayout:

        rows: 2
        padding: 20
        spacing: 20

        Button:
            text: 'Go to Screen 1'
            on_press: root.manager.current = 'screen1'

        Button:
            text: 'Go to Screen 2'
            on_press: root.manager.current = 'screen2'

        Label:
            text: 'You are on ' + root.name

If you want to access the ScreenManager within a Screen you must use its manager attribute, but for this you must not create a property with the same name, in your case you are doing it which is considered a bad practice. 如果要访问屏幕内的ScreenManager ,则必须使用其manager属性,但是为此,您不能创建具有相同名称的属性,在这种情况下,您应该这样做,这被认为是不好的做法。

Modifying your code and adding some elements we obtain the following example: 修改代码并添加一些元素,我们得到以下示例:

*.kv * .kv

#: kivy 1.10.1

ScreenManager:
    id: screen_manager

    FirstScreen:
        id: first_screen
        name: 'FirstScreen'
        Button:
            text: "First"
            on_press: first_screen.SwitchToSecond()
    SecondScreen:
        id: second_screen
        name: 'SecondScreen'
        Label:
            text: "second"

.*py 。* py

from kivy.modules import console
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty


class FirstScreen(Screen):
    MenuScreen = ObjectProperty(None)

    def SwitchToSecond(self):
        self.manager.current = "SecondScreen"


class SecondScreen(Screen):
    pass


class testApp(App):
    pass

if __name__ == "__main__":
    testApp().run()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM