【问题标题】:Recup input value through screen manager kivy通过屏幕管理器kivy回收输入值
【发布时间】:2021-09-28 14:59:29
【问题描述】:

我想将第一个屏幕中的值捕获到第三个屏幕中。

首先,我在输入字段中写下我的名字。 我转到下一个窗口。

我尝试在最后一个窗口中显示我的名字。

所以我把代码分享给大家,希望能找到问题。

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"

你能帮我吗? 谢谢 罗曼

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    在您的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 不是访问您现在所在的类之外的小部件的正确方法,或者在这种情况下,屏幕。正确的方法是使用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():此方法返回您正在运行的 App 类的位置,在本例中为 AwesomeApp。如果您要在 App 对象本身中获取变量,这也充当self
    • .root.ids.First:如果您阅读了 Kivy 文档,或者只是简单地在线观看了 Kivy 课程视频,您应该知道 App 对象中的 self.root.ids 返回根小部件内小部件的 id 列表。在这种情况下,App.get_running_app().root.ids 在这里做同样的事情,并且您的屏幕在 ScreenManager 根小部件中传递,因此使 First 成为 App.get_running_app().root.ids 中的可用属性
    • .ids.my_name.text:与上面相同,App.get_running_app().root.ids.First 的行为与 self 相同,如果您要在 FirstWindow 类中运行它,这使您有机会访问工作类/屏幕之外的变量李>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      相关资源
      最近更新 更多