繁体   English   中英

Kivy-使按钮更改TextInput的文本?

[英]Kivy - Make buttons change the text of TextInput?

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

当按下按钮时,我希望按钮的文本显示在显示中。 例如,如果您按1 1 2,我希望112出现在显示屏中。

有没有一种方法可以手动将on_press添加到每个按钮? 这是不起作用的代码。 我认为它不起作用,因为“ self.ids.textbox.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()

无法正常工作main2.kv:

#:kivy 1.9.0

<Buttons>:
    on_press: root.callback(self.text)

<Main2Widget>:
    id: mainapp

    orientation: 'vertical'

    TextInput:
        id: textbox
        multiline: False
        readonly: True

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

    GridLayout:
        cols: 3

        Buttons:
            id: btn1
            text: "1"

        Buttons:
            id: btn2
            text: "2"

        Buttons:
            id: btn3
            text: "3"

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

工作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()

工作main2.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)

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

在您的第二个示例中, root引用<Main2Widget> ,它的规则中确实包含一个ID为textbox的小部件。

通常,小部件规则( <Buttons> )无法访问其自身规则之外的小部件。 这是因为它可以插入到任何位置,并且可能有访问权限,也可能没有访问权限。

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

我可以为您的问题想到3个解决方法。 最简单的方法是将函数调用放入<Main2Widget>规则(您尝试过)中。 如果您确实希望为按钮设置单独的规则,那么第二个选择是将callback函数放在App类中,然后调用app.callback 然后,您可以保留对根窗口小部件的引用:

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类上):

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

然后,您可以将textinput绑定到带有text: app.the_text的属性,并使用on_press: app.the_text = self.text在按钮中进行设置。 我认为这比较干净,因为您无需使用回调或访问python端的id。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM