首页 > 解决方案 > 如何解决 remove_widget 在 Kivy 的另一个布局中要删除的小部件

问题描述

我是一个刚刚学习编码和 Python 的初学者。我无法删除我刚刚创建的小部件。

我仍然可以创建新按钮。这实际上只是一个小小的侧面测试。

最终我想要一个滚动视图,我可以在其中添加和删除按钮。有一些添加/删除小部件代码片段,但我必须能够在另一个布局中添加/删除小部件。

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'

标签: pythonkivy

解决方案


属性错误

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

根本原因

MyApp 继承的 App 类没有方法,remove_widget(). 只有一个根小部件,它通常有可以有自己的孩子的孩子。

问题

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

解决方案

  • 替换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 小部件 » remove_widget()

Kivy 中的小部件以树的形式组织。您的应用程序有一个根小部件,它通常具有可以有自己的子级的子级。小部件的子级表示为children 属性,即 Kivy ListProperty

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

add_widget() : 添加一个小部件作为子
元素 remove_widget() : 从子列表中删除一个小部件
clear_widgets() : 从一个小部件中删除所有子元素


推荐阅读