更新 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 None
和 None
无法添加为小部件。
您第一次从方法 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)
.
.
.
我正在尝试用新内容更新显示。我正在使用 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 None
和 None
无法添加为小部件。
您第一次从方法 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)
.
.
.