Я пытаюсь разработать приложение с использованием 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)
Это дает мне интерфейс, который СМОТРИТ, как я хочу (более или менее), но ответ (или его отсутствие) является проблемой.
Пример того, чтоинтерфейс выглядит так с кодом выше