IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Kivy] selection multiple sur un ListAdapter


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut [Kivy] selection multiple sur un ListAdapter
    salut à tous, j'utilise un ListAdapter dans mon script python, avec selection_mode='multipe', jusque là tout va bien et j'arrive à selectionner plusieurs items. mais ma difficulté reside maintenant dans le traitement après selection. habituellement, avec un selection_mode='single', j'arrivait à récupérer l'index de l'élément qui a été selectionné, pour ensuite faire tout ce que je veux par la suite, mais avec la selection multiple tout se complique puisqu'il faut maintenant gérer tous les index des items selectionnés. voici la fonction que j'utilisait pour traiter un ListAdapter selection_mode='single':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def item_changed(self, adapter, *args):
     
            if len(adapter.selection) == 0:
                return
            objectSelected = adapter.data[adapter.selection[0].parent.index]
            adapter.selection[0].deselect()	
            nextScreen = self.manager.go_next()
    j'aimerais pouvoir l'adapter à mon ListAdapter multi-selection. Merci d'avance pour toute aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,

    Un "ListAdapter" n'étant pas un objet de base, il va peut être falloir prendre le temps de préciser la bibliothèque utilisée, le contexte, fournir un code plus complet...
    A défaut, pas grand monde pourra vous répondre (et inutile de poster dans ce cas là).

    - W

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Un "ListAdapter" n'étant pas un objet de base, il va peut être falloir prendre le temps de préciser la bibliothèque utilisée, le contexte, fournir un code plus complet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    from kivy.lang import Builder
    from kivy.adapters.listadapter import ListAdapter
     
    Builder.load_string("""
    [CustomListItemEncasement@SelectableView+BoxLayout]:
            orientation: 'horizontal'
            spacing: '10sp'
            padding: (sp(2), 0)
            size_hint_y: None
            height: '100sp'
            index: ctx.index
            canvas.after:
                    Color:
                            rgb: 0.5,0.5,0.5
                    Line:
                            rectangle: self.x,self.y+self.height,self.width,0
     
     
            # icon of item
            ListItemButton:
                    id: mainListItemButton
                    size_hint_x: None
                    width: '110sp'
                    selected_color: 1,1,1, 1
                    deselected_color: 1,1,1, 1
                    background_color: 1,1,1, 1
                    background_normal: "images/fac-icon.png"
                    background_down: "images/"+ctx.text+".png"
                    border: (0,0,0,0)
     
            ListItemButton:
                    selected_color: 0.9,0.9,0.8, 1
                    deselected_color: 1,1,1, 0
                    background_color: 1,1,1, 0
                    background_normal: ""
                    background_down: ""
     
                    halign: 'left'
                    text_size: (self.width , None)
                    color: [1,1,1, 1]
                    text: ctx.text
                    markup: True
                    font_size: '18sp'
                    font_color: 1, 0.5,1,0.5
                    font_name: "fonts/Ubuntu-M.ttf"
     
     
    """)
     
    def update_display(self):
            self._encasements = WebserviceToDataBase().getAllEncasementsForClient(self._Idclient)
            if self._encasements is None:
                return
     
            try:  #récupération des infos relatives à l'ID  "_Idclient"
                con = sqlite3.connect(WebserviceToDataBase().database)
                cur = con.cursor()
                cur.execute("SELECT * FROM tbl_client where idcli='%s'"%self._Idclient)
                row = cur.fetchone()
                self.lib=str(row[1])
            except sqlite3.Error, e:
                print "Error with database: %s" % e
            finally:
                if con:
                    con.close()
            self.title_button.text = self.lib
     
            list_item_args_converter = \
                lambda row_index, obj: {'text': 'Code :  '+self._encasements[obj]["idfac"]+'\n'+'Montant :  '+str(self._encasements[obj]["montant"])+'\n'+'Date echeance :  '+str(self._encasements[obj]["echeance"]),
    									'index': row_index,
    									'is_selected': False
    									}
     
            my_adapter = ListAdapter(data = self._encasements,
    									args_converter=list_item_args_converter,
    									selection_mode='multiple',
    									allow_empty_selection=True,
    									template='CustomListItemEncasement')
     
     
            self.containerListView.adapter = my_adapter
     
       def items_selected(self, adapter, *args):
            liste_index=[]
            if len(adapter.selection) == 0:
                return
            for item in adapter.selection:
                 liste_index.append(adapter.data[item.index])
    la methode 'items_selected' gère le traitement de ma ListAdapter. la liste 'liste_index' est censé contenir les index des differents items selectionnés, ce que j'arrive pas à faire. ma variable 'objectSelected' ne peut recupérer que l'index du premier item selectionné. j'espère me faire mieux comprendre. merci pour votre attention

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Un "ListAdapter" n'étant pas un objet de base, il va peut être falloir prendre le temps de préciser la bibliothèque utilisée, le contexte, fournir un code plus complet...
    désolé si je ne me fais pas mieux comprendre, mais j'aimerais pouvoir recupérer les index de chaque item selectionné. merci de votre aide

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,

    Citation Envoyé par roadbecri Voir le message
    désolé si je ne me fais pas mieux comprendre, mais j'aimerais pouvoir recupérer les index de chaque item selectionné. merci de votre aide
    Pour qu'on puisse "discuter" de ce que fait votre code, on peut essayer de le lire mais c'est bien plus "simple" de pouvoir le faire tourner.
    Ce que j'en ai compris c'est "comment récupérer les index des items sélectionnes" dans une ListView.
    Si on essaie de faire un code "minimaliste", çà pourrait donner çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    from kivy.uix.listview import ListView, ListItemButton
    from kivy.uix.boxlayout import BoxLayout
    from kivy.adapters.listadapter import ListAdapter
     
    class MainView(BoxLayout):
     
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.orientation = 'vertical'
     
            self.list_adapter = ListAdapter(
                data=["Item #{0}".format(i) for i in range(10)],
                cls=ListItemButton,
                sorted_keys=[],
                selection_mode='multiple',
                )
            self.list_adapter.bind(on_selection_change=self.selection_change)
     
            list_view = ListView(adapter=self.list_adapter)
            self.add_widget(list_view)
     
     
        def selection_change(self, adapter, *args):
            print ('-- selection change')
            for e in adapter.selection:
                x = e.index
                print (x, adapter.data[x])
     
    if __name__ == '__main__':
        from kivy.base import runTouchApp
        runTouchApp(MainView(width=800))
    Lorsque la sélection change, on récupère bien l'ensemble des items sélectionnes.

    Citation Envoyé par roadbecri
    ma variable 'objectSelected' ne peut recupérer que l'index du premier item selectionné. j'espère me faire mieux comprendre. merci pour votre attention
    Désolé mais je ne vois pas trace de cette variable dans votre code.

    - W

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    class MainView(BoxLayout):

    def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.orientation = 'vertical'

    - W
    Salut et grand merci pour votre exemple, il me semble plus comprehensible, sauf que j'ai du ajouter un element pour qu'il puisse tourner plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     def __init__(self, **kwargs):
            super(MainView,self).__init__(**kwargs)
            self.orientation = 'vertical'
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.orientation = 'vertical'
    Citation Envoyé par wiztricks Voir le message
    Lorsque la sélection change, on récupère bien l'ensemble des items sélectionnes.
    c'est exactement ce que je veux, pouvoir recupérer les index des items selectionnés, pour ensuite effectuer des traitements par lot. je crois que votre exemple me sera très utile. il me reste plus qu'à l'adapter à mon script. encore merci à vous.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,

    Citation Envoyé par roadbecri Voir le message
    Sauf que j'ai du ajouter un element pour qu'il puisse tourner plutôt:
    J'utilise Python 3.

    - W

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    J'utilise Python 3.

    - W
    Ah ok autant pour moi alors, désolé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] selection multiple sur un sous formulaire
    Par zenico64 dans le forum VBA Access
    Réponses: 3
    Dernier message: 24/01/2012, 09h15
  2. Réponses: 2
    Dernier message: 09/11/2010, 17h19
  3. Réponses: 1
    Dernier message: 26/02/2009, 15h13
  4. Clic sur les select multiple
    Par mic79 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/07/2005, 15h44
  5. select multiple sur plusieurs tables
    Par syl2095 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo