Programmation avec Python Interfaces graphiques (GUI)

 I-Premiers pas

Cette partie est un résumé du chapitre 8 du livre « Apprendre à
programmer avec Python » de
Gérard Swinnen. Pour plus de détails
et d'explications, vous pouvez vous y référer.
Nous utiliserons la bibliothèque graphique
Tkinter, incluse dans Python.

Création d'une fenêtre avec deux widgets (contraction de window gadget) : un bout de texte (label) et un
bouton (
button).
En mode interactif, taper les lignes suivantes :
from Tkinter import*
fen1=Tk()
tex1=Label(fen1, text='Bonjour tout le monde !', fg='red')
tex1.
pack()
bou1=Button(fen1, text='Quitter', command=fen1.destroy)
bou1.
pack()
fen1.mainloop()
fen1=Tk() crée la fenêtre qui s'appellera fen1.
tex1=
Label(fen1, text='Bonjour tout le monde !', fg='red') : le premier argument est le nom de la fenêtre
dans lequel sera le bouton (fen1 est le widget maître de l'objet tex1, ou l'objet tex1 est un widget esclave
de l'objet fen1). Le deuxième est facile à comprendre et le troisième est la couleur d'avant plan
(foreground, en anglais).
tex1.
pack() : nous activons ici la méthode pack() à l'objet tex1. Cette méthode agit sur la disposition
géométrique, la fenêtre maître est réduite automatiquement pour qu'elle soit juste assez grande pour
contenir les widgets esclaves.
fen1.
mainloop() : c'est cette ligne qui provoque le démarrage du réceptionnaire d'événements associé à la
fenêtre. Cette instruction est nécessaire pour que l'application soit « à l'affût » des clics de souris, des
pressions exercées sur les touches du clavier, etc. C'est donc cette instruction qui la met en marche.
II-Tracé de lignes dans un canevas
Taper le programme suivant, l'enregistrer et l'exécuter.
#-*- coding:Utf-8 -*-
# Petit exercice utilisant la bibliothèque graphique Tkinter
from Tkinter import*
from
random import randrange
# --- définition des fonctions gestionnaires d'événements : ---
def drawline():
"Tracé d'une ligne dans le canevas can1"
global x1, y1, x2, y2, coul
can1.
create_line(x1,y1,x2,y2,width=2,fill=coul)
# modification des coordonnées pour la ligne suivante :
y2, y1 = y2+10, y1-10

def changecolor():
"Changement aléatoire de la couleur du tracé"
global coul
pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
c =
randrange(8) # => génère un nombre aléatoire de 0 à 7
coul = pal[c]
#------ Programme principal ------
# Les variables suivantes seront utilisées de manière globale :
x1, y1, x2, y2 = 10, 190, 190, 10 # coordonnées de la ligne
coul = 'dark green' # couleur de la ligne
# Création du widget principal ("maître") :
fen1 =
Tk()
# Création des widgets "esclaves" :
can1 =
Canvas(fen1,bg='dark grey',height=200,width=200)
can1.
pack(side=LEFT)
bou1 =
Button(fen1,text='Quitter',command=fen1.quit)
bou1.
pack(side=BOTTOM)
bou2 =
Button(fen1,text='Tracer une ligne',command=drawline)
bou2.
pack()
bou3 = Button(fen1,text='Autre couleur',command=changecolor)
bou3.
pack()
fen1.mainloop()
fen1.destroy()
# démarrage du réceptionnaire d'événement
# destruction (fermeture) de la fenêtre
Un canevas dans Tkinter est une surface rectangulaire délimitée, dans laquelle on peut installer ensuite
divers dessins et images à l'aide de méthodes spécifiques (canevas s'écrit canvas en anglais !).
La fonctionnalité de ce programme est assurée essentiellement par les deux fonctions
drawline( ) et
changecolor( ).
Dans la fonction
changecolor( ), une couleur est choisie au hasard dans une liste, à l'aide de la fonction
randrange( ) importée du module random. Appelée avec un argument N, cette fonction renvoie un
nombre entier, tiré au hasard entre zéro et N-1.
La commande liée au bouton « Quitter » appelle la méthode
quit( ) de la fenêtre fen1.
Cette méthode sert à fermer le réceptionnaire d'événements (
mainloop) associé à cette fenêtre. Lorsque
cette méthode est activée, l'exécution du programme se poursuit avec les instructions qui suivent l'appel
de
mainloop. Dans l'exemple, cela consiste donc à effacer (destroy) la fenêtre.

III-Deux dessins alternés
Taper le programme suivant, l'enregistrer et l'exécuter.
#-*- coding:Utf-8 -*-
from Tkinter import*
def
cercle(x, y, r, coul='black'):
"tracé d'un cercle de centre (x,y) et de rayon r"
can.
create_oval(x-r, y-r, x+r, y+r, outline=coul)
def figure_1():
"dessiner une cible"
# Effacer d'abord tout dessin préexistant :
can.
delete(ALL)
# Tracer les deux lignes (vert. et horiz.) :
3
C
G

can.create_line(100, 0, 100, 200, fill='blue')
can.
create_line(0, 100, 200, 100, fill='blue')
# Tracer plusieurs cercles concentriques :
rayon = 15
while rayon < 100:
cercle(100, 100, rayon)
rayon += 15
def figure_2():
"dessiner un visage simplifié"
# Effacer d'abord tout dessin préexistant :
can.
delete(ALL)
# Les caractéristiques de chaque cercle sont
# placées dans une liste de liste :
cc=[[100, 100, 80, 'red'], # visage
[70, 70, 15, 'blue'], # yeux
[130, 70, 15, 'blue'],
[70, 70, 5, 'black'],
[130, 70, 5, 'black'],
[44, 115, 20, 'red'], # joues
[156, 115, 20, 'red'],
[100, 95, 15, 'purple'], # nez
[100, 145, 30, 'purple']] # bouche
# on trace tous les cercles à l'aide d'une boucle :
i=0
while i < len(cc): # parcourt de la liste
el = cc[i] # chaque élément est lui-même une liste
cercle(el[0], el[1], el[2], el[3])
i += 1
##### Programme principal #####
fen =
Tk()
can = Canvas(fen, width=200, height=200, bg='ivory')
can.
pack(side=TOP, padx=5, pady=5)
b1 =
Button(fen, text='dessin 1', command=figure_1)
b1.
pack(side=LEFT, padx=3, pady=3)
b2 =
Button(fen, text='dessin 2', command=figure_2)
b2.
pack(side=RIGHT, padx=3, pady=3)
fen.
mainloop()
L'option side peut accepter les valeurs TOP, BOTTOM, LEFT ou RIGHT, pour « pousser » le widget du
côté correspondant de la fenêtre.
Les options
padx et pady permettent de réserver un petit espace autour du widget. Cet espace est exprimé
en nombre de pixels :
padx réserve un espace à gauche et à droite du widget, pady réserve un espace audessus et au-dessous du widget.
Prenez le temps d'essayer de bien comprendre ce programme.


Comments

Popular posts from this blog

HISTOIRE DE MINEMBWE ET SES AUTOCHTONES

Variables, expressions, and statements in Python

Extracting Dates From Medical Data