簡體   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