Kivy:从另一个类的小部件中检索文本?

Posted

技术标签:

【中文标题】Kivy:从另一个类的小部件中检索文本?【英文标题】:Kivy: Retrieving Text from Widget in another Class? 【发布时间】:2020-09-15 10:13:28 【问题描述】:

我正在尝试从另一个类(此处为“GetInfoFromAnotherClass”)访问一个类(此处为“UserInput”)的 TextInput.text。但是,“检索信息”按钮仅给出初始输入,不会更新。在“UserInput”类中,这没问题->“获取信息”按钮。无论我在文本字段中输入什么,“检索信息”按钮总是返回“第一个输入”。我不知道用谷歌搜索什么了。希望你们能帮帮我!

这是我的问题的“接近最小”示例:

import kivy
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout


class Container(GridLayout):
    pass

class UserInput(BoxLayout):
    first_input = ObjectProperty(None)
    second_input = ObjectProperty(None)

    def __init__(self,**kwargs):
        super().__init__(**kwargs)

    def ui_btn(self):
        print(self.first_input.text)
        print(self.second_input.text)


class GetInfoFromAnotherClass(BoxLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.ui = UserInput()

    def retrieve_info(self):
        print(self.ui.first_input.text)
        print(self.ui.second_input.text)


class MainApp(App):
    def build(self):
        return Container()

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

还有main.kv:

#:kivy 1.11.0

# Well this is just for Beauty ;-)
<MyTextInput@TextInput>:
    size_hint_y: None
    height: 50
    multiline: False
    write_tab: False

<MyButton@Button>:
    size_hint_y: None
    height: 50

<Container>:

    cols: 1

    UserInput
    GetInfoFromAnotherClass

<UserInput>:
    first_input: first_input
    second_input: second_input
    size_hint_y: None
    height: self.minimum_height
    padding: 20

    MyTextInput:
        id: first_input
        text: "First Entry"

    MyTextInput:
        id: second_input
        text: "Second Entry"

    MyButton:
        text: "Get Info in the same class"
        on_press: root.ui_btn()

<GetInfoFromAnotherClass>:
    size_hint_y: None
    height: self.minimum_height
    padding: 20

    MyButton:
        text: "Retrieve Info from another Class"
        on_press: root.retrieve_info()

【问题讨论】:

【参考方案1】:

self.ui = UserInput() 调用创建了一个不同的 UserInput 实例,一个没有人使用的实例。

访问文本框的一种方法是:

首先为您的UserInput 实例指定一个ID
<Container>:
    cols: 1
    UserInput:
        id: user_input_box
    GetInfoFromAnotherClass:
创建一个变量来存储当前运行的应用程序
class GetInfoFromAnotherClass(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.app = App.get_running_app()
        # self.ui = UserInput()
之后,使用下面的代码访问文本..
    def retrieve_info(self):
        print(self.app.root.ids.user_input_box.ids.first_input.text)
        print(self.app.root.ids.user_input_box.ids.second_input.text)

【讨论】:

Thanksalot 爵士送上他的祝福! 非常感谢...这节省了很多时间

以上是关于Kivy:从另一个类的小部件中检索文本?的主要内容,如果未能解决你的问题,请参考以下文章

kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行

Kivy 如何访问子小部件中的小部件

如何在 kivy python 中的标签、文本输入和其他小部件中添加标题

从另一个文件中的按钮切换 QStackedWidget 中的小部件

如何禁用 Kivy 中的小部件?

如果未动态添加,如何正确删除Kivy中的小部件