具有多个选择的kivy微调器小部件

Bil*_*dge 2 python multiple-select spinner kivy

我正在寻找一个类型微调器(或类似的东西)的kivy小部件(最好在python + kv文件中),我可以通过复选框选择多个项目.所选项目应在元组(?)中可用.

在图片start.png中,您将找到起始情况.

在此输入图像描述

在表单中有一个标签和一个Textinput字段.单击时,应弹出包含可用选项的列表.为此我使用Spinner小部件.见图片select.png

在此输入图像描述

从这个列表中我想选择多个项目.在"Nederlands"旁边的示例中,我选择了"英语".

完成后,文本输入字段应以逗号分隔列表显示所选项目.见picture result.png

在此输入图像描述

我用e ListView使用多选模式尝试了这个.但是ListView绑定在Textfield区域中.我试图将ListView放在弹出窗口中.但是由于某种原因或其他原因,这不会有效.

任何建议都非常感谢.提前致谢.

小智 9

Kivy默认没有这样的小部件,但使用Button + DropDown + ToggleButton创建自定义小部件非常容易.

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.factory import Factory
from kivy.properties import ListProperty, ObjectProperty
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button

class MultiSelectSpinner(Button):
    """Widget allowing to select multiple text options."""

    dropdown = ObjectProperty(None)
    """(internal) DropDown used with MultiSelectSpinner."""

    values = ListProperty([])
    """Values to choose from."""

    selected_values = ListProperty([])
    """List of values selected by the user."""

    def __init__(self, **kwargs):
        self.bind(dropdown=self.update_dropdown)
        self.bind(values=self.update_dropdown)
        super(MultiSelectSpinner, self).__init__(**kwargs)
        self.bind(on_release=self.toggle_dropdown)

    def toggle_dropdown(self, *args):
        if self.dropdown.parent:
            self.dropdown.dismiss()
        else:
            self.dropdown.open(self)

    def update_dropdown(self, *args):
        if not self.dropdown:
            self.dropdown = DropDown()
        values = self.values
        if values:
            if self.dropdown.children:
                self.dropdown.clear_widgets()
            for value in values:
                b = Factory.MultiSelectOption(text=value)
                b.bind(state=self.select_value)
                self.dropdown.add_widget(b)

    def select_value(self, instance, value):
        if value == 'down':
            if instance.text not in self.selected_values:
                self.selected_values.append(instance.text)
        else:
            if instance.text in self.selected_values:
                self.selected_values.remove(instance.text)

    def on_selected_values(self, instance, value):
        if value:
            self.text = ', '.join(value)
        else:
            self.text = ''


kv = '''
BoxLayout:
    orientation: 'vertical'

    BoxLayout:

        Label:
            text: 'Select city'

        MultiSelectSpinner:
            id: city
            values: 'Sydney', 'Moscow', 'Warsaw', 'New York', 'Tokio'

    BoxLayout:

        Label:
            text: 'Select your favorite food'

        MultiSelectSpinner:
            id: food
            values: 'Fish and chips', 'Hot-dog', 'Hamburger'

    Label:
        text: 'You selected {} cities and {} as your favourite food.'.format(city.text, food.text)

<MultiSelectOption@ToggleButton>:
    size_hint: 1, None
    height: '48dp'

'''

runTouchApp(Builder.load_string(kv))
Run Code Online (Sandbox Code Playgroud)