Recettes python / tkinter
LE module graphique de référence de python est Tkinter. Cette page regroupe quelques exemples de scripts utilisant cette interface graphique afin d'alléger la page consacrée à tkinter. Il sont tous concrets et fonctionnels, testés sur GNU/Linux Debian, python 3.7 et son tkinter associé.
↑ Écriture d'une boîte de sélection de couleurs
La boîte de sélection de couleurs de Tkinter ne comporte que des défauts:
- pas de réactivité de la couleur composée lors du mouvement d'un curseur (rouge, vert ou bleu)
- difficulté de manipulation fine d'un curseur
- la couleur attribuée à chaque curseur est composite, influencée par les autres valeurs (le curseur «à fond» du rouge est orangé si le curseur du vert est à mi-course)
- l'édition des nombres doit être confirmée par le retour-chariot (mais pas [Enter] du pavé numérique)
- l'appel de la boîte se fait à partir du module tkColorChooser en python2 et du sous-module tkinter.colorchooser en python3, ce qui rend plus difficile l'écriture de scripts universels aux deux versions.
- la boîte du module tkinter.colorchooser de python3 renvoie des «réels», ce qui oblige encore à arrondir les valeurs
- un clic sur annuler renvoie la valeur None plutôt que la valeur de départ
Le script proposé permet de suivre la variation immédiate de la couleur composée à chaque mouvement de curseur. Mieux, cliquer à côté du curseur permet une modification fine (-1 ou +1) de la valeur de la composante. Cela permet de négliger la saisie des nombres: tout se fait facilement à la souris, d'autant plus que la boîte affiche également la notation hexadécimale pour chaque composante. [Ajouter un bouton de retour à la valeur par défaut]
#! /usr/bin/python3 import tkinter def couleurs(dummy): # ce qui se passe à chaque mouvement de curseur rouge =int(ech1.get()) vert =int(ech2.get()) bleu =int(ech3.get()) echelle1.config(troughcolor ="#%02x0000" %(rouge)) tlb1.config(text =" R: #%02X %03d " %(rouge, rouge), font ="monospace") echelle2.config(troughcolor ="#00%02x00" %(vert)) tlb2.config(text =" V: #%02X %03d " %(vert, vert), font ="monospace") echelle3.config(troughcolor ="#0000%02x" %(bleu)) tlb3.config(text =" B: #%02X %03d " %(bleu, bleu), font ="monospace") bouton0.config(bg ="#%02x%02x%02x" %(rouge, vert, bleu)) can0.config(bg ="#%02x%02x%02x" %(rouge, vert, bleu)) def top(): # définition de la boîte de sélection de couleurs global tlb1, tlb2, tlb3, ech1, ech2, ech3, echelle1, echelle2, echelle3, can0 fenetre0 =tkinter.Toplevel() fenetre0.title("Sélecteur de couleurs") can0 =tkinter.Canvas(fenetre0, width =67, height =67, bg ="#808080") can0.pack(side =tkinter.LEFT) tlf1 =tkinter.Frame(fenetre0) tlb1 =tkinter.Label(tlf1, text =" R: 80 128 ") tlb1.pack(side =tkinter.LEFT) ech1 =tkinter.IntVar(); ech1.set(128) echelle1 =tkinter.Scale(tlf1, variable =ech1, from_ =0, to =255, length =275, orient =tkinter.HORIZONTAL, troughcolor ="#808080", showvalue =0) echelle1.pack(side =tkinter.LEFT) tlf1.pack() tlf2 =tkinter.Frame(fenetre0) tlb2 =tkinter.Label(tlf2, text =" V: 80 128 ") tlb2.pack(side =tkinter.LEFT) ech2 =tkinter.IntVar(); ech2.set(128) echelle2 =tkinter.Scale(tlf2, variable =ech2, from_ =0, to =255, length =275, orient =tkinter.HORIZONTAL, troughcolor ="#808080", showvalue =0) echelle2.pack(side =tkinter.LEFT) tlf2.pack() tlf3 =tkinter.Frame(fenetre0) tlb3 =tkinter.Label(tlf3, text =" B: 80 128 ") tlb3.pack(side =tkinter.LEFT) ech3 =tkinter.IntVar(); ech3.set(128) echelle3 =tkinter.Scale(tlf3, variable =ech3, from_ =0, to =255, length =275, orient =tkinter.HORIZONTAL, troughcolor ="#808080", showvalue =0) echelle3.pack(side =tkinter.LEFT) tlf3.pack() echelle1.config(command =couleurs) # on ne peut appeler couleurs() echelle2.config(command =couleurs) # que lorsque que ech1, ech2 echelle3.config(command =couleurs) # et ech3 ont été initialisés racine0 =tkinter.Tk() # boucle principale, ouvrant une fenêtre avec un bouton racine0.title("Principale") bouton0 =tkinter.Button(text ="Sélecteur", bg ="#ffffff", command =top) bouton0.pack() racine0.mainloop()
↑ Dessiner un cercle à partir de son rayon
tkinter: image
Réécrit en python3, avec utilisation de l'objet bytes comme données.
#! /usr/bin/python3 import tkinter rayon0 =int(input("rayon: ")) # en python3, input() renvoie une chaîne diametre0 =rayon0 *2 +1 matrice0 =[255] *diametre0 **2 diam0 =str(diametre0) # chaîne reprenant l'information sur le diamètre data0 ="P5 %s %s 255\n" %(diam0, diam0) # entête du fichier PNM lisible par tkinter data0 =bytes(data0, "latin-1") def sauver(): global rayon0, data0 han =open("rayon" +str(rayon0) +".pnm","wb") han.write(data0) han.close() for i in range(diametre0): for j in range(diametre0): offset0 =i *diametre0 +j if round(((i-rayon0) **2 +(j -rayon0) **2) **.5) ==rayon0: # Pythagore matrice0[offset0] =0 # pixel noir data0 +=bytes(matrice0) # transforme la matrice de caractères en un tableau d'octets racine0 =tkinter.Tk() image0 =tkinter.PhotoImage(data =data0) lg0 =image0.width(); ht0 =image0.height(); canevas0 =tkinter.Canvas(racine0) fond0 =tkinter.Canvas(racine0, bg ='gray') fond0.create_image(lg0 //2 +1, ht0 //2 +1, image =image0) # image a centrer fond0.pack() bouton0 =tkinter.Button(racine0, text ="Sauver", command =sauver) bouton0.pack() racine0.mainloop()
Python2, pour mémoire
- #! /usr/bin/python -Qnew pour la division réelle
- # -*- coding: latin-1 -*- parce que la chaîne qui contient les données de l'image peut contenir des caractères dont le code est supérieur à 127