Formation I.S.N.

Le module tkinter - Exercices

Attention ! Les erreurs de programmation avec les interfaces graphiques sont souvent nombreuses. Lorsqu'elles se produisent, il faut redémarrer le shell courant afin d'éviter «d'empiler les erreurs». Avec l'interface Pyzo, cela se fait en cliquant sur le bouton .

Un récapitulatif des instructions usuelles étudiées dans la page Module tkinter est disponible, au format .pdf en cliquant ici.

Pour faire travailler les élèves sur les interfaces graphiques, il est fortement conseillé de donner des programmes à compléter contenant déjà l'architecture de base de la fenêtre. Cela leur permettra de se concentrer sur le contenu (la programmation proprement dite) plutôt que sur la mise en forme (l'apparence).

Lancer un dé

Le programme incomplet ci-dessous définit une interface graphique minimaliste contenant une zone de texte et deux boutons [Lancer] et [Quitter]. Seul le bouton [Quitter] est actif.

  1. Le bouton [Lancer] fait appel à la fonction lancer(). Compléter cette fonction pour que la variable resultat prenne pour valeur un entier aléatoire entre 1 et 6.
  2. lancer() doit aussi modifier l'affichage de la zone texte_affiche pour que la valeur de resultat y apparaisse. [Lancer] plusieurs fois le dé pour commencer à «jouer».

##-----Importation des Modules-----##
from tkinter import *

##-----Définition des Fonctions-----##
def lancer():
    """ Entrées : Fonction déclenchée par le bouton - pas d'entrée
		Sorties : Simule le lancer d'un dé à 6 faces et affiche le résultat obtenu dans la zone de texte."""
    resultat = 0

##-----Création de la fenêtre-----##
fen = Tk()
fen.title('Lancer un dé')

##-----Création des boutons-----##
bouton_lancer = Button(fen, text='Lancer', command=lancer)
bouton_lancer.grid(row = 1, column = 0, padx=5, pady=3)

bouton_quitter = Button(fen, text='Quitter', command=fen.destroy)
bouton_quitter.grid(row = 1, column = 1, padx = 5, pady = 3)

##-----Création des zones de texte-----##
texte_affiche = Label(fen, text='')
texte_affiche.grid(row = 0, column = 0, columnspan = 2)

##-----Programme principal-----##
fen.mainloop()                          # Boucle d'attente des événements
				
  • Une piste
  • Une autre piste
  • Une solution
Pour simuler le lancer d'un dé, il faut penser à importer un module supplémentaire.
Pour modifier l'apparence ou le contenu d'un widget, on utilise la méthode .configure().

##-----Importation des Modules-----##
from tkinter import *
from random import *


##-----Définition des Fonctions-----##
def lancer():
    """ Entrées : Fonction déclenchée par le bouton - pas d'entrée
		Sorties : Simule le lancer d'un dé à 6 faces et affiche le résultat obtenu dans la zone de texte."""
    resultat = randint(1, 6)
    texte_affiche.configure(text = str(resultat))


##-----Création de la fenêtre-----##
fen = Tk()
fen.title('Lancer un dé')


##-----Création des boutons-----##
bouton_lancer = Button(fen, text='Lancer', command=lancer)
bouton_lancer.grid(row = 1, column = 0, padx = 5, pady = 3)

bouton_quitter = Button(fen, text='Quitter', command=fen.destroy)
bouton_quitter.grid(row = 1, column = 1, padx = 5, pady = 3)


##-----Création des zones de texte-----##
texte_affiche = Label(fen, text='')
texte_affiche.grid(row = 0, column = 0, columnspan = 2)


##-----Programme principal-----##
fen.mainloop()                          # Boucle d'attente des événements
						

Un programme inutile

En prenant exemple sur le programme précédent, écrire un nouveau script qui ouvre une fenêtre graphique.

  1. Cette fenêtre doit comporter une zone de texte et trois boutons [Essayer], [Recommencer] et [Quitter].
  2. Un clic sur [Essayer] affiche «Je ne sers à rien» dans la zone de texte.
  3. Un clic sur [Recommencer] affiche sur le bouton [Essayer] «Moi non plus» au lieu de «Essayer».
  • Fenêtre au départ
  • Fenêtre après appui sur [Essayer]
  • Fenêtre après appui sur [Recommencer]
  • Une solution
La fenêtre au départ :
La fenêtre après l'appui sur [Essayer] :
La fenêtre après l'appui sur [Recommencer] :

##-----Importation des Modules-----##
from tkinter import *


##-----Définition des Fonctions-----##
def tester():
    """ Entrées : Fonction déclenchée par le bouton - pas d'entrée
		Sorties : Affiche du texte dans la zone de texte."""
    texte_affiche.configure(text = 'Je ne sers à rien')


def retester():
    """ Entrées : Fonction déclenchée par le bouton - pas d'entrée
		Sorties : Modifie le texte affiché sur le bouton_1."""
    bouton_1.configure(text = 'Moi non plus')


##-----Création de la fenêtre-----##
fen = Tk()
fen.title('Modifier un bouton')


##-----Création des boutons-----##
bouton_1 = Button(fen, text='Essayer', command=tester)
bouton_1.grid(row = 1, column = 0, padx = 5, pady = 3)

bouton_2 = Button(fen, text='Recommencer', command=retester)
bouton_2.grid(row = 1, column = 1, padx = 5, pady = 3)

bouton_quitter = Button(fen, text='Quitter', command=fen.destroy)
bouton_quitter.grid(row = 1, column = 2, padx = 5, pady = 3)


##-----Création des zones de texte-----##
texte_affiche = Label(fen, text='')
texte_affiche.grid(row = 0, column = 0, columnspan = 3)


##-----Programme principal-----##
fen.mainloop()                          # Boucle d'attente des événements