Чекбоксы Kivy отвечают ОЧЕНЬ медленно - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь разработать приложение с использованием Kivy, где пользователь будет запускать аналитическую модель для динамических наборов данных (это означает, что существует несколько наборов данных, а не то, что сам набор данных будет изменяться).Каждый набор данных может иметь от 100 до 300 различных полей / атрибутов, из которых аналитики могут выбирать для запуска своего моделирования.

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

Однако способ, которым я в конечном итоге заставил его «работать», создал новую проблему ... а именно, чтофлажки все отвечают ОЧЕНЬ медленно.Часто требуется, чтобы я нажимал на них несколько раз, чтобы система вообще реагировала.Я пробовал очень маленькое подмножество данных (отображается только одно или два поля), и проблема сохраняется, что говорит мне (вероятно), что это не просто проблема с ресурсами.

Если я упросту систему так, чтобы одно поле, которое вставляется в макет без определенного форматирования, похоже, работает нормально.Являются ли мои макеты слишком сложными для системы?Есть ли невидимые отступы или что-то, что делает область кликабельности значительно меньшей, чем кажется визуально?

Вот соответствующий раздел .kv

<SelectFields>:
container: container

BoxLayout:
    size: root.size
    pos: root.pos
    orientation: "vertical"
    ScrollView:
        size_hint: 1, 1
        size: 500, 320
        pos_hint: {'left': 1, 'center_y': .5}
        GridLayout:
            id: container
            cols: 1
            padding: 20
            spacing: 20
            height: self.minimum_height
            size_hint: 1, None
            do_scroll_x: False
    BoxLayout:
        size_hint_y: None
        height: 30
        Button:
            text: "Cancel"
            on_release: root.cancel()

        Button:
            text: "Select"
            on_release: root.select()

Вот соответствующий .pyраздел:

class UploadModel(Screen):
    ''' Builder can select data (columns) and upload model file '''

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

    .
    .
    . <other functions are here>
    .
    .

    def select_fields(self):
        ''' Create a popup window with ScrollView where users can select which field(s)
            they want to include in their modeling. '''
        content = SelectFields(select=self.selected, cancel=self.dismiss_popup)
        self._popup = Popup(title="Select Fields", content=content,
                            size_hint=(1, 1))
        self.fieldsDict = {}                                # Dictionary to save checkbox state

        for index, field in enumerate(FIELDS):

            subLayout = BoxLayout(orientation="horizontal")
            field_name = Label(text = field)                # Field Name

            checkbox = CheckBox(active=True)
            checkbox.bind(active=self.checked)
            self.fieldsDict[checkbox] = [index, field, True]

            subLayout.add_widget(field_name)                # Add Label to 'row'
            subLayout.add_widget(checkbox)                  # Add Checkbox to 'row'

            content.container.add_widget(subLayout)         # Add 'row' to layout
            #if index > 1:
            #    break                  # Use to limit fields for testing

        self._popup.open()  

    def checked(self, checkbox, value):
        ''' Method called by checkboxes that will save the current state of each checkbox '''
        self.fieldsDict[checkbox][2] = value
        print(self.fieldsDict[checkbox][1], self.fieldsDict[checkbox][2])

    def selected(self):
        ''' Placeholder... Will eventually feed parser to get selected data subset '''
        for field, value in self.fieldsDict.items():
            if value[2] == True:
                print(value[1])

class SelectFields(BoxLayout):
    select = ObjectProperty(None)
    cancel = ObjectProperty(None) 

Это дает мне интерфейс, который СМОТРИТ, как я хочу (более или менее), но ответ (или его отсутствие) является проблемой.

Пример того, чтоинтерфейс выглядит так с кодом выше

...