为了理解Kivy kv language背后的逻辑,我试图通过调用Builder.load_string()替换kv文件的自动加载来重写最小的应用程序。 / p>
这是我的出发点(source: examples 1-2, 1-3):两个文件, weather.py 和 weather.kv :
weather.py:
from kivy.app import App
class WeatherApp(App):
pass
if __name__ == '__main__':
WeatherApp().run()
和 weather.kv :
Label:
text: "Hello World"
到那里,一切都很好
。
但是,如果我尝试手动加载kv东西,我只会得到黑屏(并且没有错误消息)。我的代码:
from kivy.app import App
from kivy.lang import Builder
KV = '''
Label
text: "Hello World"
'''
Builder.load_string(KV)
class WeatherApp(App):
pass
if __name__ == '__main__':
WeatherApp().run()
我显然在这里缺少什么,但是呢?任何帮助,将不胜感激!
答案 0 :(得分:2)
创建.kv时,有一些基本但严格的规则,其中只能有一个顶层,因为它没有“ <>”,所以顶层被标识出来,除了让应用程序识别它还必须具有应用程序的名称相同(小写),在您的情况下,.kv称为 weather .kv ,而 Weather App 应用。但是,如果您使用Builder,则上述情况不会发生,如果.kv具有根目录,则Builder.load_string()
将其返回,因此您必须在App的build方法中将其返回:
from kivy.app import App
from kivy.lang import Builder
KV = '''
Label:
text: "Hello World"
'''
root = Builder.load_string(KV)
class WeatherApp(App):
def build(self):
return root
if __name__ == '__main__':
WeatherApp().run()