首页 > 解决方案 > 使用 Kivy,在按下按钮时动态添加项目

问题描述

我写了以下代码。当我按下“添加项目”按钮时,我希望能够动态添加任意数量的项目。

#-*- coding: utf-8 -*-
from kivy.config import Config
Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)

from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'

        RecycleView:
            size_hint: 1.0,1.0

            BoxLayout:
                orientation: 'vertical'

                Button:
                    id: button1
                    text: "Button1"

                Button:
                    id: addButton
                    text: "Add Item"
                    on_press: root.buttonClicked()
""")

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.properties import StringProperty 

class AddItemWidget(Widget):
    text = StringProperty()

    def __init__(self, **kwargs):
        super(AddItemWidget, self).__init__(**kwargs)

    def buttonClicked(self):
        print("add item test")

class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)

    def build(self):
        return AddItemWidget()

if __name__ == '__main__':
    TestApp().run()

当我单击按钮时,如何获取要添加的元素,如下图所示?

在此处输入图像描述

我希望能够添加 100 或 200,而不是仅仅添加一个,这取决于我单击按钮的次数。

我也希望能够删除我添加的按钮。

标签: pythonkivy

解决方案


您可以使用add_widget()添加新Buttons的到您的BoxLayout,并且使用index=1总是在 .Button上方添加新的Add Item Button。为此,您需要对 的引用BoxLayout,这可以通过id在您的kv. 这是执行此操作的代码的修改版本:

#-*- coding: utf-8 -*-
from kivy.config import Config
from kivy.uix.button import Button

Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')  # eliminate annoying circle drawing on right click

from kivy.lang import Builder
Builder.load_string("""
<AddItemWidget>:
    BoxLayout:
        size: root.size
        orientation: 'vertical'

        RecycleView:
            size_hint: 1.0,1.0

            BoxLayout:
                id: box
                orientation: 'vertical'

                Button:
                    id: button1
                    text: "Button1"

                Button:
                    id: addButton
                    text: "Add Item"
                    on_press: root.buttonClicked()
""")

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.properties import StringProperty

class RemovableButton(Button):
    def on_touch_down(self, touch):
        if touch.button == 'right':
            if self.collide_point(touch.x, touch.y):
                self.parent.remove_widget(self)
                return True
        return super(RemovableButton, self).on_touch_down(touch)


class AddItemWidget(Widget):
    text = StringProperty()

    def __init__(self, **kwargs):
        super(AddItemWidget, self).__init__(**kwargs)
        self.count = 1

    def buttonClicked(self):
        print("add item test")
        self.count += 1
        newButt = RemovableButton(text='Button'+ str(self.count))
        self.ids.box.add_widget(newButt, index=1)


class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)

    def build(self):
        return AddItemWidget()

if __name__ == '__main__':
    TestApp().run()

Button在一个RemovableButton类中进行了扩展并编写了一个on_touch_down()删除RemovableButton右键单击的方法。通过添加RemovableButtons,删除很容易。您可能希望展示一个Popup让用户有机会改变他/她对进行删除的想法的机会。


推荐阅读