通过屏幕管理器 kivy 恢复输入值

Recup input value through screen manager kivy

我想从我的第一个屏幕捕捉一个值到我的第三个屏幕。

首先,我在输入栏中写下我的名字。 我去下一个window.

并且我尝试在最后一个 window 中展示我的名字。

所以我与您分享代码,希望我能找到问题。

Python代码:

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen



#define ou different screens
class FirstWindow(Screen):
    def envoyer(self):
        name = self.ids.nom_input.text

        self.ids.my_name.text = name


class SecondWindow(Screen):
    pass

class ThirdWindow(Screen):
    #PROBLEM HERE
    def on_press(self):
        self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text


class WindowManager(ScreenManager):
    pass

class MonWidget(Widget):
    pass


kv = Builder.load_file('new_window.kv')

class AwesomeApp(App):

    def build(self):
        Window.clearcolor = (0,0,0,0)
        return kv

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

我的 KV 代码:

WindowManager:
    FirstWindow:
    SecondWindow:
    ThirdWindow:




<FirstWindow>:
    name: "romain"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            id: my_name
            text: "Entrez votre nom"
            font_size: 32

        TextInput:
            id: nom_input
            multiline: False
            size_hint: (1, .5)

        Button:
            text: "Next screen"
            font_size: 32
            on_press: root.envoyer()
            on_release:
                app.root.current = "Mickael"
                root.manager.transition.direction = "left"
            


<SecondWindow>:
    name: "Mickael"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "Entre votre ville"
            font_size: 32

        TextInput:
            id: ville_input
            multiline: False
            size_hint: (1, .5)


        Button:
            text: "Vérifier les infos"
            font_size: 32
            on_release:
                app.root.current = "foncier"
                root.manager.transition.direction = "left"

        Button:
            text: "go back first screen"
            font_size: 32
            on_release:
                app.root.current = "romain"
                root.manager.transition.direction = "right"

    


<ThirdWindow>:
    name: "foncier"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "Verifier : "
            font_size: 32


        Label:
            id: recup_infos
            text: ""
            font_size: 32
            color: 'white'


        Button:
            text: "On press"
            font_size: 32
            #Problem HERE
            on_press: root.on_press()

        Button:
            text: "Précedent"
            font_size: 32
            on_release:
                app.root.current = "Mickael"
                root.manager.transition.direction = "right"

你能帮帮我吗? 谢谢 罗曼

在您的 on_press 方法中:

def on_press(self):
    self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text

self.root.get_screen('FirstWindow').ids.my_name.text 不是访问您现在所在的 class 之外的小部件的正确方法,或者在这种情况下,屏幕。正确的方法是使用App.get_running_app()方法:

self.ids.recup_infos.text = App.get_running_app().root.ids.First.ids.my_name.text

但在此之前,您必须为应用程序的屏幕提供 ID,以便上面演示的方法的 First 参数实际上有意义:

WindowManager:
    FirstWindow:
        id: First 
        # "First" is the id of the FirstWindow class
        # which can also explain why there was a "First" arg
        # inside "App.get_running_app().root.ids.First.ids.my_name.text"
    SecondWindow:
        id: Second
    ThirdWindow:
        id: Third

仍然对为什么这有效感到困惑?我们把App.get_running_app().root.ids.First.ids.my_name.text的属性分成3部分:

  • App.get_running_app():此方法 returns 您的 运行ning App class 的位置,在本例中为 AwesomeApp。如果您要在 App 对象本身中获取变量,这也充当 self
  • .root.ids.First:如果你读过Kivy的文档,或者只是单纯的在网上看过Kivy的课程视频,细心的你应该知道self.root.ids里面的App对象returns一个列表根小部件内的小部件的 ID。在这种情况下,App.get_running_app().root.ids 在这里做同样的事情,并且您的屏幕在 ScreenManager 根小部件中传递,因此使 First 成为 App.get_running_app().root.ids[=43 中的可用属性=]
  • .ids.my_name.text:同上,App.get_running_app().root.ids.Firstself 一样,如果你要 运行 它在你的 FirstWindow class,这让您有机会在工作之外访问变量 classes/screens