Advertisement
Guest User

rechercher.py

a guest
Apr 25th, 2012
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.17 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # -*- python -*-
  3.  
  4. import sys
  5. import os
  6. from os.path import join,getsize,exists
  7. import tkMessageBox
  8. import tkFileDialog
  9.  
  10. py2 = py30 = py31 = False
  11. version = sys.hexversion
  12. if version >= 0x020600F0 and version < 0x03000000 :
  13.     py2 = True    # Python 2.6 ou 2.7
  14.     from Tkinter import *
  15.     import ttk
  16.     import tkFont
  17.        
  18. elif version >= 0x03000000 and version < 0x03010000 :
  19.     py30 = True
  20.     from tkinter import *
  21.     import ttk
  22. elif version >= 0x03010000:
  23.     py31 = True
  24.     from tkinter import *
  25.     import tkinter.ttk as ttk
  26. else:
  27.     print ("""
  28.    Votre version de Python ne supporte pas les widgets ttk...
  29.    Il faut une version >= 2.6 pour executer les modules PAGE.
  30.    """)
  31.     sys.exit()
  32.  
  33. def vp_start_gui():
  34.     '''Point de depart lorsque le module est la routine principale.'''
  35.     global val, w, racine
  36.  
  37.     racine = Tk()
  38.     racine.title('Rechercher')
  39.     racine.geometry('600x525+413+86')
  40.  
  41.     initialise_var_Tk()
  42.     w = Rechercher(racine)
  43.     init()
  44.     racine.mainloop()
  45.  
  46. w = None
  47. def create_Rechercher(racine):
  48.     '''Point de depart lorsque le module est importe par un autre programme.'''
  49.     global w, w_win
  50.     if w: # pour avoir une seule instance de la fenetre.
  51.         return
  52.     w = Toplevel(racine)
  53.     w.title('Rechercher')
  54.     w.geometry('600x525+413+86')
  55.     initialise_var_Tk()
  56.     w_win = Rechercher(w)
  57.     init()
  58.     return w_win
  59.  
  60. def destroy_Rechercher ():
  61.     global w
  62.     w.destroy()
  63.     w = None
  64.  
  65. def initialise_var_Tk():
  66.     # Ce sont les variables Tk utilisees par Tkinter qui doivent
  67.     # etre definies avant la creation des widgets qui les utilisent.
  68.     global CheminFichier
  69.     CheminFichier = StringVar()
  70.  
  71.     global VchkAVI
  72.     VchkAVI = StringVar()
  73.  
  74.     global VchkMKV
  75.     VchkMKV = StringVar()
  76.  
  77.     global VchkMP3
  78.     VchkMP3 = StringVar()
  79.  
  80.     global VchkMV4
  81.     VchkMV4 = StringVar()
  82.  
  83.     global VchkOGG
  84.     VchkOGG = StringVar()
  85.     global exts, ListeFichiers
  86.     exts = []
  87.     CheminFichier=StringVar()
  88.     ListeFichiers=[]
  89.     #-------------
  90.     global CurseurOccupe,PreCurseurOccupe,WidgetsOccupes
  91.     CurseurOccupe = 'watch'
  92.     PreCurseurOccupe = None
  93.     WidgetsOccupes = (racine, )
  94.     #-------------    
  95.  
  96. def btnClicQuitter(p1) :
  97.     sys.exit()
  98.  
  99. def btnClicAller(p1) :
  100.     #pass
  101.     debutOccupation()    
  102.     ConstruireExts()
  103.     chemin = CheminFichier.get()
  104.     e1 = tuple(exts)
  105.     Parcourir(chemin,e1)
  106.     ChargerDonnees()    
  107.     finOccupation()
  108.  
  109. def btnClicCheminRecherche(p1) :
  110.     #pass
  111.     chemin = tkFileDialog.askdirectory() #**self.file_opt)
  112.     CheminFichier.set(chemin)  
  113.    
  114. def init():
  115.     #pass
  116.     # se lance apres la creation des fenetres et des widgets...
  117.     global VueArborescente
  118.  
  119.     InitialiserCases()    
  120.     VueArborescente = w.VueArboAscenseur1
  121.     InitialiserVueArborescente()
  122.    
  123. def InitialiserCases():
  124.     VchkAVI.set('0')
  125.     VchkMKV.set('0')
  126.     VchkMP3.set('0')
  127.     VchkMV4.set('0')
  128.     VchkOGG.set('0')
  129.    
  130. def ConstruireExts():
  131.     if VchkAVI.get() == '1':
  132.         exts.append(".avi")
  133.     if VchkMKV.get() == '1':
  134.         exts.append(".mkv")
  135.     if VchkMP3.get() == '1':
  136.         exts.append(".mp3")
  137.     if VchkMV4.get() == '1':
  138.         exts.append(".mv4")
  139.     if VchkOGG.get() == '1':
  140.         exts.append(".ogg")
  141.        
  142. def btnClicCheminRecherche(p1) :
  143.     chemin = tkFileDialog.askdirectory() #**self.file_opt)
  144.     CheminFichier.set(chemin)
  145.    
  146. def Parcourir(chemin,extensions):
  147.     rcntr = 0
  148.     liste = []
  149.     for racine, reps, fics in os.walk(chemin):
  150.         rcntr += 1  # nombre de repertoires parcourus
  151.         for fic in [f for f in fics if f.endswith(extensions)]:
  152.             liste.append(fic)
  153.             liste.append(racine)
  154.             ListeFichiers.append(liste)
  155.             liste=[]
  156.            
  157. def InitialiserVueArborescente():
  158.     global TitresColonnes
  159.     TitresColonnes = ['Nom fichier','Chemin']
  160.     VueArborescente.configure(columns=TitresColonnes,
  161.         show="headings")
  162.     for col in TitresColonnes:
  163.         VueArborescente.heading(col, text = col.title(),
  164.                      command = lambda c = col: sortby(VueArborescente, c, 0))
  165.         ## ajuste la largeur de colonne au titre
  166.         VueArborescente.column(col, width = tkFont.Font().measure(col.title()))      
  167.  
  168. def EffacerDonnees():
  169.     for c in VueArborescente.get_children(''):
  170.         VueArborescente.delete(c)
  171.  
  172. def ChargerDonnees():
  173.     global TitresColonnes
  174.  
  175.     for c in ListeFichiers:
  176.         VueArborescente.insert('','end',values=c)
  177.         # ajuste la largeur de colonne si necessaire pour chaque valeur
  178.         for ix, val in enumerate(c):
  179.             larg_col = tkFont.Font().measure(val)
  180.             if VueArborescente.column(TitresColonnes[ix],width=None)<larg_col:
  181.                 VueArborescente.column(TitresColonnes[ix], width=larg_col)
  182.  
  183. def debutOccupation(nouveaucurseur=None):
  184.     global PreCurseurOccupe
  185.  
  186.     if not nouveaucurseur:
  187.         nouveaucurseur = CurseurOccupe
  188.     nouveauPreCurseursOccupes = {}
  189.     for composant in WidgetsOccupes:
  190.         nouveauPreCurseursOccupes[composant] = composant['cursor']
  191.         composant.configure(cursor=nouveaucurseur)
  192.         composant.update_idletasks()
  193.     PreCurseurOccupe = (nouveauPreCurseursOccupes, PreCurseurOccupe)
  194.  
  195. def finOccupation():
  196.     global PreCurseurOccupe
  197.     if not PreCurseurOccupe:
  198.         return
  199.     ancienPreCurseursOccupes = PreCurseurOccupe[0]
  200.     PreCurseurOccupe = PreCurseurOccupe[1]
  201.     for composant in WidgetsOccupes:
  202.         try:
  203.             composant.configure(cursor=ancienPreCurseursOccupes[composant])
  204.         except KeyError:
  205.             pass
  206.         composant.update_idletasks()
  207.            
  208. class Rechercher:
  209.     def __init__(self, principale=None):
  210.         # regle le fond de la fenetre principale suivant
  211.         # le style actuel
  212.         style = ttk.Style()
  213.         theme = style.theme_use()
  214.         default = style.lookup(theme, 'background')
  215.         principale.configure(background=default)
  216.  
  217.         self.Fenetre1 = Frame (principale)
  218.         self.Fenetre1.place(relx=0.0,rely=0.0,relheight=0.1,relwidth=0.99)
  219.         self.Fenetre1.configure(relief=GROOVE)
  220.         self.Fenetre1.configure(borderwidth="2")
  221.         self.Fenetre1.configure(relief="groove")
  222.  
  223.         self.btnQuitter = Button (self.Fenetre1)
  224.         self.btnQuitter.place(relx=0.86,rely=0.36,height=27,width=49)
  225.         self.btnQuitter.configure(text='''Quitter''')
  226.         self.btnQuitter.bind('<Button-1>',btnClicQuitter)
  227.  
  228.         self.Fenetre2 = Frame (principale)
  229.         self.Fenetre2.place(relx=0.0,rely=0.11,relheight=0.35,relwidth=0.54)
  230.         self.Fenetre2.configure(relief=GROOVE)
  231.         self.Fenetre2.configure(borderwidth="2")
  232.         self.Fenetre2.configure(relief="groove")
  233.  
  234.         self.Label1 = Label (self.Fenetre2)
  235.         self.Label1.place(relx=0.03,rely=0.05,height=19,width=55)
  236.         self.Label1.configure(text='''Chemin :''')
  237.  
  238.         self.txtChemin = Entry (self.Fenetre2)
  239.         self.txtChemin.place(relx=0.03,rely=0.16,relheight=0.11,relwidth=0.7)
  240.         self.txtChemin.configure(textvariable=CheminFichier)
  241.  
  242.         self.btnCheminRecherche = Button (self.Fenetre2)
  243.         self.btnCheminRecherche.place(relx=0.74,rely=0.16,height=27,width=38)
  244.         self.btnCheminRecherche.configure(text='''...''')
  245.         self.btnCheminRecherche.bind('<Button-1>',btnClicCheminRecherche)
  246.  
  247.         self.chkAVI = Checkbutton (self.Fenetre2)
  248.         self.chkAVI.place(relx=0.15,rely=0.43,relheight=0.11,relwidth=0.14)
  249.         self.chkAVI.configure(text='''.avi''')
  250.         self.chkAVI.configure(variable=VchkAVI)
  251.  
  252.         self.chkMKV = Checkbutton (self.Fenetre2)
  253.         self.chkMKV.place(relx=0.15,rely=0.54,relheight=0.11,relwidth=0.17)
  254.         self.chkMKV.configure(text='''.mkv''')
  255.         self.chkMKV.configure(variable=VchkMKV)
  256.  
  257.         self.chkMV4 = Checkbutton (self.Fenetre2)
  258.         self.chkMV4.place(relx=0.15,rely=0.65,relheight=0.11,relwidth=0.18)
  259.         self.chkMV4.configure(text='''.mv4''')
  260.         self.chkMV4.configure(variable=VchkMV4)
  261.  
  262.         self.chkMP3 = Checkbutton (self.Fenetre2)
  263.         self.chkMP3.place(relx=0.58,rely=0.54,relheight=0.11,relwidth=0.18)
  264.         self.chkMP3.configure(text='''.mp3''')
  265.         self.chkMP3.configure(variable=VchkMP3)
  266.  
  267.         self.chkOGG = Checkbutton (self.Fenetre2)
  268.         self.chkOGG.place(relx=0.58,rely=0.65,relheight=0.11,relwidth=0.16)
  269.         self.chkOGG.configure(text='''.ogg''')
  270.         self.chkOGG.configure(variable=VchkOGG)
  271.  
  272.         self.btnALLER = Button (self.Fenetre2)
  273.         self.btnALLER.place(relx=0.4,rely=0.81,height=27,width=55)
  274.         self.btnALLER.configure(text='''ALLER !''')
  275.         self.btnALLER.bind('<Button-1>',btnClicAller)
  276.  
  277.         self.Fenetre3 = Frame (principale)
  278.         self.Fenetre3.place(relx=0.0,rely=0.48,relheight=0.5,relwidth=0.94)
  279.         self.Fenetre3.configure(relief=GROOVE)
  280.         self.Fenetre3.configure(borderwidth="2")
  281.         self.Fenetre3.configure(relief="groove")
  282.  
  283.         self.VueArboAscenseur1 = ScrolledTreeView (self.Fenetre3)
  284.         self.VueArboAscenseur1.place(relx=0.02,rely=0.04,relheight=0.96
  285.                 ,relwidth=0.97)
  286.         self.VueArboAscenseur1.configure(columns="Col1")
  287.         self.VueArboAscenseur1.configure(takefocus="ttk::takefocus")
  288.         self.VueArboAscenseur1.heading("#0",text="Arborescence")
  289.         self.VueArboAscenseur1.heading("#0",anchor="center")
  290.         self.VueArboAscenseur1.column("#0",width="266")
  291.         self.VueArboAscenseur1.column("#0",minwidth="20")
  292.         self.VueArboAscenseur1.column("#0",stretch="1")
  293.         self.VueArboAscenseur1.column("#0",anchor="w")
  294.         self.VueArboAscenseur1.heading("Col1",text="Col1")
  295.         self.VueArboAscenseur1.heading("Col1",anchor="center")
  296.         self.VueArboAscenseur1.column("Col1",width="267")
  297.         self.VueArboAscenseur1.column("Col1",minwidth="20")
  298.         self.VueArboAscenseur1.column("Col1",stretch="1")
  299.         self.VueArboAscenseur1.column("Col1",anchor="w")
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306. # Le code suivant est ajoute pour simplifier les widgets avec ascenseurs.
  307. class AutoScroll(object):
  308.     '''Configure les ascenseurs pour un widget.'''
  309.  
  310.     def __init__(self, principale):
  311.         vsb = ttk.Scrollbar(principale, orient='vertical', command=self.yview)
  312.         hsb = ttk.Scrollbar(principale, orient='horizontal', command=self.xview)
  313.  
  314.         self.configure(yscrollcommand=self._autoscroll(vsb),
  315.             xscrollcommand=self._autoscroll(hsb))
  316.         self.grid(column=0, row=0, sticky='nsew')
  317.         vsb.grid(column=1, row=0, sticky='ns')
  318.         hsb.grid(column=0, row=1, sticky='ew')
  319.  
  320.         principale.grid_columnconfigure(0, weight=1)
  321.         principale.grid_rowconfigure(0, weight=1)
  322.  
  323.         # Copie les methodes de geometrie de la fenetre principale (repris de ScrolledText.py)
  324.         methods = Pack.__dict__.keys() + Grid.__dict__.keys() \
  325.                   + Place.__dict__.keys()
  326.  
  327.         for meth in methods:
  328.             if meth[0] != '_' and meth not in ('config', 'configure'):
  329.                 setattr(self, meth, getattr(principale, meth))
  330.  
  331.     @staticmethod
  332.     def _autoscroll(sbar):
  333.         '''Cache et montre les ascenseurs au besoin.'''
  334.         def wrapped(first, last):
  335.             first, last = float(first), float(last)
  336.             if first <= 0 and last >= 1:
  337.                 sbar.grid_remove()
  338.             else:
  339.                 sbar.grid()
  340.             sbar.set(first, last)
  341.         return wrapped
  342.  
  343.     def __str__(self):
  344.         return str(self.principale)
  345.  
  346. def _create_container(func):
  347.     '''Cree une fenetre ttk avec un parent donne, et utilise cette nouvelle fenetre
  348.    pour placer les ascenseurs et le widget.'''
  349.     def wrapped(cls, principale, **kw):
  350.         container = ttk.Frame(principale)
  351.         return func(cls, container, **kw)
  352.     return wrapped
  353.  
  354. class ScrolledTreeView(AutoScroll, ttk.Treeview):
  355.     '''Un widget vue arborescente standard ttk avec ascenseurs qui apparaissent
  356.    automatiquement si necessaire.'''
  357.     @_create_container
  358.     def __init__(self, principale, **kw):
  359.         ttk.Treeview.__init__(self, principale, **kw)
  360.         AutoScroll.__init__(self, principale)
  361.  
  362. if __name__ == '__main__':
  363.     vp_start_gui()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement