因此,在Kivy中,您通常通过访问按钮的ID或名称或其他方式来删除按钮。有什么方法可以访问被按下的按钮的信息,以便在被按下时可以将其自身删除?假设您有很多按钮,而您不知道ID,或者您有100个按钮,那将要花很多时间?
答案 0 :(得分:1)
使用remove_widget()从子级列表中 删除小部件 。
self.parent.remove_widget(self)
使用clear_widgets()从小部件中删除所有子项/按钮
self.parent.clear_widgets()
使用继承为Button
的类和带有on_touch_down
函数的方法collide_point()
来检查与我们的小部件之间的触摸冲突。
默认情况下,触摸事件将分派给所有当前显示的事件 小部件。这意味着小部件会接收触摸事件,无论它是否发生 不在他们的物理区域内。
...
为了提供最大的灵活性,Kivy派遣了 所有小部件的事件,并让他们决定如何对它们做出反应。 如果您只想响应小部件内的触摸事件,则可以 只需检查:
def on_touch_down(self, touch): if self.collide_point(*touch.pos): # The touch has occurred inside the widgets area. Do stuff! pass
class CustomButton(Button):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
print(f"\nCustomButton.on_touch_down: text={self.text}")
self.parent.remove_widget(self) # remove a widget / button
# self.parent.clear_widgets() # remove all children/ buttons
return True # consumed on_touch_down & stop propagation / bubbling
return super(CustomButton, self).on_touch_down(touch)
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
Builder.load_string("""
<Demo>:
cols: 10
""")
class CustomButton(Button):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
print(f"\nCustomButton.on_touch_down: text={self.text}")
self.parent.remove_widget(self) # remove a widget / button
# self.parent.clear_widgets() # remove all children / buttons
return True # consumed on_touch_down & stop propagation / bubbling
return super(CustomButton, self).on_touch_down(touch)
class Demo(GridLayout):
def __init__(self, **kwargs):
super(Demo, self).__init__(**kwargs)
self.create_buttons()
def create_buttons(self):
for i in range(100):
self.add_widget(CustomButton(id="Button" + str(i), text="Button"+str(i)))
class TestApp(App):
def build(self):
return Demo()
if __name__ == "__main__":
TestApp().run()
答案 1 :(得分:0)
我不太擅长Kivy,但是有一个很好的解释here.
以下是您可能需要的要点:
首先,当从kv调用按钮实例时,必须将按钮实例显式传递给该方法:
on_press: app.Pressbtn(self)
然后,您可以使用实例引用来修改按钮或查看其属性,而无需ID。如果要获取ID,则只能使用父按钮的ID字典来实现。