我正在尝试制作一个有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)
它不起作用的原因是
root
引用当前规则的根(在本例中是<Buttons>
)。该规则的根还包含该规则中包含的id,因此该函数在Buttons
上被调用,但是由于它没有id,self.ids
是空的。在在第二个示例中,
root
指的是<Main2Widget>
,它的规则中确实包含一个id为textbox
的小部件。在通常,小部件规则(
<Buttons>
)不能访问其自身规则之外的小部件。这是因为它可以插入任何地方,并且可能有或可能没有任何东西可以访问。在例外情况是
App
对象。您可以在kv中的任何位置访问应用程序对象。在我能为你的问题想出3个解决办法。最简单的方法是将函数调用放入的函数放在一个的函数里。然后您只需保留对根小部件的引用:
<Main2Widget>
规则中(您已经尝试过了)。{{{13>如果你想把第二个最后一个,也是我可能使用的方法,是使用
^{pr2}$StringProperty
(同样在App
类上):然后可以用
text: app.the_text
将textinput绑定到属性,并在按钮中用on_press: app.the_text = self.text
设置它。在我看来,这更简洁,因为您不需要在python端使用回调或访问id。在相关问题 更多 >
编程相关推荐