Kivy - вставка ряда виджетов между другими строками - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть приложение, которое напоминает электронную таблицу Excel со строками виджетов, последнюю строку можно удалить с помощью кнопки «-» или добавить поверх «+».

Я хотел бы увеличитьего функциональность благодаря возможности вставлять / удалять строки из любого места в списке, как и в электронной таблице Excel.

Как мне это сделать - нужно ли начинать давать каждой строке идентификатор и, возможно,меняется с Scrollview на Gridlayout?Или они могут быть добавлены динамически с каждой строкой отдельной кнопкой +/-, зная, как взаимодействовать с соседними строками.

TEST.PY

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.properties import ObjectProperty, StringProperty, ListProperty
from kivy.uix.button import Button
from kivy.clock import Clock

from sql_update_data import update_db

kivy.require('1.10.1')


class GUILayout(BoxLayout, GridLayout):
    rows = ObjectProperty(None)
    grid = ObjectProperty(None)
    row_count = 0

    def __init__(self, **kwargs):
        super(GUILayout, self).__init__(**kwargs)
        Clock.schedule_once(self.add_grid)

    def add_grid(self, *args):

        for i in range(20):
            self.row_count += 1
            self.grid.add_widget(Button(text=str(self.row_count), size_hint_y=None,
                                    height=80))

    def subtract_row(self):
        self.rows.remove_row()

    def plus_row(self):
        self.rows.add_row()

    def update_sql(self):
        values = [row.values for row in reversed(self.rows.content.children)]

        for category, id, strap in values:
            update_db(category, id, strap)

    def inject_row(self):
        self.rows.insert_row()


class Row(BoxLayout):
    button_text = StringProperty("")
    id = ObjectProperty(None)
    values = ListProperty()


class Rows(ScrollView):
    row_count = 0
    content = ObjectProperty(None)
    # do_scroll_y = False

    def __init__(self, **kwargs):
        super(Rows, self).__init__(**kwargs)
        for clock in range(6):
            Clock.schedule_once(self.add_row)

        for clock in range(1):
            Clock.schedule_once(self.add_row_contact)

    def add_row(self, *args):
        self.row_count += 1
        self.content.add_widget(Row(id=str(self.row_count)))

    def add_row_contact(self, *args):
        self.row_count += 1
        self.content.add_widget(Row(id=str(self.row_count)))

    def remove_row(self):
        self.row_count -= 1
        self.content.remove_widget(self.content.children[0])

    def insert_row(self):
        self.row_count += 1
        print("working")
        #self.content.add_widget(self.content.children[0])


class TestApp(App):

    def build(self):
        return GUILayout()


GUIApp = TestApp()
GUIApp.run()

TEST.KV

#: import main test
<Row>:
    values: col1.text, col2.text
    orientation: "horizontal"
    spacing: 0, 5
    size_hint_y: None
    height: "40dp"
    spacing: 2
    pos_hint: {'center_x': .50, 'y': .80}

    BoxLayout:
        orientation: 'vertical'
        size_hint_x: .05

        Button:
            text: "-"
            font_size: 40

        Button:
            text: "+"

    Spinner:
        id: col1
        text: 'Select Category'
        values: ['One', 'Two', 'Three']
        size_hint_x: .3
    TextInput:
        id: col2
        size_hint_x: .8

<Rows>:
    content: content
    do_scroll_y: False

    BoxLayout:
        id: content
        orientation: "vertical"
        size_hint_y: None
        height: self.minimum_height


GUILayout:


<GUILayout>:
    rows: rows
    orientation: "vertical"
    grid: Grid
    padding: 10
    spacing: 10

    BoxLayout:
        orientation: "horizontal"
        height: 60

        BoxLayout:
            orientation: "horizontal"
            size_hint_x: .25

            TabbedPanel:
                do_default_tab: False


                # ----------- TAB 1 ------------

                TabbedPanelItem:
                    text: "tab1"


                    BoxLayout:
                        orientation: 'vertical'

                        BoxLayout:
                            orientation: 'horizontal'

                            ScrollView:
                                size_hint_x: .05

                                GridLayout:
                                    id: Grid
                                    cols: 1
                                    rows: 20


                            BoxLayout:
                                orientation: 'vertical'

                                Rows:
                                    id: rows

                        GridLayout:
                            rows: 1
                            cols: 6
                            padding: 1
                            spacing: 5
                            size_hint_y: None
                            height: 50


                            Button:
                                text: " - "
                                font_size: 70
                                size_hint_x: .1
                                on_press: root.subtract_row()

                            Button:
                                text: " + "
                                font_size: 50
                                size_hint_x: .1
                                on_press: root.plus_row()

                            Button:
                                text: "Update Maestro"
                                size_hint_x: .4
                                on_press: root.update_sql()


                            Button:
                                text: "Settings"
                                font_size: 30
                                size_hint_x: .2
                                on_press: root.inject_row()
...