【问题标题】:Initialize Kivy widget values from Python on program start在程序启动时从 Python 初始化 Kivy 小部件值
【发布时间】:2018-05-27 13:09:10
【问题描述】:

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

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

【问题讨论】:

  • 为什么你的根会有一个根?改为self.ids.my_label.text
  • @pstatix 我也试过这个。在那种情况下,我得到错误“AttributeError:类型对象'MainApp'没有属性'ids'”

标签: python widget kivy


【解决方案1】:

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

注意

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

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

Kivy Language » ids

当处理 kv 文件时,所有带有 ids 标记的小部件的weakrefs 被添加到根小部件的 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()

输出

【讨论】:

  • 很好的答案,谢谢。我也很欣赏这些清晰的例子。
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 2021-12-25
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多