Important

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()
Note
  1. la méthode pack() gère le positionnement des éléments d’interface (widgets)

  2. la méthode mainloop() débute l’interaction (infinie) avec l’utilisateur

  3. quel est le type d’objet fourni en paramètre command au bouton ?

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()
Note
  1. root référence l’interface de l’application

  2. var1 est de type StringVar, vous pouvez aussi utiliser DoubleVar ou IntVar

  3. le paramètre textvariable lie la variable var1 aux éléments d’interface Label et Entry (champ de saisie)

  4. la méthode root.quit() arrête l’interface graphique (la boucle d’intéraction), mais pas le programme

  1. Ajouter un bouton qui réinitialise var1 à la valeur "Hello Monde!"

    Important
    def reset(*inutile):
            var1.set('Hello Monde!')
    
    ...
    
    Tkinter.Button(text="init",command=reset).pack()

2. Gérer plusieurs fenêtres

  1. 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()
    
  2. Déterminer les liens des différentes fenêtres entre-elles

  3. 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 ?

  4. 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()
    
  5. si la méthode root2.destroy() détruit la fenêtre root2, ajouter un bouton dans root1 permettant de détruire root2

    Important
    Tkinter.Button(root,text="Au revoir Fenetre 2",command=root2.destroy).pack()
    
    root.wait_window(root2)
  6. faire de même dans root2, puis tester

3. Gérer des listes

  1. 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())
    
  2. Tester les valeurs MULTIPLE et EXTENDED pour l’attribut selectmode

4. Utiliser des images

  1. 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

  1. 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()
    
  2. Ajouter un second menu Edition proposant les actions Copier,Coller et Supprimer

    Important
    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)
  3. Ajouter un Label qui affiche la dernière action sélectionnée

    Important
    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

  1. 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()
    
  2. Associer la méthode trace2() à toutes les touches du clavier avec l’instruction : root.bind_all(<Key>,trace2). Que retourne event.keysym ?

  3. 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)
  4. Traiter tous les boutons de la souris

  5. Pour les évêmenents souris tracer également les attributs num, x_root, y_root et widget

    Important
    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

  1. 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()
    
  2. Passer le paramètre {"side": "left"} à self.QUIT.pack() puis comparer

  3. Modifier le label du bouton coucou en "Coucou dans la console" puis comparer

  4. Ajouter un widget de type Scale et afficher sa valeur dans la console à la fin de l’application en utilisant sa méthode get()

    Important
            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