我正在尝试使用Kivy开发一个应用程序,其中用户将在动态数据集上运行分析模型(这意味着有多个数据集,而不是数据集本身会发生变化)。每个数据集可以具有100-300个不同的字段/属性,分析人员可以选择这些字段/属性来进行模拟。
我想出了如何动态生成一系列复选框,分析师可以在其中选择他/她想要使用的字段。我必须动态地执行此操作,因为它会根据选择运行数据的数据集而改变。
但是,我最终使它“工作”的方式产生了一个新问题……即,所有复选框响应都非常缓慢。通常需要我多次单击它们,以使系统完全响应。我尝试了很小的数据子集(仅显示一个或两个字段),问题仍然存在,这告诉我(可能)不是仅仅是资源问题。
如果我简化系统,以便将单个字段插入到Layout中而没有特定格式,那么它似乎可以正常工作。我的布局是否太复杂,系统无法处理?是否存在看不见的填充物或某种方式使“可点击”区域明显小于视觉上可见的区域?
这是相关的.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)
这为我提供了一个界面,可以(或多或少)查找我想要的方式,但是响应(或缺少响应)是一个问题。
上面的代码显示的界面示例