Interface utilisateur graphique (GUI) en Python

Transcription

Interface utilisateur graphique (GUI) en Python
Environnement graphique
Interface utilisateur graphique (GUI) en Python
interface « texte »
ou « en ligne de commande »
interface graphique
Cours_9_4
© L. Tichit, 26/06/2015
page 1/13
Environnement graphique
Interface utilisateur graphique (GUI) en Python
•
Ce cours
présentation de quelques généralités sur les interfaces graphiques


•
construction progressive d’une interface : Edigraph
(explication et textes sources sur le site du cours)
Références (également sur le site du cours)

Tkinter reference : a GUI for Python – John Shipman

An introduction to Tkinter – Fredrik Lundh

Python Library Reference, la section 25
Cours_9_4
© L. Tichit, 26/06/2015
page 2/13
Environnement graphique
Interface utilisateur graphique (GUI) en Python
• l’auteur de Python n’a pas écrit une bibliothèque graphique spécifique
• Python utilise des bibliothèques préexistantes (écrites en C, C++, Tcl, …)
livrées avec une API (couche de fonctions-relais) Python
• les plus connues :
 tkinter, au-dessus de Tk, la bibliothèque graphique de Tcl/Tk
 PyQt, utilisant Qt (ex. KDE)
 PyGTK, bâtie sur GTK (The GimpToolkit, ex. Gnome)
• Tkinter, très complète, semble la préférée du monde « officiel » Python
• attention, l’accès n’est pas immédiat
 les bibliothèques graphiques sont des usines à gaz : beaucoup de
classes, ayant beaucoup de méthodes, avec beaucoup d’arguments, etc.
 la doc la plus complète est celle de Tcl/Tk, or Tcl n’est pas facile à lire
 beaucoup d’exemples sur Tkinter (et les autres API) utilisent
Python objet : choisir de faire de l'objet (ou pas)
Cours_9_4
© L. Tichit, 26/06/2015
page 3/13
Environnement graphique
Concepts communs et jargon
• widget (window+gadget), on dit aussi composant graphique
• l’interface d’une application : une fenêtre ou cadre d’application
(frame) contenant de nombreux autres composants
• le cadre de l’application existe et est visible aussi longtemps que
l’application tourne : pour l’utilisateur, le cadre « est » l’application
• d’autres cadres de même niveau (i.e. non inclus dans le cadre
d’application) apparaissent et disparaissent : les boîtes de dialogue
• les composants sont cibles d’actions de l’utilisateur (souris, clavier)
• ces actions du monde extérieur sont représentées dans le programme
par des événements :
 événements élémentaires ; ex. clic avec la souris
 événements élaborés, ou commandes ; ex. choix d’un item dans un menu
Cours_9_4
© L. Tichit, 26/06/2015
page 4/13
Environnement graphique
Le plus petit programme avec interface graphique
from tkinter import Tk
application = Tk()
# création d'un objet de type
# fenêtre d'application Tk
application.mainloop()
# l'application vit sa vie
print("C'est tout !")
ceci apparaît
ceci ne s’affiche pas… !
Cours_9_4
© L. Tichit, 26/06/2015
page 5/13
Environnement graphique
Programmation événementielle
• la boucle principale (la plus extérieure) du programme nous échappe :
l’essentiel se passe à l’intérieur de application.mainloop()
• programmation événementielle : structure générale d’un programme :
définitions de variables globales, fonctions, etc.
application = Tk()
mise en place de chaque composant
en indiquant quels événements le concernent
et comment il y répond (i.e. quelles fonctions appelle-t-il)
application.mainloop()
• pratiquement, il s’agit d’écrire le programme sous forme de bouts
de code « accrochés » aux gestionnaires d’événements
• la structure du programme en est modifiée
Cours_9_4
© L. Tichit, 26/06/2015
page 6/13
Environnement graphique
Interface graphique = arborescence de widgets
• les widgets d’une application ont une structure hiérarchique qui traduit
 l’inclusion des uns dans les autres
 le contrôle de la durée de vie
• création d’un widget
 variable = unWidget ( parent, paramètres-à-mot-clé )
exemple
boutonGo = Button(application,
text = "Vas-y", command = bosser, autres paramètres)
signification





Cours_9_4
Button(...) : un appel du constructeur de la classe Button
la valeur de la variable boutonGo est un objet Button
ce bouton est inclus dans application
la destruction de application détruira ce bouton
les autres paramètres fixent les propriétés du bouton
© L. Tichit, 26/06/2015
page 7/13
Environnement graphique
Gestionnaires de disposition
• certains widgets (Tk, Frame, …) sont destinés à en contenir d’autres :
on les appelle alors conteneurs
• un gestionnaire de disposition (layout manager, geometry manager, …)
est associé à chaque conteneur ; il gère :
 la taille et la disposition initiale des composants contenus
 la taille et la disposition de ces composants lors des changements ultérieurs
• Important : tant qu’un composant n’est pas associé à un tel gestionnaire,
il n’est pas visible
• trois sortes de gestionnaires :
 place : placement absolu, fait « à la main » par le programmeur (rare)
 pack : placement contre les bords du containeur
 grid : placement dans une grille (implicite)
Cours_9_4
© L. Tichit, 26/06/2015
page 8/13
Environnement graphique
Gestionnaires de disposition, résumé :
composant.grid(option = valeur, ... )
row = n° de ligne
column = n° de colonne
rowspan = nombre de lignes occupées
columnspan = nombre de colonnes occupées
sticky = somme de N, E, W ou S : placement du widget dans la case
composant.pack(option = valeur, ... )
side = un parmi TOP, LEFT, BOTTOM et RIGHT
expand = booléen
fill = un parmi NONE, X, Y et BOTH
l’un et l’autre :
padx = espace à laisser à l’extérieur des bords est et ouest (points)
pady = espace à laisser à l’extérieur des bords nord et sud (points)
ipadx = espace à laisser à l’intérieur des bords est et ouest (points)
ipady = espace à laisser à l’intérieur des bords nord et sud (points)
Cours_9_4
© L. Tichit, 26/06/2015
page 9/13
Environnement graphique
Evénements
• événement : signalement d’un phénomène du monde extérieur
affectant le programme
• c’est la boucle principale (mainloop) qui les détecte et les dispatche
• un événement a généralement une cible, qui est un composant :
 pour un événement souris, le composant sous le curseur
 pour un événement clavier, le composant qui a le focus
• plusieurs événements basiques peuvent être réunis pour former
un événement élaboré ou commande (ex : presser un bouton)
• réaction à une commande :
 une fonction est indiquée lors de la création du composant
 elle sera appelée, sans arguments, lorsque la commande sera actionnée
• réaction à un événement basique :
 on lie (bind) le couple (composant, événement) à une fonction
 qui sera appelée lorsque l’événement se produira
 avec pour argument les circonstances de l’événement en question
Cours_9_4
© L. Tichit, 26/06/2015
page 10/13
Environnement graphique
Quelques widgets
• Étiquette
Label(maître, text=texte, autres paramètres)
• Bouton
Button(maître, text=texte, command=fonction, autres paramètres )
• Case à cocher
Checkbutton(maître, text=texte, command=fonction, autres paramètres)
doit être associée à une IntVar dont la valeur correspond à
l’état de la case à cocher
• Boutons-radio
Radiobutton()
associés à une même IntVar ou StringVar qui les synchronize
voir les exemples simpleCheckbutton
Cours_9_4
© L. Tichit, 26/06/2015
page 11/13
Environnement graphique
Un widget très spécial : Canvas
• un widget Canvas se présente comme un panneau,
sur lequel on peut dessiner : canvas.create_rectangle( …),
canvas.create_oval(…), canvas.create_text(…), etc.
• il maintient la liste d’objets graphiques dessinés, dont il est le seul accès
• cette liste traduit l’ordre d’affichage (fin de la liste = devant de la scène)
• chaque objet graphique a un « object id » (un entier) qui l’identifie
• de plus, chaque objet graphique peut avoir un ou plusieurs tags
(chaînes de caractères) permettant de le référencer dans certaines
opérations
Cours_9_4
© L. Tichit, 26/06/2015
page 12/13
Environnement graphique
A propos de la configuration des widgets
• lors de la création ; ex. :
etiquette = Label(application, text = "Texte initial", ... )
• plus tard, par la méthode config ; ex. :
etiquette.config(text = "Nouveau texte")
• obtention de la valeur d’un paramètre :
texte = etiquette.cget("text")
• en plus de cela, pour un objet d’un canvas : lors de la création ; ex.
id = canevas.create_rectangle(20, 20, 80, 80, fill='red', ... )
• plus tard, par la méthode itemconfigure ; ex. :
canevas.itemconfigure(id, fill='blue')
• obtention de la valeur d’un paramètre :
couleur = canevas.itemcget(id, 'fill')
Cours_9_4
© L. Tichit, 26/06/2015
page 13/13