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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| # Démo DnD entre 2 Treeviews Tkinter J.P Février 2022
from tkinter import ttk
from tkinterdnd2 import *
import json
def drop_enter(event):
event.widget.focus_force()
#print('On entre dans la zone : %s' % event.widget)
return event.action
def drop_position(event):
#print('Position: x %d, y %d' %(event.x_root, event.y_root))
return event.action
def drop_leave(event):
#print('On quitte %s' % event.widget)
return event.action
def drop(event):
if event.data:
#print(event.data)
# conversion des data en format json
json_string = event.data.replace("'", "\"")
# conversion json en dictionnaire
dict = json.loads(json_string)
print(dict["text"])
tv = event.widget
tv.insert('', 'end', iid=dict['text'], text=dict['text'], values=dict['values'])
return event.action
def drag_init(event):
tv = event.widget
curItem = tv.focus()
print(tv.item(curItem))
data = tv.item(curItem)
return (COPY, DND_TEXT, data)
#Créer une liste de fruits
f_name=['Pommes','Poires','Bananes','Prunes','Oranges','Pêches','Abricots','Kiwis']
#Créer une liste de prix de fruits
f_price_num=[2.24,3.31,1.69,3.78,2.05,3.69,4.20,3.53]
#Créer une liste de numéros de séquence
f_list=[1,2,3,4,5,6,7,8]
root = TkinterDnD.Tk()
style = ttk.Style(root)
# utilisation du thème "clam" qui supporte l'option fieldbackground
style.theme_use("clam")
style.configure('Treeview.Heading', background="white")
style.configure("Treeview",
background="#E8FFFF",
foreground="black",
rowheight=25,
fieldbackground="silver",
)
style.map('Treeview', background=[('selected', 'blue')])
#Créer un tableau
columns=("Fruit","Prix","Numéro")
tree=ttk.Treeview(height=10,show="headings",columns=columns)
tree.heading("Fruit",text="Fruit") # Afficher l'en - tête
tree.heading("Prix",text="Prix")
tree.heading("Numéro",text="Numéro")
#Définir la largeur
tree.column("Fruit", width=130, anchor='center')
tree.column("Prix", width=100, anchor='center')
tree.column("Numéro", width=100, anchor='center')
# Insérer des données de fonction avec couleur alternée par ligne
tree.tag_configure('paire', background="#FFFFFF")
tree.tag_configure('impaire', background="#E8FFFF")
for i in range(min(len(f_name),len(f_price_num),len(f_list))):
motag = 'paire' if i%2 else 'impaire'
tree.insert('',i,text=f_name[i],values=(f_name[i],f_price_num[i],f_list[i]),tags = (motag,))
# deuxième treeview vide
tree2=ttk.Treeview(height=10,show="headings",columns=columns)
tree2.heading("Fruit",text="Fruit") # Afficher l'en - tête
tree2.heading("Prix",text="Prix")
tree2.heading("Numéro",text="Numéro")
#Définir la largeur
tree2.column("Fruit", width=130, anchor='center')
tree2.column("Prix", width=100, anchor='center')
tree2.column("Numéro", width=100, anchor='center')
tree.pack()
tree2.pack()
# gestion des événements
tree.drag_source_register(DND_TEXT)
tree.dnd_bind('<<DragInitCmd>>', drag_init)
tree2.drop_target_register(DND_TEXT)
tree2.dnd_bind('<<DropEnter>>', drop_enter)
tree2.dnd_bind('<<DropPosition>>', drop_position)
tree2.dnd_bind('<<DropLeave>>', drop_leave)
tree2.dnd_bind('<<Drop>>', drop)
root.mainloop() |
Partager