【问题标题】:Kivy - TextInput text show in Label text when Button is clicked (Not KV Lang)Kivy - 单击按钮时,TextInput 文本显示在标签文本中(不是 KV Lang)
【发布时间】:2021-06-08 20:16:37
【问题描述】:

如何使用按钮使我在 TextInput 字段 (textA) 中输入的文本显示在标签 (labelA) 中?

每次有新的输入时,点击按钮时,标签会显示最新的输入。

我使用时出现问题: self.textA = TextInput(text='ss')

当我输入新文本并单击按钮时,标签始终显示“ss”。它没有更新新的输入。

希望有人可以展示该方法 - 仅在 python 中,而不是 Kivy 语言

谢谢

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label


class One(BoxLayout):
    def __init__(self, **kwargs):
        super(One, self).__init__(**kwargs)
        self.orientation = 'vertical'
        # text input
        self.textA = TextInput(font_size='60sp')
        self.add_widget(self.textA)
        self.add_widget(Two())


class Two(BoxLayout):
    def __init__(self, **kwargs):
        super(Two, self).__init__(**kwargs)
        self.orientation = 'vertical'

        # Button
        self.btnA = Button(text='Show')
        self.btnA.bind(on_press=show)
        self.add_widget(self.btnA)

        # Output
        self.labelA = Label(text='Result Here From Input')
        self.add_widget(self.labelA)


def show(value):
    Two().labelA.text = str(One().textA.text)
    x = Two().labelA.text
    y = One().textA.text
    print(x)
    print(y)


class TestApp(App):
    def build(self):
        return One()


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

【问题讨论】:

    标签: python-3.x kivy


    【解决方案1】:

    每当您使用One()Two() 时,您都会创建OneTwo 的新实例,这些新实例与您的GUI 中的实例无关。如果您想访问您的 GUI 中的实例,您必须对此进行安排。例如,在One 类中,您可以保存对Two 实例的引用:

    class One(BoxLayout):
        def __init__(self, **kwargs):
            super(One, self).__init__(**kwargs)
            self.orientation = 'vertical'
            # text input
            self.textA = TextInput(font_size='60sp')
            self.add_widget(self.textA)
            self.two = Two()  # save a reference to the Two instance
            self.add_widget(self.two)
    

    由于One 的实例是App 的根(由build() 方法返回),您可以从App 访问它。那么你的show() 方法可以变成:

    def show(value):
        one = App.get_running_app().root
        two = one.two
        two.labelA.text = one.textA.text
        x = two.labelA.text
        y = one.textA.text
        print(x)
        print(y)
    

    【讨论】:

    • 感谢约翰·安德森。我测试和它的工作。实际上,我很难(难以理解)从另一个类调用其他小部件。我知道使用 KV 语言编写很容易,但我首先在学习(理解)用 Python 编写的代码。我忘了在 One() 中添加 Two()。实际上,这段代码是我的代码的一部分,我有另一个布局(主布局 - 堆栈布局)。我的主布局中有 One() 和 Two()。
    • 好的,所以为了让它工作,我需要(总是)检查哪个是应用程序的根目录(由 bu​​ild() 方法返回)。我将尝试我的实际代码并希望它在那里工作。只是问,除了这个 > App.get_running_app().root - 是否访问/调用 one() 类?再次感谢!
    • 好的,它在我的实际代码上工作。我想我理解这一点 - “App.get_running_app().root.one.textA.text”= (rootWidget).(class).(widget).(widgetProperty)。谢谢!
    • 如果您将show() 方法放入TestApp 的方法中,方法是将其放在TestApp 类定义中并添加self 参数(如def show(self, value):)。那么第一行可以变成one = self.root。当然,这需要更改bind 命令:self.btnA.bind(on_press=App.get_running_app().show)
    • 哦,原来如此,我明白了。谢谢你的时间,并帮助了我。 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2017-01-10
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多