site sans réclame PythonCont@ctS'abonner

Recettes Python / Tkinter

L

E 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 2.7/3.2 et Tkinter 8.5.

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

# -*- coding: utf-8 -*-
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
#! /usr/bin/python -Qnew
# -*- coding: utf-8 -*-

import Tkinter

rayon0=input("rayon: ")
diametre0=rayon0*2+1
matrice0=[chr(255)]*diametre0**2
diam0=str(diametre0) # chaine reprenant l'information sur le diametre
data0="P5 %s %s 255\n" %(diam0, diam0) # entete du fichier

def sauver():
  global rayon0, data0
  han=open("rayon"+str(rayon0)+".pnm","w")
  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]=chr(0) # pixel noir
data0+="".join(matrice0) # transforme la matrice de caractères en une chaîne

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()