Kivy复选框响应非常缓慢

时间:2019-03-05 18:37:00

标签: python checkbox kivy kivy-language

我正在尝试使用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) 

这为我提供了一个界面,可以(或多或少)查找我想要的方式,但是响应(或缺少响应)是一个问题。

上面的代码显示的界面示例

0 个答案:

没有答案