Как удалить конкретную строку из сетки? Строки добавляются из всплывающего окна - PullRequest
0 голосов
/ 06 июня 2019

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

Вот коды, которые я пробовал. Я играл с этим некоторое время. Я пробовал это разными способами, и именно здесь я остановился.

Py.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty, BooleanProperty, ObjectProperty
from kivy.uix.textinput import TextInput


class Row(BoxLayout):
    x1 = StringProperty('')
    x2 = StringProperty('')
    x3 = BooleanProperty(False)
    x4 = ObjectProperty()

    def __init__(self, x1, x2, x3, x4, **kwargs):
        super(Row, self).__init__(**kwargs)
        self.x1 = x1
        self.x2 = x2
        self.x3 = x3
        self.x4 = x4

    def remove_row(self):
        self.remove_widget(Row)

class MyPopup(Popup):
    pass


class MainScreen(Screen):
    pass

class SecondScreen(Screen):
    def fire_popup(self):
        pops = MyPopup()
        pops.open()


class ScreenManagement(ScreenManager):
    def changescreen(self, value):

        try:
            if value !='main':
                self.current = value
        except:
            print('No Screen named'+ value)




class testiApp(App):
    def build(self):
        self.title = 'Hello'

    def add_more(self, x1, x2, x3, x4):
        addbutton = self.root.get_screen('Page2').ids.empty
        addbutton.add_widget(Row(x1, x2, x3, x4))

    def remove(self):
        container = self.root.get_screen('Page2').ids.empty
        if len(container.children) > 0:
            container.remove_widget(container.children[0])

testiApp().run()

KV.


<MyPopup>:
    id:pop
    size_hint: .4, .4
    auto_dismiss: False
    title: 'XXX!!'
    BoxLayout:
        orientation:'vertical'
        BoxLayout:
            orientation:'horizontal'
            Label:
                text:'X1'
            TextInput:
                id: X1

            Label:
                text:'X2'
            TextInput:
                id:X2

            CheckBox:
                id:X3
            Button:
                id:X4
                text:'Delete'

        BoxLayout:
            orientation:'horizontal'
            Button:
                text:'Lisää'
                on_release: app.add_more(X1.text, X2.text, X3.active, X4)
            Button:
                text: 'Close'
                on_press: pop.dismiss()

<Row>:
    x1:''
    x2:''
    x3:False
    x4:

    Label:
        text: root.x1
    Label:
        text: root.x2
    CheckBox:
        active: root.x3
    Button:
        text:'poista'
        on_release: root.remove_row()


ScreenManagement:
    MainScreen:
        name:'Main'
    SecondScreen:
        name:'Page2'



<MainScreen>:
    name:'Main'
    BoxLayout:
        orientation:'vertical'
        GridLayout:
            id:container
            cols:2
            Label:
                text:'testfield1'
            TextInput:
                id: textfield1
            Label:
                text:'testfield2'
            TextInput:
                id: textfield2

        Button:
            text:'Next Page'
            on_release: app.root.current ='Page2'




<SecondScreen>:
    name:'Page2'


    BoxLayout:
        orientation:'vertical'
        BoxLayout:
            orientation:'vertical'
            Label:
                text:'Popup Test'
            ScrollView:
                bar_width: 5
                bar_color: 1,0,0,1 #red
                bar_inactive_color: 0,0,1,1 #blue
                effect_cls: 'ScrollEffect'
                scroll_type:['bars','content']
                GridLayout:
                    orientation: "vertical"
                    size_hint_y: None
                    height: self.minimum_height
                    row_default_height: 60
                    cols:1
                    id:empty
            BoxLayout:
                Button:
                    text:'Open Popup'
                    on_press: root.fire_popup()

                Button:
                    text:'remove'
                    on_release: app.remove()



1 Ответ

1 голос
/ 06 июня 2019

Вопрос 2 - всплывающее сообщение для подтверждения удаления

... хотите, чтобы кнопка Poista (Delete) открыла всплывающее окно с вопросом "вы конечно? Да или Нет "Как мне связать remove_row?

Решение

файл кв

  • Создать правило класса, <ConfirmDeleteRow>: с наследованием Всплывающее окно Виджет
  • Содержимое виджета Popup представляет собой виджет Label с текстом «Вы уверены?» И два виджета Button с текстом «Да» и «Нет» соответственно.
  • Использование события on_release для привязки кнопки «Да» для вызова метода remove_row()
  • Использование события on_release для связывания обеих кнопок для закрытия всплывающего окна путем вызова метода dismiss()
  • Привязать кнопку delete, чтобы вызвать новый метод, confirm_delete()

Фрагменты - файл kv

<ConfirmDeleteRow>:    # class rule
    size_hint: .4, .4
    auto_dismiss: False
    title: 'Delete'

    BoxLayout:    # content
        orientation:'vertical'
        Label:
            text: 'Are you sure?'
        BoxLayout:
            size_hint: 1, 0.2
            Button:
                text: 'Yes'
                on_release:
                    root.dismiss()
                    root.row.remove_row()
            Button:
                text: 'No'
                on_release:
                    root.dismiss()
...


<Row>:
    x1:''
    ...
    Button:
        text:'poista'
        on_release: root.confirm_delete()

Py file

  • Реализация class ConfirmDeleteRow() с новым атрибутом класса row = ObjectProperty(None) и конструктором, принимающим дополнительный параметр, row
  • Реализация нового метода confirm_delete() для создания экземпляра ConfirmDeleteRow() и передачи self (т.е. строки) в качестве аргумента

Snippets - py file

class ConfirmDeleteRow(Popup):
    row = ObjectProperty(None)

    def __init__(self, row, **kwargs):
        super(ConfirmDeleteRow, self).__init__(**kwargs)
        self.row = row    # save row object


class Row(BoxLayout):
    ...

    def confirm_delete(self):
        confirm_delete_row = ConfirmDeleteRow(self)   # pass self / row object
        confirm_delete_row.open()

Вопрос 1 - удалить конкретную строку

... хотел бы удалить конкретную строку из сетки с удалением Кнопка

Решение

Когда кнопка «poista» (удаление) нажата, метод self в remove_row() ссылается на экземплярный объект Row для этой конкретной строки в ScrollView. Поэтому, чтобы удалить эту конкретную строку, вы должны обратиться к ее родителю, чтобы удалить ее / потомка из родителя.

Заменить self.remove_widget(Row) на self.parent.remove_widget(self)

Отрывки

def remove_row(self):
    self.parent.remove_widget(self)

выход

Before removing second row After second row removed

...