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