为了制作ActionPrevious
可点击的标题文字(this question中的更多内容),我试图修改style.kv
中定义的默认窗口小部件树文件。我的尝试是在__init__
期间通过id访问小部件。这就是我的子类:
class LogoutButton(ActionPrevious):
def __init__(self, **kwargs):
super(LogoutButton, self).__init__(**kwargs)
print(self.children) # prints an empty tuple
print(self.ids) # prints an empty dictionary
lb = self.ids['title']
self.remove_widget(lb)
self.ids['prevlayout'].add_widget(lb)
所以,这些照片显示__init__
期间没有任何孩子,即使我已经打电话给ActionPrevious' __init__
。
我知道我想要实现的目标可以通过复制整个定义并调整缩进来实现,但它似乎有点太大而且我不想在我的代码中有这样的东西。我可以使用子类和Python而不复制kv定义吗?
答案 0 :(得分:0)
如果你想阅读ids
或children
表,你应该等到第二个kivy的循环帧。在这里,您尝试在第一个循环框架中访问它们,然后将它们放在一个小部件树中。
您应该做的是等到第一帧结束,然后读取值。最简单的方法是使用@mainthread
装饰器。例如:
from kivy.clock import mainthread
class LogoutButton(ActionPrevious):
def __init__(self, **kwargs):
super(LogoutButton, self).__init__(**kwargs)
self.do_something()
@mainthread
def do_something(self):
print(self.children)
print(self.ids)
lb = self.ids['title']
self.remove_widget(lb)
self.ids['prevlayout'].add_widget(lb)