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:

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