在程序启动时从Python初始化Kivy小部件值

时间:2018-05-27 13:09:11

标签: python widget kivy

我试图在程序启动时初始化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'

我尝试过其他一些非常绝望的解决方法,但没有成功。

1 个答案:

答案 0 :(得分:1)

使用 on_start 事件在程序启动时初始化标签的文本。在下面的示例中,添加了 Clock.schedule_once 事件以显示初始值,然后显示更改。

注意

在此示例中,根小部件是 Label 小部件( root ),并且根的词典(root.ids)为空。如果有另一个小部件id: my_textinput,作为根的子级添加,则根的字典将包含一个ID,即 my_textinput print(self.root.ids)将证明这一点。

self - 关键字self引用“当前窗口小部件实例”,即App。

Kivy Language » ids

  

处理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()

实施例

main.py

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()

输出

Img01 - App Startup Img02 - Label's text changed