如何移动在树周围的kv中定义的小部件?

时间:2016-06-09 12:30:41

标签: python python-3.x kivy

为了制作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定义吗?

1 个答案:

答案 0 :(得分:0)

如果你想阅读idschildren表,你应该等到第二个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)