python - 如何解决 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'
解决方案
属性错误
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() : 从一个小部件中删除所有子元素