如果在 kivy 文件中定义了屏幕管理器,如何在 Python 中更改屏幕?

use*_*849 6 python kivy

我的程序在一个屏幕中接收输入,然后将其显示到另一个屏幕中。我想设置一个条件,即仅当值大于 0 时屏幕才会更改。我的屏幕管理器在 kivy 文件中定义。我的问题是如何在我的情况下使用这个 "root.manager.current = "SecondScreen"" 命令。我不知道如何引用它。或者也许有一种方法可以在 .kv 文件中创建条件?

主文件

    from kivy.app import App
    from kivy.properties import StringProperty, NumericProperty, ObjectProperty
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.uix.textinput import TextInput
    from kivy.properties import StringProperty, NumericProperty, ObjectProperty

    global var
    global pp
    pp = '0'
    class FirstScreen(Screen):
        global pp
        ppp = StringProperty('')
        def g(self, text):
            global pp
            if text.isdigit() and int(text) > 0:
                pp = text
Run Code Online (Sandbox Code Playgroud)

我的 test.kv 文件

ScreenManager:
    id: screen_manager
    FirstScreen:
        id: screen1
        name: "FirstScreen"
        manager: screen_manager
    SecondScreen:
        id: screen2
        name: "SecondScreen"
        manager: screen_manager
<FirstScreen>:
    text_input: text_input
    FloatLayout:
        id: fl1
        canvas.before:
            Color:
                rgba: 0.1, 0.1, 0.1, 1
            Rectangle:
                # self here refers to the widget i.e BoxLayout
                pos: self.pos
                size: self.size
        TextInput:
            id: text_input
            text: root.ppp
            multiline: False
            size_hint_x: .4
            size_hint_y: .1
            pos_hint: {'x': .1, 'y': .20}
        Button:
            background_color: 0.2, 0.7, 1, 1,
            font_size: root.width / 15
            id: btn1
            text: "Next"
            on_press:
                root.g(text_input.text)
                root.manager.current = 'SecondScreen'
            size_hint_x: .4
            size_hint_y: .1
            pos_hint: {'x': .5, 'y': .20}
<SecondScreen>:
    on_enter: root.f()
    FloatLayout:
        id: fl2
        canvas.before:
            Color:
                rgba: 0.1, 0.1, 0.1, 1
            Rectangle:
                # self here refers to the widget i.e BoxLayout
                pos: self.pos
                size: self.size
        Label:
            color: 0.2, 0.7, 1, 1,
            font_size: 15
            id: lb1
            text: root.idf
            size_hint_y: .2
            pos_hint: {'x': .1, 'y': .8}
Run Code Online (Sandbox Code Playgroud)

Seb*_*ian 9

kvlang中的方法:

app.root.current = 'screen_name_you_want_to_switch_to'
Run Code Online (Sandbox Code Playgroud)

可以通过在屏幕类中使用 self.parent 在 python 中完成:

self.parent.current = 'screen_name_you_want_to_switch_to'
Run Code Online (Sandbox Code Playgroud)

self.parent 指的是 self 对象(screen)的父对象(screenmanager)

显示两者的示例如下所示,首先是 textinput 上的旁注:我认为您可以通过self.ids['text_input'].text直接使用来访问该值,您可以尝试一下。

import kivy
kivy.require('1.9.0') 
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager,Screen

kvlang = '''
<ScreenManagement>:
    ScreenOne:
    ScreenTwo:

<ScreenOne>:
    name: 'First'
    id: screen1
    Button:
        text: 'screen 1, press me to switch to screen 2, defined in python'
        on_press: root.switch()

<ScreenTwo>:
    name: 'Second'
    id: screen2
    Button:
        text: 'screen 2, press me to switch to screen 1, defined in kvlang'
        on_press: app.root.current = 'First'
'''

class ScreenManagement(ScreenManager):
    pass

class ScreenOne(Screen):
    def switch(self):
        #here you can insert any python logic you like 
        self.parent.current = 'Second'

class ScreenTwo(Screen):
    pass


class MyApp(App):
    def build(self):
        Builder.load_string(kvlang)
        return ScreenManagement()

if __name__ == '__main__':
    MyApp().run()
Run Code Online (Sandbox Code Playgroud)


小智 2

一种方法是在 python 文件中交换屏幕。首先简单地定义屏幕管理器,没有属性或子项(添加屏幕将在 python 中完成)

<ScreenManager>:
Run Code Online (Sandbox Code Playgroud)

将 ScreenManager 类以及 FirstScreen 和 SecondScreen 的类添加到 python 文件中。提供 ScreenManager() 方法以在 FirstScreen 和 SecondScreen 中进行交换

class ScreenManager(widget):
    def __init__(self):
        self.show_FirstScreen()

    def show_FirstScreen(self):
        firstscreen = FirstScreen()
        self.clear_widgets()
        self.add_widget(firstscreen)

    def show_SecondScreen(self):
        secondscreen = SecondScreen()
        self.clear_widgets()
        self.add_widget(secondscreen)
Run Code Online (Sandbox Code Playgroud)

然后添加一个由 on_press 按钮事件调用的方法,以在显示不同屏幕之前执行一些逻辑,例如

    def handle_button(self):
        if <some logic>:
            self.show_SecondScreen()
Run Code Online (Sandbox Code Playgroud)

.kv 文件中的按钮按下必须到达 ScreenManager 类才能到达 handle_button 方法,类似于 root.parent.handle_button,具体取决于结构的深度