как мне использовать функцию remove_widget ()? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть этот код.

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()

Я хочу удалить виджеты одним нажатием кнопки, и чтобы нижние виджеты поднялись до места удаленного виджета ТМ чаще всего, не оставляя пустого места. Заранее спасибо. еще несколько слов, чтобы удалить всплывающее окно.

1 Ответ

0 голосов
/ 27 августа 2018

Используйте self.ids.contents.remove_widget(instance), чтобы удалить экземпляр объекта.Пожалуйста, обратитесь к объяснениям и примеру для получения подробной информации.

файл kv

  1. Заменить динамический класс, <Temp@BoxLayout> на правило класса, <Temp>:
  2. Удалить id: tmp потому что это не нужно
  3. Замените root.remove_content(id) на app.root.remove_content(root), потому что мы перемещаем метод в класс ScreenApp (), поскольку у нас уже есть метод add_content().
  4. Вместо передачиid в качестве аргумента мы передаем root, т. Е. Экземпляр Temp объекта, подлежащего удалению.
  5. Замените text: 'Temp' на root.text для визуализации.
  6. Удалено первоеBoxLayout: в соответствии с правилом класса, <ScreenApp>:, потому что это уже BoxLayout и на самом деле не нужен еще один BoxLayout, встроенный в BoxLayouts.

Код Python

  1. Добавлено text в качестве аргумента метода конструктора класса Temp().
  2. Добавлено self.text = text для назначения
  3. Добавлено text='Temp' + str(self.idsum) при создании экземпляра Temp object

Пример

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()

Выход

Img01 - 6 Temp object added Img02 - Removed Temp3

...