python - 使用 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,而不是仅仅添加一个,这取决于我单击按钮的次数。
我也希望能够删除我添加的按钮。
解决方案
您可以使用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
让用户有机会改变他/她对进行删除的想法的机会。
推荐阅读
- python - 通过沿轴重复将张量添加到另一个
- vim - 为什么当我在 shell 中运行时,Neovim 不允许我运行 IPython 嵌入?
- r - 是否可以为使用 geom_linerange 绘制的不同长度的线(鸟线图)绘制图例
- python - 大型数据集上的 PCA
- list - 检查列表列表中某个索引中的常用字母
- eclipse - 无法创建 Eclipse WindowBuilder 类
- php - 从 WP 站点获取提要
- javascript - 串联继承和函数继承。里面的代码
- angular - 如何订阅一些 Observable 请求?
- python - 从 url 列表下载视频 (python3)