Sommaire
Utilisation de la bibliothèque Tkinter
Une initiation à Tkinter
http://artyprog.freezope.org/Python/tkinter/index.htm
- Document de référence :
http://www.nmt.edu/tcc/help/lang/python/tkinter.pdf
- Designer de fenêtres :
Et y ajouter le générateur Python : http://www.geocities.com/eric_brunel/SpecPython.html
Comment faire appeler des fonctions avec des paramètres à Tkinter
- Dans les commandes pour les boutons, les bindings, ou à chaque fois qu'on doit passer une fonction à Tkinter, la fonction ne peut pas avoir de paramètres. Or, on a souvent besoin d'en passer un, par exemple dans le cas de création de widgets dynamiquement. Du coup, on est obligé de créer une fonction ou méthode ne servant qu'à ça, ou de passer par un lambda, ce qui n'est pas très lisible et très vite limité. La classe suivante permet de pré-enregistrer des paramètres pour une fonction, puis d'appeler la fonction avec les paramètres enregistrés suivis d'éventuels paramètres supplémentaires précisés lors de l'appel effectif. Elle est très utile pour spécifier des commandes ou bindings Tkinter, mais peut également servir à chaque fois qu'on doit passer une fonction en paramètre:
Utilisation du widget ScrolledText
- L'exemple ci dessous montre comment marquer et rendre active un zone de texte façon HTML
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 !"):
Ce qui vous permet de l'utiliser facilement par la suite dans n'importe lequel de vos logiciels Tkinter:
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:
- monApplication peut être importé dans d'autres programmes et utilisé.
- Si monApplication.py est lancé directement, il s'affichera de lui-même (grâce au def main() et if name=="main")
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
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.
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