Python:如何在 kivy 中删除小部件

mac*_*lor 2 python python-2.7 kivy

我有两个文件demo.pydemo.kv.
当我demo.py点击菜单后运行然后显示+Add more按钮。当我点击+Add more按钮然后three row添加动态,因为我在loop那里使用。每次添加three row动态
但是谁能告诉我什么时候添加new row然后如何删除previous three row
每次都应该只显示3 new row,前一行应该是delete。我正在使用代码

def add_more(self):
    self.remove_widget(Row())
    for x in range(0, 3):
        self.row_count += 1
        self.add_widget(Row(button_text=str(self.row_count)))
Run Code Online (Sandbox Code Playgroud)

演示文件

from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty, ListProperty, StringProperty, ObjectProperty, NumericProperty
from kivy.uix.popup import Popup

Window.clearcolor = (0.5, 0.5, 0.5, 1)
Window.size = (500, 400)

class User(Popup):
    total_value = ObjectProperty(None)

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

    def add_more(self):
        self.ids.rows.add_more()


class Row(BoxLayout):
    col_data = ListProperty(["?", "?", "?", "?", "?"])
    name = ObjectProperty(None)
    button_text = StringProperty("")
    col_data3 = StringProperty("")
    col_data4 = StringProperty("")

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


class Rows(BoxLayout):
    row_count = 0

    def __init__(self, **kwargs):
        super(Rows, self).__init__(**kwargs)
        self.add_more()

    def add_more(self):
        self.remove_widget(Row())
        for x in range(0, 3):
            self.row_count += 1
            self.add_widget(Row(button_text=str(self.row_count)))


class rv(BoxLayout):
    data_items = ListProperty([])
    mode = StringProperty("")

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


    def add(self):
        self.mode = "Add"
        popup = User()
        popup.open()


class MainMenu(BoxLayout):
    content_area = ObjectProperty()

    def display(self):
        self.rv = rv()
        self.content_area.add_widget(self.rv)

class demo(App):

    def build(self):
        return MainMenu()


if __name__ == '__main__':
    demo().run()
Run Code Online (Sandbox Code Playgroud)

演示.kv

<Row>:
    size_hint_y: None
    height: self.minimum_height
    height: 40

    Button:
        text: root.button_text
        size_hint_x: None
        top: 200

    TextInput:
        id : name
        text: root.col_data3
        width: 300
    TextInput:
        id: number_input
        text: root.col_data4
        width: 300
        input_filter: 'int'


<Rows>:
    size_hint_y: None
    height: self.minimum_height
    orientation: "vertical"

<User>:
    id: user
    BoxLayout:
        orientation: "vertical"
        padding : 20, 5


        BoxLayout:
            orientation: "horizontal"
            #padding : 10, 10
            spacing: 10, 10
            size: 450, 40
            size_hint: None, None

            Label:
                size_hint_x: .2
                text: "Number"
                text_size: self.size
                valign: 'bottom'
                halign: 'center'

            Label:
                size_hint_x: .4
                text: "name"
                text_size: self.size
                valign: 'bottom'
                halign: 'center'

            Label:
                size_hint_x: .4
                text: "Value"
                text_size: self.size
                valign: 'bottom'
                halign: 'center'

        ScrollView:
            Rows:
                id: rows


        BoxLayout:
            orientation: "horizontal"
            size_hint_x: .2
            size_hint_y: .2

            Button:
                text: "+Add More"
                on_press: root.add_more()

<rv>:
    BoxLayout:
        orientation: "vertical"

        Button:
            size_hint: .25, .03
            text: "+Add"
            on_press: root.add()

        GridLayout:
            size_hint: 1, None
            size_hint_y: None
            height: 25
            cols: 3

        BoxLayout:
            orientation: "vertical"


<MenuButton@Button>:
    text_size: self.size
    valign: "middle"
    padding_x: 5
    size : (100, 40)
    size_hint : (None, None)
    background_color: 90 , 90, 90, 90
    background_normal: ''
    color: 0, 0.517, 0.705, 1
    border: (0, 10, 0, 0)

<MainMenu>:
    content_area: content_area

    BoxLayout:
        orientation: 'vertical'
        spacing : 10

        BoxLayout:
            canvas.before:
                Rectangle:
                    pos: self.pos
                    size: self.size

            size_hint_y: 2

            MenuButton:
                text: 'Menu'
                size : (50, 12)
                on_release: root.display()

        BoxLayout:
            id: content_area
            size_hint_y: 30
Run Code Online (Sandbox Code Playgroud)

FJS*_*lla 6

remove_widget必须接收要删除的子部件的实例作为参数。由于您可以使用其children属性获取小部件的子项,因此要删除前三行,您可以执行以下操作:

    def add_more(self):
        if self.children:
            for child in self.children[:3]:
                self.remove_widget(child)

        for x in range(0, 3):
            self.row_count += 1
            self.add_widget(Row(button_text=str(self.row_count)))
Run Code Online (Sandbox Code Playgroud)

但是,使用clear_widgets方法更简单:

def add_more(self):
    self.clear_widgets(self.children[:3])
    for x in range(0, 3):
        self.row_count += 1
        self.add_widget(Row(button_text=str(self.row_count)))
Run Code Online (Sandbox Code Playgroud)

由于您实际上删除了 中的所有行BoxLayout,您可以执行以下操作:

    def add_more(self):
        self.clear_widgets()
        for x in range(0, 3):
            self.row_count += 1
            self.add_widget(Row(button_text=str(self.row_count)))
Run Code Online (Sandbox Code Playgroud)

编辑:

要重置索引,只需忽略self.row_count并使用范围返回的值:

    def add_more(self):
        self.clear_widgets()
        for x in range(1, 4):
            self.add_widget(Row(button_text=str(x)))
Run Code Online (Sandbox Code Playgroud)