|
Version corrigée |
Le module Tkinter est un module permettant de créer des interfaces utilisateur graphiques (GUI) pour des applications locales (dites lourdes).
Tester le programme suivant :
# -*- coding: UTF-8 -*-
import sys, Tkinter
Tkinter.Label(text="Hello monde!").pack()
Tkinter.Button(text="Au revoir",command=sys.exit).pack()
Tkinter.mainloop()
|
|
1. Traquer les changements
Les objets de type Variable fournis par Tkinter représentent des variables de type quelconque qui si elles sont associées à un élément d’interface permettront de le mettre à jour automatiquement dès que la variable sera modifiée.
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*-
import Tkinter
root = Tkinter.Tk()
var1 = Tkinter.StringVar()
Tkinter.Label(textvariable=var1).pack()
Tkinter.Entry(textvariable=var1).pack()
var1.set('Hello Monde!')
Tkinter.Button(text="Au revoir",command=root.quit).pack()
Tkinter.mainloop()
print "La valeur finale de var1 = %s" % var1.get()
|
|
-
Ajouter un bouton qui réinitialise var1 à la valeur "Hello Monde!"
def reset(*inutile): var1.set('Hello Monde!') ... Tkinter.Button(text="init",command=reset).pack()
2. Gérer plusieurs fenêtres
-
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*- import Tkinter root = Tkinter.Tk() var1 = Tkinter.StringVar() Tkinter.Label(textvariable=var1).pack() Tkinter.Entry(textvariable=var1).pack() var1.set('Hello Monde!') Tkinter.Button(text="Au revoir",command=root.quit).pack() root2 = Tkinter.Toplevel() Tkinter.Label(root2,text='Fenetre 2').pack() Tkinter.mainloop() print "La valeur finale de var1 = %s" % var1.get()
-
Déterminer les liens des différentes fenêtres entre-elles
-
Ajouter la ligne suivante avant l’entrée dans la boucle d’intéraction :
root.wait_window(root2)
Quels sont alors les liens entre les différentes fenêtres ?
-
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*- import Tkinter root = Tkinter.Tk() root2 = Tkinter.Toplevel() var1 = Tkinter.StringVar() var1.set('Hello Monde!') Tkinter.Label(root,textvariable=var1).pack() Tkinter.Entry(root,textvariable=var1).pack() Tkinter.Button(root,text="Au revoir",command=root.quit).pack() Tkinter.Label(root2,textvariable=var1).pack() Tkinter.Label(root2,text='Fenetre 2').pack() root.wait_window(root2) Tkinter.mainloop() print "La valeur finale de var1 = %s" % var1.get()
-
si la méthode root2.destroy() détruit la fenêtre root2, ajouter un bouton dans root1 permettant de détruire root2
Tkinter.Button(root,text="Au revoir Fenetre 2",command=root2.destroy).pack() root.wait_window(root2)
-
faire de même dans root2, puis tester
3. Gérer des listes
-
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*- import os, Tkinter root = Tkinter.Tk() Tkinter.Button(root,text="Au revoir",command=root.quit).pack() list = Tkinter.Listbox(selectmode=Tkinter.SINGLE) for str in ('item1', 'item2', 'item3', 'item4'): list.insert(Tkinter.END,str) list.pack() gif = Tkinter.PhotoImage(file=os.path.join('../pub','calendar.gif')) image = Tkinter.Label(image=gif).pack() Tkinter.Button(root,text="Au revoir",command=root.quit).pack() root.mainloop() print "Dernière sélection : %s" % ','.join(list.curselection())
-
Tester les valeurs MULTIPLE et EXTENDED pour l’attribut selectmode
4. Utiliser des images
-
Ajouter le code suivant dans votre application :
gif = Tkinter.PhotoImage(file=os.path.join('../pub','calendar.gif')) image = Tkinter.Label(image=gif).pack()
5. Gestion des menus
-
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*- import Tkinter root = Tkinter.Tk() var1 = Tkinter.StringVar() var1.set('aucune action') Tkinter.Label(root,textvariable=var1).pack() def a1(): print "Action 1" var1.set("Action 1") def a2(): print "Action 2" var1.set("Action 2") def a3(): print "Action 3" var1.set("Action 3") action = {} menubar = Tkinter.Menu() menu1 = Tkinter.Menu() action['Ouvrir'] = a1 action['Sauver'] = a2 action['Quitter'] = root.quit for item in ('Ouvrir','Sauver','Quitter'): menu1.add_command(label=item,command=action[item]) menubar.add_cascade(label='Fichier',menu=menu1) root.config(menu=menubar) root.mainloop()
-
Ajouter un second menu Edition proposant les actions Copier,Coller et Supprimer
menu2 = Tkinter.Menu() action['Copier'] = a1 action['Coller'] = a2 action['Supprimer'] = a3 for item in ('Copier','Coller','Supprimer'): menu2.add_command(label=item,command=action[item]) menubar.add_cascade(label='Edition',menu=menu2)
-
Ajouter un Label qui affiche la dernière action sélectionnée
var1 = Tkinter.StringVar() var1.set('aucune action') Tkinter.Label(root,textvariable=var1).pack() def a1(): print "Action 1" var1.set("Action 1")
6. Gestion des évênements
-
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*- import Tkinter root = Tkinter.Tk() def trace1(event): print event def trace2(event): print "%s %s" % (event.char,event.keysym) def quit(event): root.quit() root.bind('<Return>', trace1) root.bind('t', trace2) root.bind('q', quit) Tkinter.mainloop()
-
Associer la méthode trace2() à toutes les touches du clavier avec l’instruction : root.bind_all(<Key>,trace2). Que retourne event.keysym ?
-
Ajouter le traitement suivant des évênements souris gauche :
def trace3(event): print "%s %s" % (event.x,event.y) root.bind_all('<Button-1>',trace3)
-
Traiter tous les boutons de la souris
-
Pour les évêmenents souris tracer également les attributs num, x_root, y_root et widget
def trace3(event): print "%s %s %s %s %s %s" % (event.x,event.y,event.x_root,event.y_root,event.num,event.widget) root.bind_all('<Button-1>',trace3) root.bind_all('<Button-2>',trace3) root.bind_all('<Button-3>',trace3)
7. Programmation objet des interfaces Tkinter
-
Comprendre et tester ce programme :
# -*- coding: UTF-8 -*- from Tkinter import * class Application(Frame): def print_coucou(self): print "Coucou à tous!" def createWidgets(self): self.QUIT = Button(self,text="QUITTER",fg="red",command=self.quit) self.QUIT.pack() self.COUCOU = Button(self) self.COUCOU["text"] = "Coucou", self.COUCOU["command"] = self.print_coucou self.COUCOU.pack({"side": "left"}) def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.createWidgets() root = Tk() app = Application(master=root) app.mainloop() root.destroy()
-
Passer le paramètre {"side": "left"} à self.QUIT.pack() puis comparer
-
Modifier le label du bouton coucou en "Coucou dans la console" puis comparer
-
Ajouter un widget de type Scale et afficher sa valeur dans la console à la fin de l’application en utilisant sa méthode get()
self.SCALE = Scale(self,orient=HORIZONTAL) self.SCALE.pack() self.SCALE.set(31) ... print "Valeur du slider = %d" % app.SCALE.get()
8. Exercice
Ecrire l’interface graphique du programme de votre choix : racine, …, calendrier, evenement