[英]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.