如何使按钮删除自身?

时间:2019-05-16 20:53:49

标签: python kivy

因此,在Kivy中,您通常通过访问按钮的ID或名称或其他方式来删除按钮。有什么方法可以访问被按下的按钮的信息,以便在被按下时可以将其自身删除?假设您有很多按钮,而您不知道ID,或者您有100个按钮,那将要花很多时间?

2 个答案:

答案 0 :(得分:1)

删除小部件

使用remove_widget()从子级列表中 删除小部件

    self.parent.remove_widget(self)

删除所有小部件/按钮

使用clear_widgets()从小部件中删除所有子项/按钮

        self.parent.clear_widgets()

许多按钮

使用继承为Button的类和带有on_touch_down函数的方法collide_point()来检查与我们的小部件之间的触摸冲突。

Kivy » Touch event basics

  

默认情况下,触摸事件将分派给所有当前显示的事件   小部件。这意味着小部件会接收触摸事件,无论它是否发生   不在他们的物理区域内。

     

...

     

为了提供最大的灵活性,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)

示例

main.py

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

输出

App Started Button0 - Deleted Buttons 51 and 30 - Deleted

答案 1 :(得分:0)

我不太擅长Kivy,但是有一个很好的解释here.

以下是您可能需要的要点:

首先,当从kv调用按钮实例时,必须将按钮实例显式传递给该方法:

on_press: app.Pressbtn(self) 然后,您可以使用实例引用来修改按钮或查看其属性,而无需ID。如果要获取ID,则只能使用父按钮的ID字典来实现。

相关问题