Kivy使按钮改变文本输入?

2024-06-26 13:36:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个有3个按钮和一个显示器的应用程序(我使用TextInput)。在

当一个按钮被按下时,我希望按钮的文本显示在显示屏上。e、 g,如果你按112,我要112出现在显示屏上。在

有没有一种方法可以做到这一点,而不必手动增加每个按钮的按下次数?这是不起作用的代码。我觉得这行不通,因为“self.ids.文本框.text“指的是错误的东西。我不知道该怎么纠正。在

不工作main2.py:

import kivy
kivy.require("1.9.0")

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.core.window import Window

class Buttons(Button):

    def callback(self, text):
        self.ids.textbox.text = "Hi"


class Main2Widget(BoxLayout):

    pass

class Main2App(App):
    '''docstring for Main2App'''
    def build(self):
        Window.size = (300, 200)
        return Main2Widget()


if __name__ == "__main__":
    Main2App().run()

主2.kv不工作:

^{pr2}$

如果我这样做,它会起作用:

工作main2.py:

import kivy
kivy.require("1.9.0")

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.core.window import Window


class Main2Widget(BoxLayout):

    def callback(self, text):
        self.ids.textbox.text += text

    pass

class Main2App(App):
    '''docstring for Main2App'''
    def build(self):
        Window.size = (300, 200)
        return Main2Widget()


if __name__ == "__main__":
    Main2App().run()

工作电源2.kv:

#:kivy 1.9.0

<Main2Widget>:
    orientation: 'vertical'

    TextInput:
        id: textbox
        multiline: False
        readonly: True

        hint_text: "I'm an input box!"
        font_size: 20

    GridLayout:
        cols: 3

        Button:
            id: btn1
            text: "1"
            on_press: root.callback(self.text)

        Button:
            id: btn2
            text: "2"
            on_press: root.callback(self.text)

        Button:
            id: btn3
            text: "3"
            on_press: root.callback(self.text)

Tags: textfromimportselfappcallbackbuttonwindow
1条回答
网友
1楼 · 发布于 2024-06-26 13:36:30

它不起作用的原因是root引用当前规则的根(在本例中是<Buttons>)。该规则的根还包含该规则中包含的id,因此该函数在Buttons上被调用,但是由于它没有id,self.ids是空的。在

在第二个示例中,root指的是<Main2Widget>,它的规则中确实包含一个id为textbox的小部件。在

通常,小部件规则(<Buttons>)不能访问其自身规则之外的小部件。这是因为它可以插入任何地方,并且可能有或可能没有任何东西可以访问。在

例外情况是App对象。您可以在kv中的任何位置访问应用程序对象。在

我能为你的问题想出3个解决办法。最简单的方法是将函数调用放入<Main2Widget>规则中(您已经尝试过了)。{{{13>如果你想把第二个的函数放在一个的函数里。然后您只需保留对根小部件的引用:

class Main2App(App):
    '''docstring for Main2App'''    
    def build(self):
        Window.size = (300, 200)
        self.root =  Main2Widget()
        return self.root

    def callback(self, text):
        self.root.ids.textbox.text = "Hi"

最后一个,也是我可能使用的方法,是使用StringProperty(同样在App类上):

^{pr2}$

然后可以用text: app.the_text将textinput绑定到属性,并在按钮中用on_press: app.the_text = self.text设置它。在我看来,这更简洁,因为您不需要在python端使用回调或访问id。在

相关问题 更多 >