Édition du: 31/07/2025 |
Faites
un double-clic pour un retour en haut de
page
PROGRAMMATION PYTHON – DESSINS avec Tkinter Page de familiarisation avec
le logiciel de dessin Tkinter (Tool kit interface), la bibliothèque graphique
permettant la création de graphiques. Ce logiciel est inclus de
base avec Python. Ce logiciel utilise le terme
widget pour nommer les éléments
constitutifs d'un dessin: boutons, jauges, menu déroulants, etc. Avec ou sans ces widgets, il
est possible de créer les formes habituelles comme les segments, les
rectangles, les cercles, etc. |
||
|
Sommaire de cette page >>>
Widgets >>>
Taille >>>
Mes premiers dessins >>>
Classiques fils tendus >>>
Polygones centrés à la demande >>>
Simulation de percolation de bulles |
Débutants Glossaire |
Voir absolument Mon espace de travail en
Python
Liste des principaux widgets
Exemples |
Référence List of Tkinker
Widgets – With examples – CodersLegacy (avec exemples de codes)
Voir Application
au dessin du polygone / Application à la percolation de
bulles
Mes premiers
pas |
|||
Maitrise de la fenêtre de travail Obligatoire sinon rien ne s'affiche |
import tkinter as tk fenetre = tk.Tk() # Crée une fenêtre principale fenetre.title("Ma première fenêtre Tkinter") label = tk.Label(fenetre, text="Hello, Tkinter", fg="white", bg="black", width=10, height=10) label.pack() # Affiche le Label dans la fenêtre fenetre.mainloop() # Lance la boucle
principale |
||
Explications |
|
|
|
Note: Tous les
codes (programmes) sont directement copiables dans Python
import tkinter as tk root = tk.Tk() root.geometry("800x600") # Taille de la fenêtre root.maxsize(800, 600) # Taille maximale canvas = tk.Canvas(root, width=800, height=600, bg="white") canvas.pack() root.mainloop() |
from tkinter import * fen = Tk() canvas = Canvas(fen, width=300, height=200, bg="white") canvas.pack() canvas.create_rectangle(10, 10, 150, 100, fill="skyblue") canvas.create_oval(100, 50, 240, 130, fill="orange") canvas.create_line(100, 100, 200, 200, fill="red", width=2) canvas.create_text(150, 180, text="Hello Nathan !", font=("Arial", 14)) fen.mainloop() from tkinter import * root = Tk() C = Canvas(root, bg="yellow", height=250, width=300) line = C.create_line(108, 120, 320, 40,fill="green") arc = C.create_arc(180, 150, 80,210, start=0, extent=220, fill="red") oval = C.create_oval(80, 30, 140,150, fill="blue") C.pack() mainloop() |
from tkinter import * fen = Tk() canvas = Canvas(fen, width=400, height=400, bg="white") canvas.pack() # Nombre de fils n = 40 # Dessin des fils tendus
dans un carré for i in range(n + 1): x = i * 400 / n canvas.create_line(0, x, x, 400, fill="blue") canvas.create_line(x, 0, 400, x, fill="blue") fen.mainloop() from tkinter import * import math fen = Tk() canvas = Canvas(fen, width=400, height=400, bg="white") canvas.pack() # Centre et rayon cx, cy, r = 200, 200, 180 points = 150 # Calcul des points sur le
cercle coords = [] for i in range(points): angle = 2 * math.pi * i / points x = cx + r * math.cos(angle) y = cy + r * math.sin(angle) coords.append((x, y)) # Relier les points avec
des fils tendus for i in range(points): canvas.create_line(coords[i], coords[(i * 2) % points], fill="purple") fen.mainloop() |
import tkinter as tk import math # Fonction pour dessiner un polygone centré def dessiner_polygone(): if effacer_var.get():
canvas.delete("all") # Efface les
anciens dessins k = int(cote_scale.get())
epaisseur = int(epaisseur_scale.get())
couleur_trait =
couleur_trait_var.get()
couleur_remplissage =
couleur_remplissage_var.get() if
remplissage_var.get() else "" w = canvas.winfo_width() h = canvas.winfo_height() rayon = min(w, h) // 2 - 20 cx, cy = w // 2, h // 2 points = [] for i in range(k):
angle = 2 * math.pi * i / k x = cx + rayon * math.cos(angle) y = cy + rayon * math.sin(angle)
points.append((x, y)) canvas.create_polygon(points, outline=couleur_trait, fill=couleur_remplissage, width=epaisseur) # Interface graphique fen = tk.Tk() fen.title("Polygone régulier interactif") # Canvas canvas = tk.Canvas(fen, width=400, height=400, bg="white") canvas.grid(row=0, column=0, columnspan=4, padx=10, pady=10) # Curseur pour k côtés tk.Label(fen, text="Nombre de côtés").grid(row=1, column=0) cote_scale = tk.Scale(fen, from_=3, to=20, orient="horizontal") cote_scale.set(5) cote_scale.grid(row=1, column=1) # Curseur épaisseur tk.Label(fen, text="Épaisseur").grid(row=2, column=0) epaisseur_scale = tk.Scale(fen, from_=1, to=10, orient="horizontal") epaisseur_scale.set(3) epaisseur_scale.grid(row=2, column=1) # Liste couleur trait tk.Label(fen, text="Couleur du trait").grid(row=1, column=2) couleur_trait_var = tk.StringVar() couleur_trait_menu = tk.OptionMenu(fen,
couleur_trait_var, "black", "red", "blue", "green", "orange") couleur_trait_var.set("black") couleur_trait_menu.grid(row=1, column=3) # Liste couleur remplissage tk.Label(fen, text="Couleur de remplissage").grid(row=2, column=2) couleur_remplissage_var = tk.StringVar() couleur_remplissage_menu = tk.OptionMenu(fen,
couleur_remplissage_var, "white", "red", "blue", "green", "yellow") couleur_remplissage_var.set("white") couleur_remplissage_menu.grid(row=2, column=3) # Cases à cocher remplissage_var = tk.BooleanVar() effacer_var = tk.BooleanVar() tk.Checkbutton(fen, text="Remplir le polygone", variable=remplissage_var).grid(row=3, column=0, columnspan=2) tk.Checkbutton(fen, text="Effacer avant tracé", variable=effacer_var).grid(row=3, column=2, columnspan=2) # Bouton tracer tk.Button(fen, text="Tracer le polygone", command=dessiner_polygone).grid(row=4, column=0, columnspan=4, pady=10) fen.mainloop() |
import tkinter as tk import random import math class BubbleSimulator: def __init__(self, master): self.master = master self.master.title("Simulation de percolation de bulles") self.width = 600 self.height = 600 self.line_thickness = 10 # Canvas et
ligne bleue self.canvas = tk.Canvas(master, width=self.width, height=self.height, bg="white") self.canvas.pack(fill="both", expand=True) self.canvas.create_rectangle( 0,
self.height - self.line_thickness,
self.width,
self.height, fill="blue", outline="" ) # Panneau de
contrôle ctrl
= tk.Frame(master) ctrl.pack(fill="x", pady=5) # Taille de
la bulle tk.Label(ctrl, text="Taille
de la bulle").pack(side="left", padx=5) self.size_scale = tk.Scale(ctrl, from_=2, to=30, orient="horizontal") self.size_scale.set(7) self.size_scale.pack(side="left") # Vitesse de
la descente tk.Label(ctrl, text="Vitesse").pack(side="left", padx=5) self.speed_scale = tk.Scale(ctrl, from_=100, to=500, orient="horizontal") self.speed_scale.set(300) self.speed_scale.pack(side="left") # Afficher la
descente ou non self.show_descent = tk.BooleanVar(value=True) tk.Checkbutton(
ctrl,
text="Afficher
descente",
variable=self.show_descent ).pack(side="left", padx=10) # Choix de la
couleur tk.Label(ctrl, text="Couleur:").pack(side="left", padx=5) self.color_choice = tk.StringVar(value="Bleu")
options = ["Noir", "Bleu", "Rouge", "Vert", "Aléatoire"] tk.OptionMenu(ctrl, self.color_choice, *options).pack(side="left") # Bulles
fixées self.fixed_bubbles = [] self.current = None # Lancement self.new_bubble() def new_bubble(self): r = self.size_scale.get() x = random.randint(r, self.width - r) # Si elle
intersecte d'emblée une bulle figée → fin for fx, fy, fr in self.fixed_bubbles: if math.hypot(x - fx, r - fy) < (r + fr):
self.master.quit()
return # Calcul de
la position finale sans affichage pas-à-pas
final_y = self.find_final_y(x, r) #
Détermination de la couleur selon le choix
choice = self.color_choice.get() if choice == "Aléatoire":
color = random.choice(["black", "blue", "red", "green"]) else:
mapping = {"Noir": "black", "Bleu": "blue", "Rouge": "red", "Vert": "green"}
color = mapping[choice] # Pas
d'animation : placement direct if not self.show_descent.get():
oid = self.canvas.create_oval(
x - r, final_y - r,
x + r, final_y + r,
fill=color, outline="" )
self.fixed_bubbles.append((x, final_y, r))
self.master.after(200, self.new_bubble) return # Affichage
des 10 derniers pas seulement start_y
= max(r, final_y - 10) oid = self.canvas.create_oval(
x - r, start_y - r,
x + r, start_y + r,
fill=color, outline="" ) self.current = { "id": oid, "x": x, "y": start_y, "r": r, "final_y": final_y, "color": color } self.animate() def find_final_y(self, x, r): y = r while True:
new_y = y + 1 # collision avec
la ligne bleue if new_y + r >= self.height - self.line_thickness:
return y # collision
avec bulles figées for fx, fy, fr in self.fixed_bubbles:
if math.hypot(x - fx, new_y - fy) < (r + fr):
return y
y = new_y def animate(self): b = self.current if not b: return
delay = max(2, int(50 / self.speed_scale.get())) if b["y"] < b["final_y"]: # déplacement
d'1 px
self.canvas.move(b["id"], 0, 1)
b["y"] += 1
self.master.after(delay, self.animate) else:
self.stop_bubble() def stop_bubble(self): b = self.current x, r = b["x"], b["r"]
final_y = b["final_y"] #
repositionnement exact self.canvas.coords(
b["id"],
x - r, final_y - r,
x + r, final_y + r ) # figer la
bulle self.fixed_bubbles.append((x, final_y, r)) self.current = None self.master.after(20, self.new_bubble) if __name__ == "__main__": root = tk.Tk() app = BubbleSimulator(root) root.mainloop() |
Voir Cette même simulation avec Scratch
Voir Dessin de la fractale de
Mandelbrot avec Tkinter
Retour |
|
Suite |
|
Voir |
|
Sites |
|
Cette page |