如何使用 remove_widget() 函数?

how do I use the remove_widget() function?

我有这个代码。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty


class Temp(BoxLayout):
    def __init__(self, iid):
        BoxLayout.__init__(self)
        self.id = str(iid)

    def remove_content(self, iid):
        #How me need use remove_widget() function?
        #self.ids['tmp'].remove_widget(?)

class ScreenApp(BoxLayout):
    def __init__(self):
        BoxLayout.__init__(self)
        self.idsum = 0
        self.idsum+=1
        self.ids['contents'].add_widget(Temp(iid = self.idsum))
        self.idsum+=1
        self.ids['contents'].add_widget(Temp(iid = self.idsum))

    def add_content(self):
        self.idsum+=1
        self.ids['contents'].add_widget(Temp(iid = self.idsum))

class MainApp(App):
    def build(self):
        return ScreenApp()

if __name__ == "__main__":
    MainApp().run()

还有这个

<Temp@BoxLayout>
    id: tmp
    Button:
        id: idti
        text: "-"
        on_press: root.remove_content(id)
    Label:
        id: idlbl
        text: "Temp"

<ScreenApp>:
    BoxLayout:
        orientation: "vertical"

        BoxLayout:
            id: contents
            orientation: "vertical"

        Button:
            text: "+"
            on_press: root.add_content()

我想通过单击按钮删除小部件,并且最底部的小部件上升到远程小部件 TM 的位置而不留空 space。先感谢您。 再说几句删除弹出窗口。

使用self.ids.contents.remove_widget(instance)删除对象实例。具体请参考解释和示例。

kv 文件

  1. 将动态 class、<Temp@BoxLayout> 替换为 class 规则、<Temp>:
  2. 删除 id: tmp 因为不需要
  3. root.remove_content(id) 替换为 app.root.remove_content(root),因为我们正在将方法移至 class ScreenApp(),因为那里已经有 add_content() 方法。
  4. 我们没有传递 id 作为参数,而是传递 root 即要删除的 Temp 对象的实例。
  5. text: 'Temp' 替换为 root.text 以进行可视化。
  6. 删除了 class 规则下的第一个 BoxLayout:<ScreenApp>: 因为它已经是一个 BoxLayout,不需要另一个 BoxLayout i.e.nested BoxLayouts。

Python代码

  1. 添加 text 作为 class Temp().
  2. 的构造方法的参数
  3. 已添加 self.text = text 作业
  4. 实例化 Temp 对象时添加 text='Temp' + str(self.idsum)

例子

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class Temp(BoxLayout):
    def __init__(self, iid, text, **kwargs):
        super(Temp, self).__init__(**kwargs)
        self.id = str(iid)
        self.text = text


class ScreenApp(BoxLayout):
    def __init__(self):
        BoxLayout.__init__(self)
        self.idsum = 0
        self.idsum += 1
        self.ids['contents'].add_widget(Temp(iid=self.idsum, text='Temp' + str(self.idsum)))
        self.idsum += 1
        self.ids['contents'].add_widget(Temp(iid=self.idsum, text='Temp' + str(self.idsum)))

    def add_content(self):
        self.idsum+=1
        self.ids['contents'].add_widget(Temp(iid=self.idsum, text='Temp' + str(self.idsum)))

    def remove_content(self, instance):
        self.ids.contents.remove_widget(instance)


class MainApp(App):
    def build(self):
        return ScreenApp()


if __name__ == "__main__":
    MainApp().run()

main.kv

#:kivy 1.11.0

<Temp>:
    text: 'Temp'
    Button:
        id: idti
        text: "-"
        on_press: app.root.remove_content(root)
    Label:
        id: idlbl
        text: root.text

<ScreenApp>:
    orientation: "vertical"

    BoxLayout:
        id: contents
        orientation: "vertical"

    Button:
        text: "+"
        on_press: root.add_content()

输出