如何解决remove_widget在Kivy中的另一个布局内要删除的小部件

时间:2019-05-17 09:39:24

标签: python kivy

我是初学者python学习者/编码员。我无法删除我刚刚创建的小部件。我仍然可以创建新按钮。这实际上只是一点小考验。最终,我想拥有可在其中添加和删除按钮的scrollview。有一些添加/删除小部件代码段,但是我必须能够添加/删除到另一个布局。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.widget import Widget

KV = """

BoxLayout
    id:aaa
    Button
        text: 'Add'
        on_press: app.add_more()

    Button:
        text:'Remove'
        on_press: app.remove()
    BoxLayout:
        id:abc

"""




class MyApp(App):
    def build(self):
        self.root = Builder.load_string(KV)

    def add_more(self):
        print('wass')
        addbutton = self.root.ids.abc
        addbutton.add_widget(Button(text='hello'))

    def remove(self):
        print('hello')
        self.remove_widget(self.children[0])

MyApp().run()

如果单击“删除”按钮(MyApp对象没有属性“ remove_widget”),则会收到此错误消息

2 个答案:

答案 0 :(得分:0)

由于您将布局加载为self.root = Builder.load_string(KV),因此可以使用self.root.remove_widget(self.root.children[0])删除第一个孩子

答案 1 :(得分:0)

AttributeError

     self.remove_widget(self.children[0])
 AttributeError: 'MyApp' object has no attribute 'remove_widget'

根本原因

由MyApp继承的App类没有方法remove_widget()。只有一个 root部件,该部件通常具有子代,而子代可以拥有自己的子代。

问题

  

在另一个布局中删除小部件

解决方案

  • self.remove_widget(...)替换为self.root.ids.abc.remove_widget(...)
  • self.children[0]替换为self.root.ids.abc.children[0]
  • 在调用remove_widget()之前,请检查布局中是否有子项

摘要

def remove(self):
    print('hello')
    if len(self.root.ids.abc.children) > 0:   # check for children
        self.root.ids.abc.remove_widget(self.root.ids.abc.children[0])  # remove child FIFO

Kivy Widget » remove_widget()

  

Kivy中的小部件是按树组织的。您的应用程序具有根目录   小部件,通常包含children个,其中children个   他们自己的。小部件的子代表示为children   属性,即Kivy ListProperty

     

可以使用以下方法来操纵小部件树:

     

add_widget():将小部件添加为子级
  remove_widget():   从子级列表中删除小部件
  clear_widgets():删除   小部件中的所有子项