如何使用 Kivy 从 class 外部添加小部件

How to add Widgets from outside class with Kivy

喂!我这里有这个应用程序,一种“待办事项列表”。当我按下“添加项目”按钮时,它会打开一个 PopUp Window,我想在按下“向上”按钮时在“ItemsList”中添加“ItemTemplate”。我是 Kivy 的新手,最近几天我尝试这样做。我该怎么做?
非常感谢!

Python代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.popup import Popup

class FirstBox(BoxLayout):
    def btn(self):
        Pu().open()

class ItemsList(GridLayout):
    pass

class ItemTemplate(BoxLayout):
    pass

class Pu(Popup):
    pass

class MyAppApp(App):
    pass

MyAppApp().run()

Kv代码:

FirstBox:
<FirstBox>:
    orientation: "vertical"
    BoxLayout:
        ScrollView:
            ItemsList:
                size_hint: 1, None
                height: self.minimum_height

    Button:
        size_hint: 1,0.2
        text: "Add Item"
        on_release: root.btn()
<ItemsList>:
    cols: 1
    size_hint_y: None
    ItemTemplate:
    ItemTemplate:
    ItemTemplate:
<ItemTemplate>:
    size_hint: 1, None
    CheckBox:
        size_hint: 0.15, 1
    Button:
        text: "Task Name"
    Button:
        text: "Some action"
        size_hint: 0.15,1
<Pu>:
    size_hint: 1, 0.3
    BoxLayout:
        orientation: "vertical"
        TextInput:
        Button:
            text: "Up"

为您的 ItemList 提供 ID 以添加小部件,为 TextInput 提供从中获取文本的 ID。

ItemsList:
    id: viewlist

TextInput:
    id: new_task_input_id

使用 StringProperty 动态更改 ItemTemplate 的文本:

from kivy.properties import StringProperty
class ItemTemplate(BoxLayout):
    task_text = StringProperty()

编辑 .kv 侧动态:( ItemTemplate 的按钮 )

Button:
    text: root.task_text

触发器 向上按钮 在 .kv 侧:on_release: root.add_item() 在 Pu class 中创建此函数并添加此操作:

def add_item(self,*args):
    firstbox = App.get_running_app().root #access correctly main layout
    itemlist = firstbox.ids.viewlist #find viewlist by id
    new_task_text = self.ids.new_task_input_id.text  #get textinput text
    item = ItemTemplate()  #create custom item
    item.task_text = new_task_text  #set item text
    itemlist.add_widget(item) #add item to layout
    

短函数:

App.get_running_app().root.ids.viewlist.add_widget(ItemTemplate(task_text=self.ids.new_task_input_id.text))

让我们在添加新项目后关闭弹出窗口:

self.dismiss()

此外,如果您想将此小部件添加到顶部,需要在 add_widget 中提供索引:

itemlist.add_widget(item,len(itemlist.children))