更新 Kivy 的显示

Updating Kivy's display

我正在尝试用新内容更新显示。我正在使用 Builder.load_string() 加载内容。应用程序第一次运行时,它会正确显示内容。但是,当有新内容可用时,Builder.load_string() returns None 和 add_widget() 显示“'NoneType' 对象没有属性 'fbind'” . 为了简单起见,我使用与静态字符串相同的内容更新显示。这是我的代码:

import kivy
import time
from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock,mainthread
from kivy.uix.boxlayout import BoxLayout

kivy.require('1.9.0')

KV='''
<Example>:
     Label:
         text:'hello'
     Label:
         text:'world'
'''

@mainthread
def update(dt):
    try:
       vRoot = App.get_running_app().root
       vRoot.clear_widgets()
       Builder.unload_file('file.kv')
       v=Builder.load_string(KV,filename='file.kv')
       print(v)
       vRoot.add_widget(v)
    except BaseException as e:
       print (str(e))

def loop():
    time.sleep(5)
    Clock.schedule_once(update)

Builder.load_string(KV,filename='file.kv')

class Example(BoxLayout):
      pass

class MyApp(App):
      def build(self):
          return Example()

vThread=threading.Thread(target=loop)
vThread.start()

if __name__ == '__main__':
   MyApp().run()

谢谢

问题是您的 kv-string 除设计外不包含任何根小部件。这就是为什么在加载时 return NoneNone 无法添加为小部件。

您第一次从方法 build 中 return 编辑 Example,该方法用作 root。但是第二次您碰巧将 None 添加为 root.

这是对您的代码的修改,它确实使用新定义的规则进行了更新。

.
.
.
KV='''

<Example>:
    Label:
        text:'hello'
    Label:
        text:'world'
'''

new_rule='''

NewExample:

<NewExample@BoxLayout>:
    Button:
        text:'hello'
    Button:
        text:'world'
'''

@mainthread
def update(dt):
    try:
       vRoot = App.get_running_app().root
       vRoot.clear_widgets()
#       Builder.unload_file('file.kv')
#       v=Builder.load_string(KV,filename='file.kv')
       v = Builder.load_string(new_rule)
       print(v)
       vRoot.add_widget(v)
    except BaseException as e:
       print(str(e))

def loop():
    # Use clock instead of time.sleep.
#    time.sleep(5)
    Clock.schedule_once(update, 5.0)
.
.
.