代码之家  ›  专栏  ›  技术社区  ›  James C

在程序启动时从python初始化kivy小部件值

  •  1
  • James C  · 技术社区  · 7 年前

    我试图在程序启动时初始化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 回复  |  直到 7 年前
        1
  •  2
  •   ikolim    7 年前

    使用 启动时 时钟安排一次 添加事件以显示初始值,然后显示更改。

    注释

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

    自己 -关键字self引用当前的widget实例,即app。

    Kivy Language » ids

    当处理kv文件时,所有带有id标记的小部件的weakerefs都会添加到根小部件id字典中。

    代码段

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

    例子

    主.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