Kivy - 通过id删除小部件

4
我有以下代码:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout


class GUI(FloatLayout):
    def remove(self):
        self.remove_widget(self.ids.test)


class GUIApp(App):
    def build(self):
        return GUI()


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

对应的 kv 文件如下:

#:kivy 1.9.1

<GUI>:
    BoxLayout:
        Button:
            id: test
            text: 'Test'
            on_press: root.remove()

当点击按钮时,应该将其移除。但是这并没有发生。如果我在kv文件中删除BoxLayout,程序将按预期工作,并且按钮将被删除。为什么会发生这种情况,以及如何删除在kv文件中声明的小部件?(我知道我可以用self.parent.remove_widget(self)替换Button的on_press,但是我除了删除小部件之外还有root.remove()中的代码。)
1个回答

4
您正在调用GUI对象的remove_widget函数,但实际上按钮的父级是内部的BoxLayoutremove_widget函数只会删除直接子级,而不会删除任何后代元素。请注意,保留了HTML标签的格式。
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder

Builder.load_string('''
<GUI>:
    BoxLayout:
        id: layout
        Button:
            id: test
            text: 'Test'
            on_press: root.remove()
''')


class GUI(FloatLayout):
    def remove(self):
        self.ids.layout.remove_widget(self.ids.test)


class GUIApp(App):
    def build(self):
        return GUI()


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接