Kivy - 按ID删除小部件

时间:2017-02-11 07:31:41

标签: python user-interface kivy kivy-language

我有以下代码:

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文件中声明的小部件? (我知道我可以用on_press替换Button self.parent.remove_widget(self),但除了删除小部件之外,我在root.remove()中都有代码。)

1 个答案:

答案 0 :(得分:3)

当您的按钮的父级内部实际为remove_widget时,您正在调用GUI对象的BoxLayoutremove_widget只删除直接的孩子,而不是任何后代。

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()