Hello world

Premier contact

Dans l'exemple qui suit, nous allons créer une fenêtre très simple, et y ajouter deux composants graphiques (widgets) typiques : un bout de texte (ou label) et un bouton (ou button).


            import tkinter as tk

            # Creation de la fenetre graphique
            mon_app = tk.Tk()
            
            # Creation des composants de la fenetre (widgets)
            texte = tk.Label(mon_app, text='Bonjour tout le monde !', fg='red')
            texte.grid(row=0, column=0)
            
            bouton = tk.Button(mon_app, text='Quitter', command=mon_app.destroy)
            bouton.grid(row=1, column=0)
            
            # Lancement de l'application (boucle principale)
            mon_app.mainloop()
          

Tester avec repl.it

Lancez le programme python, vous devriez obtenir ceci : mon_app

Explications

La première ligne de notre exemple : import tkinter as tk consiste à importer le module tkinter. Pour accéder aux fonctionnalités de ce module (propriétés et méthodes) il faudra faire précéder le nom de la commande du préfixe tk.

À la deuxième ligne de notre exemple : mon_app = tk.Tk(), nous créons notre objet application qui prend la forme d'une fenêtre graphique.

À la troisième ligne : texte = tk.Label(mon_app, text='Bonjour tout le monde !', fg='red') nous créons un autre objet (un widget), cette fois à partir de la classe Label(). Comme son nom l'indique, cette classe définit toutes sortes d'étiquettes. En fait, il s'agit tout simplement de fragments de texte quelconques, utilisables pour afficher des informations et des messages divers à l'intérieur d'une fenêtre. Nous fournissons un certain nombre d'arguments dans des parenthèses :

Le premier argument transmis (mon_app), indique que le nouveau widget que nous sommes en train de créer sera contenu dans un autre widget préexistant, que nous désignons comme le parent (On pourra dire aussi que l'objet texte est un enfant de l'objet mon_app). dans cet exemple, le widget texte est un enfant de notre fenêtre application.

Les deux arguments suivants servent à préciser la forme exacte que doit prendre notre widget. Ce sont en effet deux options de création, chacune fournie sous la forme d'une chaîne de caractères : d'abord le texte de l'étiquette, ensuite sa couleur d'avant-plan (ou foreground, en abrégé fg). Ainsi le texte que nous voulons afficher est bien défini, et il doit apparaître coloré en rouge. Nous pourrions encore préciser bien d'autres caractéristiques : la police à utiliser, ou la couleur d'arrière-plan, par exemple.

À la quatrième ligne de notre exemple : texte.grid(row=0, column=0) nous activons la méthode du gestionnaire de positionnement grid(). Celle-ci permet de disposer les widgets dans la fenêtre parent. Il ne faut pas oublier d'invoquer cette méthode sinon le widget n'apparaîtra pas sur notre fenêtre application puisque TKinter ne saura pas comment disposer notre texte dans la fenêtre.

À la cinquième ligne : bouton = tk.Button(mon_app text='Quitter', command = mon_app.destroy) nous créons notre second widget enfant : un bouton. Pour cela, nous créons une variable bouton en invoquant la commande TKinter tk.Button() avec certain nombre d'arguments : Étant donné qu'il s'agit cette fois d'un objet interactif, nous devons préciser avec l'option command ce qui devra se passer lorsque l'utilisateur effectuera un clic sur le bouton. Dans ce cas précis, nous appellerons mon_app.destroy(), ce qui devrait provoquer l'effacement de la fenêtre.

La sixième ligne appèle la méthode bouton.grid(row=1, column=0) pour placer le bouton dans notre fenêtre application. Il est placé comme le widget label dans la colonne n°0 (column=0), mais à la ligne n°1 (row=1).

Pour finir, nous donnons vie à notre application par la ligne mon_app.mainloop(). C'est elle qui provoque le démarrage du réceptionnaire d'événements associé à la fenêtre. Comme son nom l'indique, mainloop est une boucle qui « tournera » en permanence en tâche de fond, dans l'attente de messages émis par le système d'exploitation de l'ordinateur. Celui-ci interroge en effet sans cesse son environnement, notamment au niveau des périphériques d'entrée (souris, clavier, etc.). Lorsqu'un événement quelconque est détecté, divers messages décrivant cet événement sont expédiés aux programmes qui souhaitent en être avertis.

Pour vous convaincre de l'utilité de la mainloop, essayez de relancer le programme précédent en retirant la dernière ligne. Que se passe t-il ?

Programmes pilotés par événements

Dans les programmes que vous avez réalisés jusqu'à présent, l'éxécution se déroulait de manièrre linéaire du début à la fin. Souvent, vous commencez par initialiser des variables, puis vous exécutez une ou plusieurs actions dans un ordre bien défini et enfin, vous affichez le résultat de votre travail.

Dans le cas d’un programme qui utilise une interface graphique, par contre, l’organisation interne est différente. On dit d’un tel programme qu’il est piloté par les événements. Après sa phase d’initialisation, un programme de ce type se met en quelque sorte « en attente », et passe la main à un autre logiciel, lequel est plus ou moins intimement intégré au système d’exploitation de l’ordinateur et « tourne » en permanence.
programmation événementielle

Ce réceptionnaire d’événements scrute sans cesse tous les périphériques (clavier, souris, etc.) et réagit immédiatement lorsqu’un événement y est détecté. Un tel événement peut être une action quelconque de l’utilisateur : déplacement de la souris, appui sur une touche, etc., mais aussi un événement externe ou un automatisme (top d’horloge, par ex.) Lorsqu’il détecte un événement, le réceptionnaire envoie un message spécifique au programme, lequel doit être conçu pour réagir en conséquence. Dans le cas d’un programme avec interface graphique, l’ordre dans lequel les fonctions sont appelées n’est plus inscrit nulle part dans le programme. Ce sont les événements qui pilotent !

En vous aidant du programme donné au début de ce classeur, réalisez une application d'apparence semblable à ceci : programmation événementielle

Voici une solution possible :


            import tkinter as tk

            # Creation de la fenetre graphique
            mon_app = tk.Tk()
            
            # Creation des composants de la fenetre (widgets)
            texte1 = tk.Label(mon_app, text='Bonjour tout le monde !', fg='blue')
            texte1.grid(row=0, column=0)
            
            texte2 = tk.Label(mon_app, text="La NSI c'est super !!!", bg='red')
            texte2.grid(row=1, column=0)
            bouton = tk.Button(mon_app, text='Au revoir', command=mon_app.destroy)
            bouton.grid(row=2, column=0)
            
            # Lancement de l'application (boucle principale)
            mon_app.mainloop()