[PageD'Accueil] [IndexDesTitres] [IndexDesTermes

Utilisation de la bibliothèque Tkinter

Une initiation à Tkinter

Comment faire appeler des fonctions avec des paramètres à Tkinter

   1 ## Auteur: Eric Brunel
   2 
   3 class GenericCallback:
   4 
   5   def __init__(self, callback, *firstArgs):
   6     self.__callback = callback
   7     self.__firstArgs = firstArgs
   8 
   9   def __call__(self, *args):
  10     apply(self.__callback, self.__firstArgs + args)
  11 
  12 ## Exemple d'utilisation
  13 
  14 
  15 root.mainloop()

Utilisation du widget ScrolledText

   1 #N'hésiter pas à le copier et le modifier à votre convenance
   2 #Auteur : Salvatore
   3 
   4 #Pointeur de souris en forme de main
   5 def main(event):
   6     st.config(cursor='hand2')
   7 
   8 #Pointeur de souris en forme de flèche
   9 def fleche(event):
  10     st.config(cursor='arrow')
  11 
  12 def additionne_index(ind1,ind2):
  13     x1 = string.atoi(string.splitfields(ind1,'.')[0])
  14     y1 = string.atoi(string.splitfields(ind1,'.')[1])
  15     x2 = string.atoi(string.splitfields(ind2,'.')[0])
  16     y2 = string.atoi(string.splitfields(ind2,'.')[1])
  17     return ('%d.%d')%(x1+x2,y1+y2)
  18 
  19 def colore(mot,couleur):
  20     start = 0.0
  21     while 1:
  22         try:
  23             i = st.search(mot,start,END)
  24             j = st.index('%s+%dc'%(i,len(mot)))
  25             st.tag_add(couleur,i,j)
  26             start = j
  27         except:
  28             break
  29 
  30 def affiche_commande():
  31     commande = entre.get()
  32     st.insert(END,'\n'+commande,'rouge')
  33 
  34 def click_python(event):
  35     st.insert(END,'\nVous avez cliquez sur Python')
  36 
  37 texte = """
  38 Ce petit programme constitue un aperçu
  39 de l'utilisation de Tkinter, qui est la librairie graphique standard pour Python.
  40 Son principale inconvénient est son 'look' non natif (sous Windows)
  41 WxPython est une alternative très intéressante.
  42 Python est tout à fait adapté à la création d'interfaces graphiques
  43 
  44 Promener la souris sur le texte et constater comment le mot Python
  45 est rendu actif.
  46 Remarquer aussi comment 'taguer' certaines zones de texte.
  47 Ces 'tags' permettent d'attribuer différentes caractéristiques à 
  48 certaines parties du texte : couleur, fonte, tailles..
  49 """
  50 
  51 def initialisation():
  52     #on insète le texte 'texte' dans le widget 'texte déroulant' nommé 'st'
  53     st.insert(END,texte)
  54     #on applique à tout le texte la police par défaut
  55     st.config(font = 'Arial 12 bold')
  56     st.config(foreground='DarkGreen')
  57     #on configure le fond du 'texte dérouant'
  58     st.config(background='LightYellow')
  59     #paramètres de configurations spécifiques
  60     #ces différents 'tags' permettront de 'taguer' de fçon spécifique
  61     st.tag_config('bleu',foreground='Green')
  62     st.tag_config('bleu',background='White')
  63     st.tag_config('bleu',relief='flat')
  64     st.tag_config('rouge',font = 'Bold')
  65     st.tag_config('rouge',font = 'Helvetica 12  bold')
  66     st.tag_config('rouge',foreground='Red')
  67     st.tag_bind('enorme','<Button-1>',click_python)
  68     st.tag_bind('enorme','<Leave>',fleche)
  69     st.tag_bind('enorme','<Enter>',main)
  70     st.tag_config('enorme',font= 'Arial 24 bold')
  71     st.tag_config('enorme',foreground='DarkOrange')
  72     e = Entry(st,width=25)
  73     #ici on utilise les 'tags' pour colore certains mots'
  74     colore('Tkinter','rouge')
  75     colore('Python','enorme')
  76     colore('Windows','rouge')
  77 
  78 #Point d'entrée
  79 from Tkinter import *
  80 from ScrolledText import *
  81 
  82 #on crée un fenetre principale 'fp' à partir du 'modèle' Tk   
  83 fp = Tk()
  84 fp.title('Démo Tkinter')
  85 
  86 #Création d'un panneau 'menu_top' inséré dans 'fp'
  87 menu_top = Frame(fp,borderwidth=2)
  88 menu_top.pack(side='top',fill='x')
  89 
  90 #Création d'une étiquette insérée dans 'menu_top'
  91 etiquette = Label(menu_top,text = 'Commande : ')
  92 etiquette.pack(side = 'left')
  93 
  94 #Création d'un boutton dans 'menu_top'
  95 b = Button(menu_top,text='execute',command=affiche_commande)
  96 b.pack(side='right')
  97 
  98 #Création d'un boite d'édition dans 'nenu_top'
  99 entre = Entry(menu_top,width=20,relief='sunken')
 100 entre.insert(END,'promener la souris dans le texte')
 101 entre.pack(side='left',fill='x',expand='true')
 102 
 103 #Déclaration du texte déroulant dans 'fp'
 104 st = ScrolledText(fp)
 105 st.pack(expand=1,fill='both',side='bottom')
 106 initialisation()
 107 fp.mainloop()

Utilisation d'une checkbox

Pour lire la valeur de certains widgets (checkbox, boutons radio...), Tkinter ne vous laisse pas la possibilité de lire directement la valeur du widget. Vous vous serez amené à créer des variables Tkinter spéciales.

Voici un exemple avec une checkbox:

   1 import Tkinter
   2 
   3 class monApplication:
   4     def __init__(self,root):
   5         self.root = root
   6         self.initialisation()
   7 
   8     def initialisation(self):
   9         self.monoption = Tkinter.IntVar()  # On cree une variable Tkinter
  10         # On cree la checkbox:
  11         Tkinter.Checkbutton(self.root,text="Cochez moi !",variable=self.monoption).grid(column=0,row=0)
  12         # On cree un bouton:
  13         Tkinter.Button(self.root,text="Cliquez moi pour lire la valeur",command=self.afficheValeur).grid(column=0,row=1)
  14     
  15     def afficheValeur(self):
  16         if self.monoption.get() != 0:
  17             print "La case est cochee."
  18         else:
  19             print "La case n'est pas cochee."
  20 
  21 def main():
  22     root = Tkinter.Tk()
  23     root.title('Mon application')
  24     app = monApplication(root)
  25     root.mainloop()
  26 
  27 if __name__ == "__main__":
  28     main()

Vous remarquerez qu'on a créé une variable numérique Tkinter (Tkinter.IntVar()) que nous attachons à la checkbox (variable=self.monoption) et dont nous lisons plus loin la valeur (self.monoption.get()).

Une application Tkinter sous forme de classe

Pour faciliter la réutilisation de votre code, vous avez tout intérêt à le mettre sous forme de classe.

Par exemple, monApplication.py (qui affiche simplement "Salut !"):

   1 import Tkinter
   2 
   3 class monApplication:
   4     def __init__(self,root):
   5         self.root = root       # On garde une référence au widget qui nous contient.
   6         self.initialisation()
   7     
   8     def initialisation(self):
   9         Tkinter.Label(self.root,text="Salut !").grid(column=0,row=0)

Ce qui vous permet de l'utiliser facilement par la suite dans n'importe lequel de vos logiciels Tkinter:

   1 import Tkinter
   2 import monApplication
   3 
   4 root = Tkinter.Tk()   
   5 root.title('Ceci est mon programme') 
   6 app = monApplication.monApplication(root)  
   7 root.mainloop()   

L'idéal est même de mettre ce code directement dans monApplication.py:

   1 import Tkinter
   2 
   3 class monApplication:
   4     def __init__(self,root):
   5         self.root = root
   6         self.initialisation()
   7     
   8     def initialisation(self):
   9         Tkinter.Label(self.root,text="Salut !").grid(column=0,row=0)
  10 
  11 def main():
  12     root = Tkinter.Tk()
  13     root.title('Mon application')
  14     app = monApplication(root)
  15     root.mainloop() 
  16 
  17 if __name__ == "__main__":
  18     main()

Ainsi:

Les dialogues Tkinter

Tkinter est fourni avec différents dialogue qui vous simplifient la vie. En voici une partie:

Sélection d'un répertoire

   1 import Tkinter
   2 import tkFileDialog
   3 
   4 root = Tkinter.Tk()
   5 repertoire = tkFileDialog.askdirectory(parent=root,initialdir="/",title='Choisissez un repertoire')
   6 if len(repertoire) > 0:
   7     print "vous avez choisi le repertoire %s" % repertoire

Sélection et ouverture d'un fichier

tkFileDialog.askopenfile ouvre lui-même le fichier vous renvoie un objet "file" que vous pouvez manipuler comme un fichier normal.

   1 import Tkinter
   2 import tkFileDialog
   3 
   4 root = Tkinter.Tk()
   5 file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choisissez un fichier')
   6 if file != None:
   7     data = file.read()
   8     file.close()
   9     print "J'ai lu %d octets du fichier." % len(data)

Dialogue "Sauvegarder sous..."

   1 import Tkinter
   2 import tkFileDialog
   3 
   4 mesFormats = [
   5     ('Windows Bitmap','*.bmp'),
   6     ('Portable Network Graphics','*.png'),
   7     ('JPEG / JFIF','*.jpg'),
   8     ('CompuServer GIF','*.gif'),
   9     ]
  10 
  11 root = Tkinter.Tk()
  12 nomFichier = tkFileDialog.asksaveasfilename(parent=root,filetypes=mesFormats,title="Sauvez l'image sous...")
  13 if len(nomFichier) > 0:
  14     print "Sauvegarde en cours dans %s" % nomFichier

2016-06-05 21:43