Pour développer une interface utilisateur (GUI), il faut écrire :
La programmation avec un GUI (interface utilisateur graphique) a un jargon spécifique
L'event loop passe tout son temps à regarder ce qui se passe.
La plupart des événements sont sans intérêt et il ne fait rien quand il les voit.
Mais s'il voit un événement rattaché à un event handler, il informe immédiatement l'event handler de ce qui s'est passé.
Ce premier programme très simple montre l'implémentation de trois concepts de base dans un programme.
Il n'utilise pas Tkinter ni une forme de programmation de GUI.
Il se contente d'afficher un menu sur la console et fait une saisie au clavier.
Il exécute les quatre tâches de base de la programmation d'un GUI.
#----- tâche 2: définir les routines de l'event handler--------------------- def handle_A(): print "Faux ! Essayez encore !" def handle_B(): print "Tout à fait exact ! Trillium est une variété de fleur !" def handle_C(): print "Faux ! Essayez encore !" # ------------ tâche 1: définir l'apparence de l'écran ------------ print "\n"*100 # nettoyer l'écran print " Jeu de devinette très difficile" print "========================================================" print "Tapez la lettre de votre réponse, puis appuyez sur la touche ENTREE." print print " A. Animal" print " B. Légume" print " C. Minéral" print print " X. Quitter ce programme" print print "========================================================" print "Dans quelle catégorie est 'Trillium'?" print # ---- tâche 4: l'event loop. Nous bouclons en permanence, en scrutant les évènements. --- while 1: # Nous attendons le prochain évènement. answer = raw_input().upper() # ------------------------------------------------------- # Tâche 3: Associer des évènements claviers intéressants avec leurs # event handlers. Un forme simple d'association. # ------------------------------------------------------- if answer == "A": handle_A() if answer == "B": handle_B() if answer == "C": handle_C() if answer == "X": # nettoyer l'écran et sortir de l'event loop print "\n"*100 break # Notez que les autres évènements ne sont pas intéressants et sont donc ignorés.
Ce programme n'exécute qu'une des quatre tâches de base d'un GUI présentées plus haut, l'event loop.
la syntaxe from Tkinter import * évite l’obligation de préfixer ce qui vient de Tkinter par un préfixe “Tkinter.”.
Pendant l'exécution de ce programme, des widgets de la fenêtre d'avant-plan permettent de réduire ou augmenter la taille de la fenêtre, ou la fermer.
Un clic sur le widget “close” (le “x” de la barre de titre) déclenche un évènement “destroy” qui termine la boucle principale d'évènement ; comme il n'y a pas d'instructions après “root.mainloop()”, le programme se termine.
from Tkinter import * root = Tk() root.mainloop()
Avec ce programme, nous allons introduire trois concepts importants de la programmation Tkinter :
Glossaire :
Tkinter propose de nombreux conteneurs.
Les Frames sont fournis par Tkinter dans une classe appelée Frame. Une expression comme :
Frame(myParent)
crée une instance de la classe Frame et l'associe avec son parent, myParent. En d'autres termes, cette expression ajoute un frame enfant au composant myParent.
Dans ce programme, l'instruction (1)
myContainer1 = Frame(myParent)
crée un conteneur nommé myContainer1, de type Frame, dont le parent est myParent (c'est-à-dire, root) et dans lequel on peut placer des widgets. (Ici, nous ne plaçons pas de widget, nous le ferons plus loin).
<note>La relation parent/enfant est ici une relation LOGIQUE, pas une relation visuelle. Cette relation existe pour supporter des choses comme l’événement destroy – afin que, quand un composant parent (comme root) est détruit, le parent détruit ses enfants avant de se détruire lui-même.</note>
L'instruction suivante (2) packe (remplit) myContainer1 :
myContainer1.pack()
L'instruction “pack” rend visible un composant du GUI en mettant en place une relation visuelle entre ce composant et son parent. Il faut faire un pack (insertion) d'un composant, sinon il reste invisible.
Pack appelle le geometry manager pack de Tkinter.
Nous avons donc ici un motif de base pour la programmation Tkinter que nous retrouverons souvent.
L'exécution ce programme ressemble beaucoup au précédent, à la différence qu'il affiche moins de choses. C'est parce que les Frames (cadres) Sont élastiques.
Dans le programme précédent, le root s'est affiché avec la taille par défaut car nous n'avions rien précisé.
Mais dans ce programme, nous avons placé quelque chose dans la cavity de root (nous y avons placé Container1). Le cadre root se réduit donc pour s'adapter à la taille de Container1. Comme nous n'avons pas mis de widget dans Container1, ni indiqué une taille minimum pour Container1, la cavity de root se réduit à rien. Voilà pourquoi il n'y a rien à voir en dessous de la title bar.
Dans les programmes suivants, nous placerons des widgets et autres containers dans Container1 ; nous verrons comment Container1 s'étire pour s'adapter.
from Tkinter import * root = Tk() myContainer1 = Frame(root) # (1) myContainer1.pack() # (2) root.mainloop()