Widgets Applications.Menu.

Les WIDGETS

.

Le Bouton :

Le widget Button est un bouton cliquable qui déclenche une action.les réglages : fg, bg, text, height, width, font

Paramètres Effet
text
Précise le texte à afficher
fg
Précise la couleur du texte.
bg
Précise la couleur du fond.
height
Précise la hauteur du bouton.
width
Précise la largeur du bouton.
font
Précise la police de caractères ainsi que la mise en forme (gras, italique, taille..).

.

Les commandes :

Une fois le bouton crée et affiché, on peut lui appliquer une méthode :

Paramètres Effet
command
Permet de préciser la fonction à lancer lors d’un clic de souris sur ce bouton.

ATTENTION :

La fonction ne doit pas comporter de paramètres, sauf si on utilise une fonction lambda.

Paramètres Effet
commandes


#0708 bouton.py from tkinter import * def creer_fenetre(fenetre,taille,titre,icone,couleur): #fonction qui redimensionne, donne le titre #et la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du fond return fenetre #-----------------------------------------------------------# def change(): if b1.cget('text')=='NUIT': b1.config(text='JOUR',width=20,fg='red',font=ft,bg ='gold') fenetre.configure(bg="gold") else: b1.config(text='NUIT',width=20,fg='blue',font=ft,bg='orange') fenetre.configure(bg="blue") fenetre=Tk() taille="300x150" titre="Bouton"couleur="light blue" ft="verdana 12 bold" fenetre=creer_fenetre(fenetre,taille,titre,couleur) b=Button(fenetre, text="Quitter",width=10,fg='red', font=ft,command=fenetre.destroy) b.grid(row=2,column=2) b1=Button(fenetre, text="NUIT",font=ft,width=20, command=change) b1.grid(row=2,column=4,sticky=E) fenetre.mainloop()
_images/bouton.gif
cget()
Retourne la valeur de la ressource pour une clé donnée en tant que chaîne.

.

0709 bouton lambda.py

Programme utilisant une fonction lambda pour la commande du bouton.

Paramètres Effet
command


#0708 bouton.py from tkinter import * def creer_fenetre(fenetre,taille,titre,icone,couleur): #fonction qui redimensionne, donne le titre #et l'icône de la fenêtre ainsi que la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du fond return fenetre #-----------------------------------------------------------# def change(): if b1.cget('text')=='NUIT': b1.config(text='JOUR',width=20,fg='red',font=ft,bg ='gold') fenetre.configure(bg="gold") else: b1.config(text='NUIT',width=20,fg='blue',font=ft,bg='orange') fenetre.configure(bg="blue") fenetre=Tk() taille="300x150" titre="Bouton"couleur="light blue" ft="verdana 12 bold" fenetre=creer_fenetre(fenetre,taille,titre,couleur) b=Button(fenetre, text="Quitter",width=10,fg='red', font=ft,command=fenetre.destroy) b.grid(row=2,column=2) b1=Button(fenetre, text="NUIT",font=ft,width=20, command=change) b1.grid(row=2,column=4,sticky=E) fenetre.mainloop()
_images/lambda.gif
cget()
Retourne la valeur de la ressource pour une clé donnée en tant que chaîne.

La fonction lambda permet de passer des paramètres dans une fonction utilisée par la commande d’un bouton.

Boutons nostalgiques :

Il existe une série d’images toutes faites (pour les nostalgiques des premières icones N/B) pour ces boutons:

"error"
"gray75"
"gray50"
"questhead"
"gray12"
_images/image97.png
_images/image98.png
_images/image99.png
_images/image100.png
_images/image101.png
"hourglass"
"info"
"warning"
"question"
"gray25"
_images/image102.png
_images/image103.png
_images/image104.png
_images/image105.png
_images/image106.png

A utiliser de la sorte :

compound, qui indique la position de l’icône par rapport au texte, peut prendre la valeur "center" (superposition) ou "none" (escamote le texte). Il est possible d’utiliser une image bitmap personnelle initialisée avec BitmapImage().

_images/image107.png

.

Checkbutton: Case à cocher

Paramètres Effet
# 0711 checkbutton saisie.py # case à cocher #! /usr/bin/python from tkinter import * def affiche(a,b,c,d): # affiche si la case est cochée mot=["Premier","Deuxième","Troisième"] u=mot[a] B=b[a] B.select() ft="arial 16 bold" info1=Label(fenetre,text=u,fg="red",bg=bgc,font=ft) info1.grid(row=a,column=3) fenetre=Tk() fenetre.title("terminale NSI Lycée Gay Lussac ") fenetre.geometry("350x200") bgc="light blue" fenetre.configure(bg="light blue") ft="arial 16 bold" mot=["Premier","Deuxième","Troisième"] grd=[0,3,1,3,2,3] # on crée une variable pour l'état de la case à cocher b2=Checkbutton(fenetre, text=mot[0],bg=bgc,font=ft,command=lambda:affiche(0,b,1,2)) b2.grid(row =0, column=0,sticky =W) b3=Checkbutton(fenetre, text=mot[1],bg=bgc,font=ft,command=lambda:affiche(1,b,0,2)) b3.grid(row =1, column=0,sticky =W) b4=Checkbutton(fenetre, text=mot[2],bg=bgc,font=ft,command=lambda:affiche(2,b,0,1)) b4.grid(row =2, column=0,sticky =W) b=[b2,b3,b4] fenetre.mainloop()
html5 video poster by EasyHtml5Video.com v3.9.1

_images/python18n.PNG

Chekbutton

est une « case à cocher ». Une méthode est proposée pour récupérer l’information sur l’état de la « case à cocher. select() Pour décocher la case on utilise deselect()


.

Radiobutton : Bouton radio

Intvar() est la variable qui contient l’état de la case

``text ``est le nom de la matière, et val est un entier qui peut être utilisé par une autre fonction.


Première configuration

Paramètres Effet
#0713 radio bouton.py from tkinter import * def creer_fenetre(fenetre,taille,titre,couleur): #fonction qui redimensionne, donne le titre #et l'icône de la fenêtre ainsi que la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du can return fenetre ft="verdana 12 bold" fenetre=Tk() fenetre=creer_fenetre(fenetre,"500x250",'tutoriel',"light green") v = IntVar()#variable qui contient l'état du radio bouton v.set(1) # initialisation du choix matières = [("Mathématiques",1), ("Informatique",2), ("Français",3),("Physique chimie",4),("Anglais",5)] def affiche_choix(): print( v.get()) Label(fenetre, text="Choisissez votre matière préférée",bg='light green', fg="red",justify = LEFT,font=ft,padx = 20).pack() for txt, val in matières: Radiobutton(fenetre,text=txt,bg='light green',font=ft, padx = 20,variable=v,command=affiche_choix, value=val).pack(anchor=W) fenetre.mainloop()

_images/pythonnn.PNG


Deuxième configuration

Paramètres Effet
#0714 radio bouton.py from tkinter import * def creer_fenetre(fenetre,taille,titre,couleur): #fonction qui redimensionne, donne le titre #et l'icône de la fenêtre ainsi que la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du can return fenetre def choix(): """ change le texte dans la fenetre avec .config""" indice=int(v.get()-1) texte=matieres[indice] mot.config(text=texte[0]) #-----------------------------------------------------------# fenetre=Tk() # crée la fenêtre couleur="light green" couleur1="gold" fenetre=creer_fenetre(fenetre,"500x250",'tutoriel',"light green") ft="verdana 12 bold" v = IntVar() v.set(1) # initialisation matieres = [ ("Mathématiques",1),("Informatique",2),("Français",3), ("Physique chimie",4),("Anglais",5)] Label(fenetre, text="Choisissez votre matière préférée",bg=couleur, fg="red",justify = LEFT,font=ft,padx = 20).pack() mot=Label(fenetre, text="Réponse",bg=couleur,fg='red',font=ft) mot.pack(side="bottom") # change le texte dans la fenetre avec .config mot.config(text="Réponse") for txt, val in matieres: Radiobutton(fenetre,text=txt,bg=couleur1, font=ft, indicatoron = 0, width = 20,padx = 20, variable=v, command=choix, value=val).pack(anchor=W) fenetre.mainloop()

_images/image118.png

.

Saisir un texte.

Le widget Entry permet de saisir un texte court sur une ligne. Il possède les paramètres :

Paramètres Effet
text
Précise le texte à afficher
fg
Précise la couleur du texte.
bg
Précise la couleur du fond.
height
Précise la hauteur du widget Entry.
width
Précise la largeur du widget Entry.
font
Précise la police de caractères ainsi que la mise en forme (gras, italique, taille..).

.

Méthodes :

Méthode Effet
E.get()
Renvoi le texte saisi.
E.insert(i,T)
Insère le texte T dans l’Entry E à la position i.
E.insert(INSERT,T)
Insère le texte T dans l’Entry E à la place du curseur.
E.insert(END,T)
Insère le texte T dans l’Entry E à la fin du contenu existant.
E.delete(i)
Efface un le caractère à la position i de l’Entry E.
E.delete(deb,fin)
Efface les caractères placés entre les indices deb et fin de l’Entry E.
E.delete(0,END)
Efface l’intégralité du champ texte.

.

Exemples :

On peut forcer le curseur à se placer sur l’Entry en exécutant la commande E.focus()

E.upper()  : met en majuscule les lettres de la chaine de caractères.

.

# 0711 entry random.py from tkinter import * import random def creer_fenetre(fenetre,taille,titre,couleur): #fonction qui redimensionne, donne le titre #et l'icône de la fenêtre ainsi que la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du can return fenetre def melange_lettre(mot) : #melange les lettres du mot melanger = mot for i in range(len(mot)) : a = random.randint(0,len(mot)-1) b = random.randint(0,len(mot)-1) new = "" for j in range(len(melanger)) : if j==a : new = new + melanger[b] elif j==b : new = new + melanger[a] else : new = new + melanger[j] melanger = new return melanger def verifie(): #vérifie si le mot entré est identique #à celui qui est demandé if E.get().upper() == m.upper() : t4.config(text="Gagné !", fg='red') else : t4.config(text="Non, réessayer ?",fg='green') #------------programme principal--------------------# fenetre=Tk() creer_fenetre(fenetre,"450x300","Entry melange lettre‏ ","light green") m="Informatique" t2=Label(fenetre,text=melange_lettre(m),width=20,font="verdana 15 bold",bg="light green") t2.grid(row=0,column=1,sticky=W+E) t3=Label(fenetre,text="\nRetrouver\n \nle\n \n mot",font="verdana 18 bold",bg="light green",width=10) t3.grid(row=0,column=0,sticky=W+E) t4=Label(fenetre,text="",font="verdana 15 bold",bg="light green",width=10) t4.grid(row=0,column=2,sticky=W+E) E=Entry(fenetre,width=24,bg='yellow') E.grid(row=1,column=1) B=Button(fenetre,text="Valider",font="verdana 15 bold",bg='orange',width=10,command=verifie) B.grid(row=1,column=0) E.focus() fenetre.mainloop()

_images/python18u.PNG

.

Afficher un texte

.

Label permet un affichage simple de texte:

Paramètres Effet
text
Précise le texte à afficher
fg
Précise la couleur du texte.
bg
Précise la couleur du fond.
height
Précise la hauteur du Label.
width
Précise la largeur du Label.
font
Précise la police de caractères ainsi que la mise en forme (gras, italique, taille..).
#0705 label_texte.py from tkinter import * fenetre=Tk() fenetre.title("Label ") fenetre.geometry("300x100") fenetre.configure(bg="light green") #creation du label texte mot=Label(fenetre, text="Premier texte\ndans un Label") mot.pack(side="bottom") fenetre.mainloop()
_images/python1898.PNG

Une fois le Label crée et affiché, on peut lui appliquer une méthode :

Paramètres Effet
L.config(…)
Permet de modifier les paramètres du widget.

La variable mot, qui contient l’identificateur du widget, permet par la suite de modifier avec mot.config(text= »deuxième texte\ndans une fenêtre »)

ou supprimer le widget avec mot.pack_forget() ,

side= »bottom » garde le texte au bas de la fenêtre si on l’agrandit.

#0706 label_config.py from tkinter import * def creer_fenetre(fenetre,taille,titre,couleur): #fonction qui redimensionne, donne le titre,la couleur fenetre.geometry((taille)) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du fond fenetre.update() return fenetre #---------------------variables---------------------# taille="300x150" titre="Terminale NSI" couleur="light blue" #------------programme principal--------------------# fenetre=Tk() creer_fenetre(fenetre,taille,titre,couleur) mot=Label(fenetre, text="Premier texte\ndans une fenetre") mot.pack(side="bottom") mot.config(text="deuxième texte\n dans une fenêtre") fenetre.mainloop()
_images/python1887.PNG

.

Afficher une image

.

Label peut également recevoir une image sous format GIF/PNG ou bitmap:

Exemple : 0707 label_image.py.

file désigne un nom de fichier, éventuellement avec une adresse précise. On peut utiliser le format png.

<
#0707 label_image.py from tkinter import * fenetre=Tk() fenetre.title('Label image') photo=PhotoImage(file="gare_limoges.png") label=Label(image=photo) label.pack() fenetre.mainloop()
_images/python18limoges.PNG

.

Exemple de création de formes géométriques

Tracer des formes géométriques*

Tracé de lignes dans un canevas. Le script décrit ci-dessous crée une fenêtre comportant six boutons et un canevas. Suivant la terminologie de tkinter, un canevas est une surface rectangulaire délimitée, dans laquelle on peut installer ensuite divers dessins et images à l’aide de méthodes spécifiques. Lorsque l’on clique sur le bouton <Tracer une ligne>, une nouvelle ligne colorée apparaît sur le canevas, avec à chaque fois une inclinaison différente de la précédente.

Si l’on actionne le bouton Rectangle une nouvelle couleur est tirée au hasard dans une série limitée. De nouvelles dimensions sont données aléatoirement.

La même méthode est utilisée pour les boutons Ellipse et Cercle Le bouton <Quitter> sert à terminer l’application en refermant la fenêtre.

Exemple 0720 : Tracé de cercles, de lignes et de rectangles dans un canevas :

Bouton avec texte

Sur les six boutons du menu trois boutons ont pour option

  text=’….  #(ligne 73,75 et 83)

Ils affichent le texte choisit par le programmeur;

.

Boutons avec image

Les trois boutons Rectangle , Cercle et Ellipse ont pour option :

image= #(ligne77, 79 et 81)

Ils affichent des images qui reprèsentent les dessins que les commandes exécutent.

# 0716 tracer des figures et du texte.py from tkinter import * from random import randrange def trace_ligne(): "Trace une ligne dans le canevas can" x1,y1,larg,haut=change_coordonees() couleur='black' can.create_line(x1,y1,x1+larg,y1+haut,width=5,fill=couleur) def trace_cercle(): "Trace un cercle " x1,y1,larg,haut=change_coordonees() larg=larg/2 couleur=change_couleur() can.create_oval(x1,y1,x1+larg,y1+larg,width=2,fill=couleur) def trace_ellipse(): "Trace une ellipse" x1,y1,larg,haut=change_coordonees() couleur=change_couleur() can.create_oval(x1,y1,x1+larg,y1+haut,width=2,fill=couleur) def trace_rectangle(): "Trace un rectangle" x1,y1,larg,haut=change_coordonees() couleur=change_couleur() can.create_rectangle(x1,y1,x1+larg,y1+haut,width=2,fill=couleur) def nettoie(can): "efface tout les dessins et redessine le cadre" can.delete(ALL) can.create_rectangle(2,2,500,500,width=2,outline='black') def change_coordonees(): "change les coordonnées" x1=randrange(50,450) y1=randrange(50,450) lm,hm=500-x1,500-y1 largeur=randrange(25,lm) hauteur=randrange(25,hm) return x1,y1,largeur,hauteur def change_couleur(): "Changement aléatoire de la couleur du tracé" palette=['coral','red','gold','sky blue', 'coral','gray','orange','green'] c = randrange(8) # nombre aléatoire de 0 à 7 couleur = palette[c] return couleur #------ Programme principal ------- fenetre = Tk() fenetre.geometry("650x500") fenetre.title("cercle ligne rectangle dans un canevas ") couleur='green' #couleur initiale x1,y1,largeur,hauteur,diametre=20,20,20,20,40 lc=[ x1,y1,largeur,hauteur,diametre,couleur]#liste de coordonnées txt=['Tracer une ligne',"Tracer un rectangle",'Tracer un cercle', 'Tracer une ellipse'] BG="light blue" #Méthode grid can = Canvas(fenetre,bg='pale turquoise',height=500,width=500) can.grid(row=0,column=0,rowspan=6,columnspan=6) can.create_rectangle(2,2,500,500,width=2,outline='black') b1 = Button(fenetre,text='Quitter',bg='red',command=fenetre.destroy) b1.grid(row=5,column=7) b2 = Button(fenetre,text=txt[0],command=lambda:trace_ligne(),bg=BG) b2.grid(row=0,column=7) b3 = Button(fenetre,text=txt[1],command=lambda:trace_rectangle(),bg=BG) b3.grid(row=1,column=7) b4 = Button(fenetre,text=txt[2],command=lambda:trace_cercle(),bg=BG) b4.grid(row=2,column=7) b5 = Button(fenetre,text=txt[3],command=lambda:trace_ellipse(),bg=BG) b5.grid(row=3,column=7) b6 = Button(fenetre,text='Effacer',command=lambda:nettoie(can),bg=BG) b6.grid(row=4,column=7) fenetre.mainloop()
video mp4 by EasyHtml5Video.com v3.9.1

.

Options formes géométriques :

Style CHORD, smooth, splinestep.

Pour les formes géométriques, les deux premiers entiers représentent les coordonnées du point en haut à gauche du rectangle, les deux suivants celles du point en bas à droite. Pour create_oval et create_arc, il s’agit des coordonnées du rectangle circonscrit.

Pour create_arc, l’angle de départ et l’extension sont donnés en degrés (progression trigonométrique, antihoraire) PIESLICE dessine un quartier de tarte, CHORD un arc et sa corde. Pour dessiner un polygone, éventuellement arrondi, il faut en déterminer les différentes coordonnées de points (sans se préoccuper de répéter les coordonnées du premier) : smooth=True et splinesteps=n sont disponibles pour les polygones.

#0721 formes geometriques.py # arc de cercle et polygone from tkinter import * fenetre=Tk() fenetre.title("Formes géométriques ") fenetre.geometry("550x220") can1 = Canvas(fenetre, width =550, height =220, bg ='white') # une arc de cercle lc=[160,130,230,200] lc1=[260,20,330,200] arc1=can1.create_arc(lc,start=30,extent=120,fill="yellow",outline="purple",width=3,style=CHORD) arc2=can1.create_arc(lc1,start=0,extent=200,fill="blue",outline="red",width=3,style=CHORD) # un polygone tracer=[35,105, 120,85, 95,25, 80,75, 25,60, 65,30] polygone=can1.create_polygon(tracer, fill="cyan", width=5, splinesteps=25,outline='black') can1.grid(row =0, column =0, rowspan =3, padx =0, pady =0) fenetre.mainloop()
_images/image136.png

.

Reconfigurer un élément :

L’instance récupérée lors de la création permet de manipuler les objets créés. Pour un rectangle crée avec la variable rectangle, la commande permet de changer la couleur d’un rectangle par le bouton :

can.itemconfigure(rectangle,fill="green")
Colore l’objet rectangle en vert.
can.delete(rectangle)
Détruit l’élément rectangle
#0722 reconfigurer.py from tkinter import * def creer_fenetre(fenetre,taille,titre,couleur): #fonction qui redimensionne, donne le titre #et l'icône de la fenêtre ainsi que la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du can return fenetre def rouge(v): """change la couleur en rouge""" if v=="g": can.itemconfig(r, fill='red') else: can.itemconfig(r1, fill='red') def vert(v): """change la couleur en vert""" if v=="g": can.itemconfig(r, fill='light green') else: can.itemconfig(r1, fill='light green') def bleu(v): """change la couleur en bleu""" if v=="g": can.itemconfig(r, fill='blue') else: can.itemconfig(r1, fill='blue') fenetre=Tk() couleur='light blue' titre=" Reconfigurer" taille="400x220" d,g="d","g" fenetre=creer_fenetre(fenetre,taille,titre,couleur) can= Canvas(fenetre, width=300, height=200, background=couleur) can.grid(row=0,column=1,columnspan=4,rowspan=3) r=can.create_rectangle(10,10, 150,185, fill='green') r1=can.create_rectangle(155,10, 295,185, fill='gold') b1= Button(fenetre, text="Rouge!", command=lambda:rouge(g)) b2= Button(fenetre, text="Vert!", command=lambda:vert(g)) b3= Button(fenetre, text="Bleu!", command=lambda:bleu(g)) b1.grid(row=0,column=0) b3.grid(row=1,column=0) b2.grid(row=2,column=0) b1= Button(fenetre, text="Rouge!", command=lambda:rouge(d)) b2= Button(fenetre, text="Vert!", command=lambda:vert(d)) b3= Button(fenetre, text="Bleu!", command=lambda:bleu(d)) b1.grid(row=0,column=5) b3.grid(row=1,column=5) b2.grid(row=2,column=5) fenetre.mainloop()
video mp4 by EasyHtml5Video.com v3.9.1

Illustration:

.

Scale

Le widget scale permet de faire varier à l’aide d’un curseur la valeur d’un nombre qui appartient à un intervalle défini par la syntaxe :

from = debut  to = fin #(debut et fin sont des nombres)

Pour afficher

les graduations c’est tickinterval=2 par exemple pour afficher les graduations paires. On affiche le titre de l’échelle par Label.

Le code :

#0736 echelle.py from tkinter import* from fenetre import* def arrivee(x): """configure l'angle extent de l'arc de cercle""" global arc1 can.itemconfig(arc1,extent=x) def depart(x): """configure l'angle start de l'arc de cercle""" global arc1 can.itemconfig(arc1,start=x) def couleur(x): """change la couleur de l'arc de cercle""" global arc1,couleur y=int(x) y=y-1 couleur=['red','blue','dark orange','hot pink','khaki','green'] can.itemconfig(arc1,fill=couleur[y]) fenetre=Tk() titre,taille,icone="scale","540x800","icone.ico" fenetre=creerfenetre(fenetre,titre,icone,taille) division=PanedWindow(orient=VERTICAL) division.pack(expand="yes",fill="both") panneau1=Label(division,text="Panneau Un",bg="white") can1 = Canvas(panneau1, width =540 ,height =20, bg ='white') can1.grid(row=4,column=0) division.add(panneau1) panneau2=Label(division,text="Panneau Deux") division.add(panneau2) can = Canvas(panneau2, width =540 ,height =500, bg ='white') arc1=can.create_arc(10,10,500,500,start=0,extent=1,fill="red") item=Scale(panneau1,orient='horizontal',from_=0,to_=360,resolution=1,tickinterval=60,\ length=540,label='Arrivée',font='verdana 12 bold',command=arrivee) item1=Scale(panneau1,orient='horizontal',from_=0,to_=360,resolution=1,tickinterval=60,\ length=540,label="départ",fg='blue',font='verdana 12 bold',command=depart) item0=Label(panneau1,text='Couleur',font='verdana 12 bold') item2=Scale(panneau1,orient='horizontal',from_=1,to_=6,resolution=1,tickinterval=1,\ length=540,fg='white',font='verdana 12 bold',command=couleur,showvalue=0) item.grid(row=0,column=0) item1.grid(row=1,column=0) item0.grid(row=2,column=0,sticky='w') item2.grid(row=3,column=0) can1.create_rectangle(0,0,90,20,fill='red') can1.create_rectangle(91,0,1801,20,fill='blue') can1.create_rectangle(181,0,270,20,fill='orange') can1.create_rectangle(271,0,360,20,fill='pink') can1.create_rectangle(361,0,450,20,fill='khaki') can1.create_rectangle(451,0,540,20,fill='green') degre=360 can.grid(row=0,column=0,rowspan=2) fenetre.mainloop()
video mp4 by EasyHtml5Video.com v3.9.1
Label
Affiche une étiquette à l’intérieur de ce widget avec le texte utilisant les options du widget Label. L’étiquette apparaît dans le coin supérieur gauche si le widget est orienté horizontalement et dans le coin supérieur droit s’il est orienté verticalement.
length
La longueur du widget dans la direction où celui-ci est orienté
orient
Utilisez “horizontal” pour l’orienter horizontalement ou “vertical” pour l’orienter verticalement. L’orientation par défaut est “vertical”.
relief
Avec la valeur par défaut “flat”, le widget n’a pas de bordure visible. Vous pouvez utiliser la valeur “solid” pour l’entourer d’un cadre noir, ou utiliser les reliefs des boutons.
activebackground
La couleur du curseur lorsque la souris estau-dessus.
bg #background
La couleur d’arrière-plan de la partie du widget qui est située en dehors de l’aire de glissement.
bd # borderwidth
La largeur de la bordure qui forme le contour.
command
Une fonction qui sera appelée à chaque fois que le curseur sera déplacé. reçoit un argument (lignes 4, 8 et 12).La variable x qui est en paramètre dans la fonction reçoit comme valeur le nombre où est situé le curseur .

.

TopLevel :

Permet l’ouverture d’une nouvelle fenêtre. Afin de ne passurcharger l’exemple, la nouvelle fenêtre n’affiche rien de plus que la première. Deux fenêtres vont s’ouvrir: la principale, nommée pour l’occasion Principale, et la seconde, appelée Seconde. On subordonne le plus souvent la création d’une seconde fenêtre à un événement de la première, par exemple associée au clic d’un bouton. Fermer la principale ferme la seconde, l’inverse n’est pas vrai.

#0723 toplevel.py from tkinter import * def creer_fenetre(fenetre,taille,titre,couleur,ld): fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre)# affiche le titre dans la fenêtre fenetre.configure(bg=couleur,borderwidth=ld)# change la couleur du fond return fenetre fenetre=Tk() titre,taille="Fenêtre Principale","300x200" couleur="light blue" fenetre=creer_fenetre(fenetre,taille,titre,couleur,5) ch=Checkbutton(text="Nom") ch.grid(row=0,column=0) fenetre= Toplevel() titre,couleur="Seconde fenêtre","light green" fenetre=creer_fenetre(fenetre,taille,titre,couleur,5) fenetre.configure(relief="raised") fenetre.grid() fenetre.mainloop()

_images/image142.png

.

Frame :

Frame est un cadre, permettant de regrouper géographiquement les widgets dans une fenêtre. ll est possible de donner un bord et un nom à un cadre avec LabelFrame.

Cadre=LabelFrame(fenetre,text="Titre de cadre")

.

Relief

La majorité des wigdets peuvent afficher un type de relief avec le paramètre relief= défini par les constantes RAISED (élevé), SUNKEN (enfoncé), FLAT (plat, par défaut), GROOVE (rainure) , RIDGE (crête), ou leur contenu: "raised", "sunken", "flat", "groove » ou "ridge".

Les simples `boutons` à cliquer disposent déjà du type « raised » avec une animation « sunken » lors du clic gauche.

# 0724 labelframe1.py from tkinter import * fenetre = Tk() fenetre.title("fenetre composée à l'aide de frames") fenetre.geometry("400x350") f1 = Frame(fenetre, bg = 'lavender') f1.pack(side =LEFT, padx =5) liste = 6*[0] for (n, col, rel, txt,bde) in [(0, 'white', RAISED, 'Relief sortant',4), (1, 'white', SUNKEN, 'Relief rentrant',6), (2, 'lavender', FLAT, 'Pas de relief',0), (3, 'white', RIDGE, 'Crête',5), (4, 'white', GROOVE, 'Sillon',7), (5, 'white', SOLID, 'Bordure',6)]: liste[n] = Frame(f1, bg='lavender',relief =rel,bd=bde) b = Button(liste[n], text =txt, width =15, bg =col) b.pack(side =LEFT, padx =5, pady =5) liste[n].pack(side =TOP, padx =0, pady =4) f2 = Frame(fenetre, bg ='light green', bd =5, relief =GROOVE) f2.pack(side =RIGHT, padx =5) can = Canvas(f2, width =100, height =100, bg ='gold', bd =5, relief =SOLID) can.pack(padx =15, pady =15) bouton =Button(f2, text='Bouton',relief=RAISED,bd=4) bouton.pack() fenetre.mainloop()

_images/image144.png

.

Deux frames - Double fenêtre :

Programme avec deux frame et un widget Text un widget Entry et une variable StrinVar.

#0725double fenetre.py from tkinter import* def creer_fenetre(fenetre,taille,titre,couleur): """redimensionne, le titre, l'icône, la couleur""" fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du fond return fenetre def copier(a,b): copie=saisie.get() saisie.set("") if a==0: texte[a].insert(END,copie+'\n') if b==1: texte[b].insert(END,copie+'\n') fenetre=Tk() titre="Copier Coller" taille="360x250" couleur="wheat" ft="verdana 12 bold" fenetre=creer_fenetre(fenetre,taille,titre,couleur) texte=["",""] saisie=StringVar() fr1=Frame(fenetre,bg="khaki") fr1.grid(row=2,column=0,columnspan=3) fr2=Frame(fenetre,bg="pale green") fr2.grid(row=2,column=3,columnspan=3) texte[0]=Text(fr1,width=20,height=10,bg='pale green') texte[0].grid(row=0,column=0,columnspan=3) B1=Button(fr1,text='Copier',bg='yellow',command=lambda:copier(0,0)) B1.grid(row=3,column=0,columnspan=3) texte[1]=Text(fr2,width=20,height=10,bg="khaki") texte[1].grid(row=0,column=0,columnspan=2) B2=Button(fr2,text='Copier',bg='bisque',command=lambda:copier(1,1)) B2.grid(row=3,column=0,columnspan=3) E=Entry(fenetre,textvariable=saisie,width=25,bg="white") E.grid(row=0,column=3,columnspan=3) L=Label(fenetre,text="Champ de saisie",width=22,bg="wheat") L.grid(row=0,column=0,columnspan=3) L1=Label(fenetre,text="Fenêtre n°1",width=23,bg="pale green") L1.grid(row=1,column=0,columnspan=3) L2=Label(fenetre,text="Fenêtre n°2",width=22,bg="khaki") L2.grid(row=1,column=3,columnspan=3) fenetre.mainloop()
_images/image147.png

.

PanelWindow :

#0726 panedwindows.py from tkinter import* fen = Tk() fen.title("PanelWindow") fen.geometry("350x75") division=PanedWindow(orient=VERTICAL) division.pack(expand="yes",fill="both") panneau1=Label(division,text="Panneau Un",bg="yellow") division.add(panneau1) panneau2=Label(division,text="Panneau Deux") division.add(panneau2) panneau3=Label(division,text="Panneau Trois",bg="light green") division.add(panneau3) fen.mainloop()
_images/image148.png

.

PanedWindow

Permet de diviser une fenêtre en plusieurs panneaux adaptables. On adapte cette fonction dans l’autre direction avec les paramètres suivants: orient= HORIZONTAL. Il est possible de créer des subdivisions dans un des panneaux. Dans l’exemple suivant, c’est le panneau bas qui devient l’objet à diviser par PanedWindows: c’est donc à lui que les sous-panneaux gauche et droite doivent se référer.

# 0726 panedwindows2.py from tkinter import * fenetre = Tk() fenetre.title("Panelwindow multiple") fenetre.geometry("400x200") division=PanedWindow(orient=VERTICAL) division.pack(expand="yes",fill="both") haut=Label(division,text="Panneau du haut") division.add(haut) milieu=Label(division,text="Panneau du milieu",bg="yellow") division.add(milieu) bas=PanedWindow(orient=HORIZONTAL) # nouvelle division bas.pack(expand="yes",fill="both") gauche=Label(bas,text="Panneau bas-gauche",bg="light green") bas.add(gauche) droit=Label(bas,text="Panneau bas-droit",bg="red") bas.add(droit) division.add(bas) # on acheve la declaration du panneau bas fenetre.mainloop()
_images/image151.png

.

Listbox :

Liste de caractères cliquables.

Permet d’afficher une séquence de chaînes de caractères.

#0727 listbox.py from tkinter import * def clic(inutile): texte.insert(INSERT,liste.get(liste.curselection())+" \n") fenetre = Tk() fenetre.title("listbox") fenetre.geometry("200x300") fenetre.configure(bg="light green") mot1=Label(fenetre, text="double cliquer\nsur le mot\npour l'afficher") mot1.pack(side="bottom") liste=Listbox(fenetre,width=20,bg="yellow") liste.pack() texte=Text(fenetre,width=10,fg="blue") texte.pack() for element in ["premier","deuxième","troisième","quatrième"]: liste.insert(END, element) liste.bind('<Double-1>', clic) fenetre.mainloop()
_images/python18saisie5.PNG

.

selectmode=MULTIPLE

Le script suivant permet le transfert dans la zone texte d’un mot dans une liste, par un double clic gauche.

La boucle for remplit la liste des éléments dans la Listbox.

inutile est une variable nécessaire mais qu’on n’utilise pas.

#0708 bouton.py from tkinter import * def creer_fenetre(fenetre,taille,titre,couleur): #fonction qui redimensionne, donne le titre #et la couleur fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du fond return fenetre #-----------------------------------------------------------# def change(): if b1.cget('text')=='NUIT': b1.config(text='JOUR',width=20,fg='red',font=ft,bg ='gold') fenetre.configure(bg="gold") else: b1.config(text='NUIT',width=20,fg='blue',font=ft,bg='orange') fenetre.configure(bg="blue") fenetre=Tk() taille="300x150" titre="Bouton"couleur="light blue" ft="verdana 12 bold" fenetre=creer_fenetre(fenetre,taille,titre,couleur) b=Button(fenetre, text="Quitter",width=10,fg='red', font=ft,command=fenetre.destroy) b.grid(row=2,column=2) b1=Button(fenetre, text="NUIT",font=ft,width=20, command=change) b1.grid(row=2,column=4,sticky=E) fenetre.mainloop()
video mp4 by EasyHtml5Video.com v3.9.1

INSERT

Permet d’ajouter l’élément cliqué à l’endroit du curseur (END pour la fin du texte, CURRENT pour le début)

Il est possible de remplacer le double-clic par une confirmation par bouton:

De plus, Listbox accepte selectmode= MULTIPLE pour un mode de sélection multiple en cliquant successivement sur plusieurs items, et EXTENDED qui permet Ctrl-Clic pour une succession d’items et Maj-Clic pour une suite d’items consécutifs.

Il a fallu modifier la fonction clic pour qu’elle accepte une réponse multiple, sous forme de tuple contenant les index des items choisis.

.

Scrollbar :

Permet de faire défiler dans une surface limitée quelques widgets, comme Text, Entry, Listbox, et Canvas.

orient=VERTICAL est l'orientation par défaut
defilY = Scrollbar(can,orient=VERTICAL,width=16,command=can.yview)``

Il était possible de garder le défilement vertical de la liste de nombres avec un ascenseur horizontal, en changeant ses deux lignes de définitions:

    orient= HORIZONTAL
command=can.xview

Par contre, la commande liste.yview doit rester la même, puisque le défilement est vertical

defilY`` avec Canvas
video mp4 by EasyHtml5Video.com v3.9.1
video mp4 by EasyHtml5Video.com v3.9.1

Menu :

Voici un exemple commenté d’un système de menu fonctionnel comportant des cascades (sous-menus). Pour la fonction Menu, deux méthodes sont nécessaires: add_cascade pour ajouter un menu ou un sous-menu, et add_command pour décider de la commande associée au clic. Les actions sont ici limitées à l’affichage d’un texte.

Complément

# 0731 menu.py from tkinter import * def ecran(var): # fonction servant a l'affichage des textes: texte.insert(END,var) fenetre = Tk() fenetre.title("menu") fenetre.geometry("300x300") fenetre.configure(bg='light blue') texte=Text(fenetre,bg='khaki') # prevoit une place pour l'affichage des textes texte.pack() # Creation du systeme de menu (variable explicite sysdemenu): sysdemenu = Menu(fenetre) menu1 = Menu(sysdemenu) # Creation du premier menu: menu1.configure(bg='red') sysdemenu.add_cascade(label="Menu 1",menu=menu1) # addition des deux items pour le premier menu et leur commande associee menu1.add_command(label="Crédit", command=lambda: ecran('D P et Alice\n')) menu1.add_command(label="Quitter", command=fenetre.quit) menu2 = Menu(sysdemenu) # Creation du second menu sysdemenu.add_cascade(label="Menu 2", menu=menu2) # addition du premier item pour le second menu et leur sous-items associes item1 = Menu(menu2) item1.configure(bg='light blue') menu2.add_cascade(label="Item 1", menu=item1) menu2.configure(bg='khaki') # addition des sous-items du premier item du second menu et leur commande associee item1.add_command(label="000000", command=lambda: ecran('Item 1 / Action 1\n')) item1.add_command(label="Action 1", command=lambda: ecran('Item 1 / Action 1\n')) item1.add_command(label="Action 2", command=lambda: ecran('Item 1 / Action 2\n')) # addition du second item pour le second menu et leur sous-items associes item2 = Menu(menu2) item2.configure(bg='light green') menu2.add_cascade(label="Item 2", menu=item2) # addition des sous-items du second item du second menu et leur commande associee item2.add_command(label="Action 1", command=lambda: ecran('Item 2 / Action 1\n')) item2.add_command(label="Action 2", command=lambda: ecran('Item 2 / Action 2\n')) item2.add_command(label="Action 3", command=lambda: ecran('Item 2 / Action 3\n')) fenetre.config(menu=sysdemenu) fenetre.mainloop()
video mp4 by EasyHtml5Video.com v3.9.1

.

Boîtes à messages :

La librairie qui suit permet d’ouvrir des boîtes toutes faites, qui permettent d’avertir, de demander une confirmation, de préciser une valeur, de sélectionner un fichier ou même de choisir une couleur.
_images/image163.png
from tkinter import
from tkinter import messagebox

Importe les fonctions de boîte à messages. Le bouton par défaut (que l’on peut confirmer par [Enter]) est toujours celui de gauche: [Ok], [Yes] ou [Retry], il faut sinon le préciser avec default="no" ou default="cancel".

Retournent ok, bouton nécessairement par défaut:

messagebox.showinfo()
messagebox.showwarning()
messagebox.showerror()``

Retourne yes ou no

messagebox.askquestion()# default="yes"

sinon, préciser default= »no »``

Retournent True ou False, ou encore None pour askyesnocancel():

messagebox.askokcancel()#default="ok" sinon, préciser
default="cancel"``
messagebox.askyesno() # default="yes"  sinon, préciser
default="no"
messagebox.askyesnocancel()#default="yes"» sinon default="no «ou "cancel"
messagebox.askretrycancel() # default="retry" sinon, préciser default="cancel"
title=""
Donne un titre à la boîte de message ou de choix.
message=""
Définit le message en gras, à l’intérieur de la boîte.
detail=""
Permet un message secondaire, dans une fonte de plus petite taille.
icon=""
Permet de forcer le type d’icone « error », « info », « question » ou « warning », quelle que soit le type de réponse possible.
from tkinter import
from tkinter import messagebox
messagebox.askyesno(icon="info")

Permet de forcer d’autres choix dans une boîte particulière avec les valeurs:

"ok", "yesno", "okcancel", "retrycancel", or "yesnocancel".

L’exemple suivant permet d’afficher la boîte d’erreur

(la x blanche sur le disque rouge de showerror), mais avec un choix entre [Oui] et [Non].

.

Communication entre fenêtres :

C’est par l’intermédiaire des variables que l’on peut échanger des données entre plusieurs fenêtres.

#0741 Communiquer.py from tkinter import* def creer_fenetre(fenetre,taille,titre,couleur): """redimensionne, le titre, l'icône, la couleur""" fenetre.geometry(taille) # redimensionne la fenêtre fenetre.title(titre) # affiche le titre dans la fenêtre fenetre.configure(bg=couleur)# change la couleur du fond return fenetre def entree(fenetre,saisie,): """ crée une deuxièmefenêtre pour saisir les données""" fenetre1=Toplevel() fenetre1=creer_fenetre(fenetre1,taille1,titre1,couleur1) E=Entry(fenetre1,textvariable=saisie,width=35,bg="white") E.grid(row=1,column=0,columnspan=3) E.insert(0,"Ecrire un message") message="Saisir les données" message1="Envoyer les données" B2=Button(fenetre1,text=message1,bg='linen',command=lambda:copier()) B2.grid(row=3,column=0,columnspan=3) L2=Label(fenetre1,text=message,width=20,bg="khaki") L2.grid(row=0,column=0,columnspan=3) def copier(): """fonction qui copie les données""" copie=saisie.get() saisie.set("") texte[0].insert(END,copie+'\n') fenetre=Tk() titre,titre1="Reception","Entrer les données" taille,taille1="300x100","300x100" couleur,couleur1="wheat","pale green" ft="verdana 12 bold" fenetre=creer_fenetre(fenetre,taille,titre,couleur) texte=[""] saisie=StringVar() msg='Ouvrir une zone de saisie' B1=Button(fenetre,text=msg,bg='gold',command=lambda:entree(fenetre,saisie)) B1.grid(row=1,column=0,columnspan=3) texte[0]=Text(fenetre,width=30,height=4,bg='pale green') texte[0].grid(row=0,column=0,columnspan=3) fenetre.mainloop()
_images/python18saisie.PNG