在使用id如下链接kv和python代码的基本示例中了解到:
请考虑my.kv中的以下代码:
<MyFirstWidget>:
# both these variables can be the same name and this doesn't lead to
# an issue with uniqueness as the id is only accessible in kv.
txt_inpt: txt_inpt
Button:
id: f_but
TextInput:
id: txt_inpt
text: f_but.state
on_text: root.check_status(f_but)
在myapp.py中:
class MyFirstWidget(BoxLayout):
txt_inpt = ObjectProperty(None)
def check_status(self, btn):
print('button state is: {state}'.format(state=btn.state))
print('text input text is: {txt}'.format(txt=self.txt_inpt))
并且此代码有效,即我们可以使用txt_inpt访问Label。我试图在我的代码中为按钮做同样的事情,但我收到一个错误:
play_Button.text = 'hello'
AttributeError:&#39; kivy.properties.ObjectProperty&#39;对象没有属性&#39; text&#39;
见下面的代码:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.graphics import Color
gui = '''
<MenuScreen>:
play_Button: playButton
GridLayout:
size_hint: .2, .2
pos_hint: {'center_x': .5, 'center_y': .5}
rows: 1
Button:
id: playButton
text: 'Play !'
'''
class MenuScreen(Screen):
play_Button = ObjectProperty(None)
def __init__(self, **kwargs):
super(MenuScreen, self).__init__(**kwargs)
#If i use below one it works
#self.ids.playButton.text = 'hello'
Builder.load_string(gui)
play_Button.text = 'hello'
pass
class MyJB(App):
def build(self):
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
return sm
if __name__ == '__main__':
MyJB().run()
如果我使用ids.play_Button它按预期工作但似乎我做错了另一种方式。有人可以建议吗?
答案 0 :(得分:2)
class MenuScreen(Screen):
play_Button = ObjectProperty(None)
def __init__(self, **kwargs):
super(MenuScreen, self).__init__(**kwargs)
#If i use below one it works
#self.ids.playButton.text = 'hello'
Builder.load_string(gui)
play_Button.text = 'hello'
pass
您在这里缺少一些缩进,play_Button.text
行应该在__init__
方法中(并且pass
什么都不做,所以您可以删除它)。这是SO或您实际代码中的拼写错误吗?
如果它在你的实际代码中,它会导致给定的错误,因为它是在声明类时运行的,而不是在实例化类的实例时运行。这意味着它不会看到objectproperty所持有的对象,而只是ObjectProperty本身......它(根据错误)没有属性'text'。
在应用的build
方法中加载kv字符串,甚至在任何类之外加载kv字符串也更为正常。