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 110 111 112 113 114 115
| import tkinter
from tkinter import ttk
import os
from shutil import move
from glob import glob
def remplir_tree(t, n):
chemin = t.set(n, "chemin")
t.delete(*t.get_children(n))
parent = t.parent(n)
if parent:
pdirs = []
else:
pdirs = glob('.') + glob('..')
sitems = pdirs + os.listdir(chemin)
sitems.sort()
for item in sitems:
item = os.path.join(chemin, item).replace("\\", "/")
if os.path.isdir(item):
itemtype = "dossier"
elif os.path.isfile(item):
itemtype = "fichier"
else:
# TODO
itemtype = "?"
itemname = os.path.basename(item)
iditem = t.insert(n, "end", text=itemname, values=[item, itemtype])
if itemtype == "dossier" and itemname not in (".", ".."):
t.item(iditem, text=itemname)
t.insert(iditem, 0)
t.see(iditem)
def remplir_r(t):
currentdir = os.path.abspath(os.getcwd())
n = t.insert("", "end", text=currentdir, values=[currentdir, "dossier"])
remplir_tree(t, n)
def update_tree(event):
t = event.widget
n = t.focus()
if t.set(n, "type") == "dossier":
remplir_tree(t, n)
def change_dir(event):
t = event.widget
n = t.focus()
if t.parent(n):
c = os.path.abspath(t.set(n, "chemin"))
if os.path.isdir(c):
os.chdir(c)
t.delete(t.get_children(""))
remplir_r(t)
def setscrl(s, d, f):
d = float(d)
f = float(f)
if d <= 0 and f >= 1:
s.grid_remove()
else:
s.set(d, f)
s.grid()
def movemouse(event):
t = event.widget
n = t.selection()
moveitem.set(t.set(n, "chemin"))
def mouserelease(event, l):
t = event.widget
src = moveitem.get()
if src and t.identify_region(event.x, event.y) == "tree":
n = t.identify_row(event.y)
dest = t.set(n, "chemin")
if t.set(n, "type") == "dossier" and not dest.startswith(src):
try:
move(src, dest)
l.config(text='Déplacement de %s'% os.path.basename(src))
except:
t.delete(*t.get_children(0))
remplir_r(t)
l.config(text="Erreur lors de l'opération")
else:
l.config(text="Choisissez un dossier pour éffectuer un déplacement")
else:
l.config(text="Les déplacements se fonts dans l'arboréscence")
l.update()
l.after(1000, l.config(text=''))
moveitem.set("")
def intercepte(event=None):
r.after(500, r.quit)
r = tkinter.Tk()
r.title("ttk.Treeview test")
moveitem = tkinter.StringVar()
vs = ttk.Scrollbar(orient="vertical")
t = ttk.Treeview(r, columns=("chemin", "type"), selectmode="browse",
displaycolumns=("chemin", "type"),
yscrollcommand=lambda deb, fin: setscrl(vs, deb, fin))
vs["command"] = t.yview
t.heading("#0", text="Affichage")
t.heading("chemin", text="Chemin")
t.heading("type", text="Type")
remplir_r(t)
lbinfo = tkinter.Label(r, borderwidth=1, anchor=tkinter.W,
relief=tkinter.SUNKEN, justify=tkinter.LEFT)
t.grid(column=0, row=0, sticky="nswe")
vs.grid(column=1, row=0, sticky="ns")
lbinfo.grid(column=0, row=1, columnspan=2, sticky="ew", padx=5, pady=5)
t.bind("<<TreeviewOpen>>", update_tree)
t.bind("<Double-Button-1>", change_dir)
t.bind("<ButtonRelease-1>", lambda event: mouserelease(event, lbinfo))
t.bind("<B1-Motion>", movemouse)
r.protocol("WM_DELETE_WINDOW", intercepte)
r.mainloop() |
Partager