2016-04-13 5 views
0

Я ищу виджет kivy (желательно в файле python + kv) типа spinner (или что-то подобное), где я могу выбрать несколько элементов с помощью флажка, например. Выбранные элементы должны появиться в кортеже (?).kivy spinner widget с множественным выбором

На картинке start.png вы найдете исходную ситуацию.

enter image description here

В форме есть метка и поле TextInput. При щелчке на списке с доступными параметрами должно появиться всплывающее окно. Для этого я использую виджет Spinner. Смотрите фото select.png

enter image description here

Из этого списка я хочу, чтобы выбрать несколько элементов. В примере рядом с «Nederlands» я выбрал «Английский».

Когда это будет сделано, поле ввода текста должно отображать выбранные элементы в списке, разделенном запятыми. Смотрите фото result.png

enter image description here

Я попытался это с электронной ListView в режиме множественного выбора. Но ListView связан в области Textfield. Я попытался поместить ListView во всплывающее окно. Но это не работает ни по той или иной причине.

Любые предложения приветствуются. Спасибо заранее.

+0

Я не совсем понимаю, что вам нужно, но я не думаю, что такой виджет уже существует. Вместо этого должно быть легко объединить другие базовые виджеты, чтобы получить желаемый результат. – inclement

+0

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

+0

Пожалуйста, добавьте точную ошибку, которую вы видите, только, будучи конкретным, вы можете получить необходимую помощь. – user1544500

ответ

6

У 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) 

<[email protected]>: 
    size_hint: 1, None 
    height: '48dp' 

''' 

runTouchApp(Builder.load_string(kv)) 
+0

Привет, Рафало, это именно то, что я искал. Также очень приятно узнать, как объединить киви-виджеты (я новичок в Kivy). Большое спасибо за ваше время и общий опыт. –

Смежные вопросы