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é.

Cette page suit les recommandations de 1990 pour une orthographe réformée.

É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:

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