我有一个屏幕,该屏幕在从基于python的代码输入时生成BoxLayout和Label。 BoxLayout将基于kv文件中预定义的ID插入BoxLayout中。
我有一个每秒被调用的函数,我想更新生成的标签。但是,这样做时,找不到ID。
尝试根据ID更新标签失败。
self.ids.generatedLabel = "Updated text"
根据Kivy文档和其他论坛,我了解到ID是在屏幕构建时生成的,因此不会显示任何动态添加的内容。但是,另一篇文章似乎指向能够将创建的窗口小部件存储为Python中的引用。怎么做?还是有一种方法可以在已经加载后简单地“重新加载” Screen的小部件字典?
'因为您是用代码创建它们的,所以您可以自己保存对它们的引用(使用.kv很难做到)。 Referencing id of dynamically created widget in Kivy
def update_gui_labels(self, *args):
self.ids.generatedLabel = "Updated text"
def on_enter(self, *args):
if label:
print("Label found start generating")
self.build_labels(label)
else:
print("No labels")
Clock.schedule_interval(self.update_gui_labels, 1)
def build_labels(self, label):
labelID = StringProperty("generatedLabel")
print("Creating Label: " + label.name)
print("Label Value: " + label.value)
print("Update Label ID: " + labelID)
labelHolder = BoxLayout(
orientation='vertical',
size_hint_y=None
)
labelHolder.bind(minimum_height=labelHolder.setter('height'))
labelHeader = Label(
size_hint_y= None,
height='60sp',
text=label.name
)
updLabel = Label(
id= generatedLabel,
size_hint_y= None,
height='60sp',
text=label.value
)
labelHolder.add_widget(labelHeader)
labelHolder.add_widget(updLabel)
self.ids.screen_Labels.add_widget(labelHolder)
<ScreenExample>:
BoxLayout:
id: screen_Labels
orientation: 'vertical'
spacing: 5
答案 0 :(得分:0)
您没有尝试设置ID generatedLabel
,因此这就是您尝试访问ID失败的原因。
但是,另一篇文章似乎指向能够将创建的窗口小部件存储为Python中的引用。怎么做?
这只是指普通的Python变量操作。当您编写a = []
时,a是对该列表的引用。如果您写b = a
,则b也是对该列表的引用。如果您写self.the_list = a
,则表示已在当前对象中存储了对该列表的引用,以后可以访问self.the_list
以再次使用它。