2016-04-13 19 views
0

Ich bin auf der Suche nach einem Kivy-Widget (vorzugsweise in Python + kv-Datei) vom Typ Spinner (oder etwas ähnliches), wo ich mehrere Elemente über ein Kontrollkästchen zum Beispiel auswählen können. Die ausgewählten Objekte sollten in einem Tupel (?) Verfügbar sein.kivy Spinner Widget mit Mehrfachauswahl

Im Bild start.png finden Sie die Ausgangssituation.

enter image description here

In einer Form befindet sich ein Etikett und ein Texteingabe-Feld. Beim Klicken sollte eine Liste mit verfügbaren Optionen angezeigt werden. Dazu benutze ich ein Spinner-Widget. Siehe Bild select.png

enter image description here

Aus dieser Liste ich mehrere Artikel auswählen möchten. Im Beispiel neben 'Nederlands' habe ich 'Englisch' ausgewählt.

Wenn Sie fertig sind, sollte das Eingabefeld Text die ausgewählten Elemente in einer kommagetrennten Liste anzeigen. Siehe Bild result.png

enter image description here

habe ich versucht, diese mit e Listview den Mehrfachauswahl-Modus. Das ListView ist jedoch im Textfeldbereich gebunden. Ich habe versucht, die ListView in ein Popup-Fenster zu bringen. Aber das funktioniert nicht aus irgendeinem Grund ....

Alle Vorschläge werden sehr geschätzt. Vielen Dank im Voraus.

+0

Ich bin nicht ganz klar, was Sie wollen, aber ich glaube nicht, dass ein solches Widget bereits existiert. Stattdessen sollte es einfach sein, andere Basis-Widgets zu kombinieren, um das gewünschte Ergebnis zu erzielen. – inclement

+0

kann ich verstehen. Meine didaktischen Fähigkeiten sind nicht sehr gut entwickelt. Also habe ich die Frage bearbeitet und ein paar Bilder hinzugefügt. Hoffe, das macht es klarer. –

+0

Bitte fügen Sie den genauen Fehler hinzu, den Sie sehen, nur indem Sie spezifisch sind, können Sie die benötigte Hilfe erhalten. – user1544500

Antwort

6

Kivy hat kein solches Widget standardmäßig, aber es ist ziemlich einfach, das benutzerdefinierte mit Button + DropDown + ToggleButton zu erstellen.

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

Hallo Rafalo, genau das habe ich gesucht. Auch sehr schön zu lernen, wie man kivy Widgets kombiniert (bin ein Anfänger in Kivy). Vielen Dank für Ihre Zeit und gemeinsame Erfahrungen. –