我试图在程序启动时初始化Kivy中的一些小部件值,但没有成功。简化的Python代码是:
inital_text = "init text"
class MainApp(App):
def initialize_widgets(self):
self.root.ids.my_label.text = initial_text
if __name__ == '__main__':
MainApp().run()
MainApp.initialize_widgets(App)
来自kv文件的相关部分是:
Label:
id: my_label
text: "default text"
当我运行程序时,标签显示"默认文本"。退出时,我收到错误:
line 5, in initialize_widgets
self.root.ids.my_label.text = initial_text
AttributeError: type object 'App' has no attribute 'root'
我尝试过其他一些非常绝望的解决方法,但没有成功。
答案 0 :(得分:1)
使用 on_start 事件在程序启动时初始化标签的文本。在下面的示例中,添加了 Clock.schedule_once 事件以显示初始值,然后显示更改。
在此示例中,根小部件是 Label 小部件( root ),并且根的词典(root.ids)为空。如果有另一个小部件id: my_textinput
,作为根的子级添加,则根的字典将包含一个ID,即 my_textinput 。 print(self.root.ids)
将证明这一点。
self - 关键字self引用“当前窗口小部件实例”,即App。
处理kv文件时,所有使用ids标记的小部件的弱引用都会添加到根小部件的ids字典中。
from kivy.app import App
initial_text = "init text"
class MainApp(App):
def on_start(self):
self.root.text = initial_text
if __name__ == '__main__':
MainApp().run()
from kivy.app import App
from kivy.clock import Clock
initial_text = "init text"
class MainApp(App):
def on_start(self):
Clock.schedule_once(self.initialize_widgets, 5)
def initialize_widgets(self, dt):
self.root.text = initial_text
if __name__ == '__main__':
MainApp().run()