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

Tkinter Python Discussion :

MoveUp MoveDown sur item d'une ListView [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut MoveUp MoveDown sur item d'une ListView
    Bonjour,

    Je souhaite pouvoir déplacer les items de ma ListView, mais je ne sais pas du tout comment faire?

    Dans l'idée:

    -Sélectionner la ligne de ma ListView à bouger, (on récupère l'index de la ligne)
    -Bouton Up ou Down,

    Merci par avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Vous avez posté dans le forum tkinter mais ListView n'est pas un widget de base...
    Et s'il s'agit d'une Listbox, il faut apprendre à utiliser les méthode .insert et .delete (ou poster le code que vous avez essayé)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Je dirais même plus que c'est une TreeView

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Citation Envoyé par Supernatural Voir le message
    Je dirais même plus que c'est une TreeView
    Eh bien vous cherchez dans votre documentation préférée(*), ce qui ressemble à .insert .delete pour ce widget là.... puis vous essayez de les faire marcher, et, si çà ne marche pas vous pourrez montrer le code que vous avez essayé.

    note: ce widget là a même une méthode .move.

    - W
    (*) c'est celle que je préfère, il y en a d'autres.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Je suis parti sur le .move, donc:
    J'ai 2 boutons: 1 MoveUp et 1 MoveDown

    Je sélectionne mon item dans ma TreeView, je clique sur MoveUp ou MoveDown, mon item se décale :-)

    Voilà ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            #-------------------------------------------------------------------------------------------
            #-------------------------------------------------------------------------------------------
            def MoveUp():
                print('Move up kanban in list')
                curItem   = tree.focus()
                KANBAN_ID = tree.item(curItem)['text']
                print(tree.index)
                if KANBAN_ID!='':
                    print(KANBAN_ID)
                    tree.move(KANBAN_ID, '', KANBAN_ID-1)
                else:
                    messagebox.showerror("Erreur", "Veuillez séléctionner un kanban dans la liste!")
    Bon sans surprise j'ai une errreur lol:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      File "Kanban+.py", line 398, in MoveUp
        tree.move(KANBAN_ID, '', KANBAN_ID-1)
      File "C:\python_373\lib\tkinter\ttk.py", line 1394, in move
        self.tk.call(self._w, "move", item, parent, index)
    _tkinter.TclError: Item 6 not found

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    C'est bien joli çà mais dans tree.move(KANBAN_ID, '', KANBAN_ID-1)
    le premier argument doit être l'identifiant d'un item et c'est une chaine de caractères.

    Si vous voulez découvrir comment fonctionne un widget, il faut commencer "petit":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
    import tkinter.ttk as ttk
     
    tv = ttk.Treeview()
    for i in range(5):
        iid = tv.insert('', 'end', text=f'text-{i}')
        print (iid)
    tv.pack()
    tk.mainloop()
    puis vous pouvez ajouter un Button qui va, par exemple, essayer de déplacer l'item sélectionné vers le haut.
    Cela fait, vous allez pouvoir adapter le code pour qu'il soit plus facile à intégrer à votre programme.
    Enfin, vous allez pouvoir essayer de l'intégrer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Ok, merci :-)

    J'ai fait ça pour donner un ID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idSETUP_LIST=tree.insert('', 'end', text=iLine+1, values=(dummy[0], dummy[1]))
    et je le récupère avec:

    par contre lorsque je recharge ma TreeView (suite à un update), je voudrais que les ID s'initialisent car dans mon cas présent, elles s’incrémentent à la place de repartir de I001... Je fais idSETUP_LIST='' avant mais rien ne se produit...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    .insert crée un nouvel identifiant à chaque appel, histoire d'avoir un identifiant unique. Si vous voulez les réutiliser, il faut les gérer vous même.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Ok, je ne ré-index pas qui finalement n'est pas bloquant.

    Quelle opération mathématique dois-je adopter sur des id tel I001, ...., I00A etc...

    Je ne peux pas soustraire 1 à A... Il faut que je passe par des conversion en Hexa ou autre?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Citation Envoyé par Supernatural Voir le message
    Quelle opération mathématique dois-je adopter sur des id tel I001, ...., I00A etc...
    à priori, c'est un I suivit d'un compteur sous forme hexa.
    ...mais... normalement, vous devriez considérer cela comme un machin opaque: juste une chaîne de caractère juste bonne à servir de clef pour un dictionnaire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Je dois être bête.... il faut cet index mais pas l'utiliser... là je veux bien un exemple concret car je comprend plus...

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Citation Envoyé par Supernatural Voir le message
    Je dois être bête.... il faut cet index mais pas l'utiliser... là je veux bien un exemple concret car je comprend plus...
    Comme j'ai essayé de vous l'expliquez dans une réponse précédente, à vous de construire un exemple de ce que vous voulez faire pour illustrer les difficultés que vous rencontrez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Donc j'ai avancé un peu.. Voilà ce que j'ai fait:
    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
    import tkinter as tk
    import tkinter.ttk as ttk
    from tkinter import *
     
    tree = ttk.Treeview()
    tree.bind('<Double-Button>', lambda e: GetID())
     
     
    ButtonUp   = Button(text="MoveUp selected item", command=lambda: MoveUp())
    ButtonUp.pack(side=BOTTOM, fill=BOTH)
     
    ButtonDown = Button(text="MoveDown selected item", command=lambda: MoveDown())
    ButtonDown.pack(side=BOTTOM, fill=BOTH)
     
    for i in range(20):
        iid = tree.insert('', 'end', text=i)
        #print (iid)
    tree.pack()
     
    def GetID():
        curItem   = tree.focus()
        print(curItem)
        KANBAN_ID = tree.item(curItem)['text']
     
    def MoveUp():
        curItem   = tree.focus()
        print('MoveUp')
        tree.move(curItem,'',curItem[+1])
     
    def MoveDown():
        curItem   = tree.focus()
        print('MoveDown')
        tree.move(curItem,'',curItem[-1])
    tk.mainloop()
    J'arrive à monter ou descendre mon item jusqu'à 8 mais qu'une seule fois, après c'est un peu le grand n'importe quoi...

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Si curItem est la chaîne de caractères "I00x", curItem[+1] sera le deuxième caractère de cette chaîne de caractères là i.e. '0'.

    Réfléchissez un peu.
    Vous insérez vous items dans la Treeview et çà va créer les identifiants I001, I002, I003,... Comme vous ajoutez vos item "à la fin", l'ordre alphabétique des identifiants correspond à la position dans la liste affichée.
    Une fois que vous les aurez bougés/déplacés, les identifiants auront une position différente, par exemple: I003, I002, I001, I004,...
    Et vous ne pourrez plus vous baser la dessus pour les déplacer...

    Vous ce que vous voulez, c'est l'index de cet item dans la liste de ce qu'affiche le Treeview: çà c'est la méthode .index(...) le retourne (et tant que la structure n'a qu'un seul niveau, c'est suffisant).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 443
    Points : 111
    Points
    111
    Par défaut
    Merci, j'étais parti sur la solution .index (j'ai galéré mais réussi)

    Je poste mon bout de code (il n'est pas très bien scripté, mais dans l'idée c'est ce que je voulais :-))

    Merci beaucoup.

    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
    import tkinter as tk
    import tkinter.ttk as ttk
    from tkinter import *
     
    tree = ttk.Treeview()
    tree.bind('<ButtonRelease-1>', lambda e: GetID())
     
     
    ButtonUp   = Button(text="MoveUp selected item", command=lambda: MoveUp())
    ButtonUp.pack(side=BOTTOM, fill=BOTH)
     
    ButtonDown = Button(text="MoveDown selected item", command=lambda: MoveDown())
    ButtonDown.pack(side=BOTTOM, fill=BOTH)
     
    for i in range(50):
        iid = tree.insert('', 'end', text=i)
        #print (iid)
    tree.pack()
     
    def GetID():
        print(tree.selection()[0])                  #Retour de valeur sous la forme I001
     
     
    def MoveUp():
        print('MoveUp')
        idtv=tree.index(tree.selection()[0])
        tree.move(tree.selection()[0], '', idtv-1)
     
     
    def MoveDown():
        print('MoveDown')
        idtv=tree.index(tree.selection()[0])
        tree.move(tree.selection()[0], '', idtv+1)
     
    tk.mainloop()

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

Discussions similaires

  1. Androi Studio : Cliquer sur un Item d'une listView pour ouvrir une autre listViem
    Par souleymanemakan dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 16/03/2017, 15h56
  2. Cliquer sur un item d'une listview pour lancer une nouvelle activité
    Par kopbuc dans le forum Composants graphiques
    Réponses: 14
    Dernier message: 31/01/2016, 12h46
  3. [VBA] événements souris sur un item d'une listview
    Par DJBORIE dans le forum VBA Access
    Réponses: 11
    Dernier message: 13/04/2007, 15h08
  4. Changer dynamiquement la couleur d'un item d'une listview
    Par little_cypress dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/11/2004, 14h46

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