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
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
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
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.
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:
Bon sans surprise j'ai une errreur lol:
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!")
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
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":
puis vous pouvez ajouter un Button qui va, par exemple, essayer de déplacer l'item sélectionné vers le haut.
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()
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
Ok, merci :-)
J'ai fait ça pour donner un ID:
et je le récupère avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part idSETUP_LIST=tree.insert('', 'end', text=iLine+1, values=(dummy[0], dummy[1]))
Code : Sélectionner tout - Visualiser dans une fenêtre à part curItem = tree.focus()
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...
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
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?
Je dois être bête.... il faut cet index mais pas l'utiliser...là je veux bien un exemple concret car je comprend plus...
Donc j'ai avancé un peu.. Voilà ce que j'ai fait:
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...
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()
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
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()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager