Accueil

Orientation générale

Barre de recherche

DicoNombre

DicoMot Math

DicoCulture

Atlas des maths

Rubriques

Index alphabétique

Nouveautés

Actualités

Références

Édition du: 31/07/2025

M'écrire

Brèves de Maths

 

INDEX

 

Python

 

Programmation

Informatique

Multimédia

Ordinateur

Python – Comment se lancer et initiation

INITIATION

BASES

MATHS

Symbolisme

Affichage

Caractères

Glossaire

Techniques

Graphes Plot

Importations

Listes et ensembles

Dessins - Tortue

Dessins – Tkinter

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

Programmation

 

Glossaire

Informatique

Algorithme

Voir absolument  Mon espace de travail en Python

 

 

Widgets

haut

 

Liste des principaux widgets

*      Button : bouton cliquable pour exécuter une commande

*      Canvas : zone de dessin pour formes, images, etc.

*      Checkbutton : case à cocher

*      Entry : champ de saisie sur une seule ligne

*      Frame : conteneur pour organiser d'autres widgets

*      Label : affiche du texte ou une image

*      LabelFrame : cadre avec légende pour regrouper des widgets

*      Listbox : liste déroulante d'options

*      Menu / Menubutton : menus déroulants

*      PanedWindow : conteneur avec volets ajustables

*      Radiobutton : bouton radio (sélection unique)

*      Scale : curseur (jauge) pour sélectionner une valeur

*      Scrollbar : barre de défilement

*      Spinbox : champ de saisie avec valeurs prédéfinies

*      Text : zone de texte multiligne

*      Toplevel : fenêtre indépendante

 

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

haut

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

*      tk.Tk() : crée une fenêtre principale

*      label.pack() : c’est obligatoire pour que l’objet Label soit affiché

*    mainloop() : lance l’application, sinon la fenêtre ne s’ouvre jamais

Note: Tous les codes (programmes) sont directement copiables dans Python

 

 

Fenêtre de taille maximale

haut

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

 

 

 

Mes premiers dessins

haut

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

 

 

 

Classiques fils tendus

haut

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

 

 

 

Polygones centrés à la demande (Widgets)

haut

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

 

 

 

Simulation de percolation de bulles

haut

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

*      Python – Ce qu'il faut absolument comprendre avant de se lancer

*      Dessin avec la Tortue

Suite

*      Tour d'horizon avec l'exemple des palindromes

*      Les classiques – Factorielle, Fibonacci …

*      Comment obtenir plus de chiffres significatifs

*      Mes premiers dessins

Voir

*      Scratch – Apprendre à programmer simplement

*      Maple – Apprendre à programmer (maths)

*      Historique de l’aventure informatique

Sites

*      Le module Matplotlib – P Delva

*      Matplotlib 3.10.3 documentation – matplotlib – Toutes les commandes sur une figure; tous les types de tracés, etc.

*      Basic plotting with Matplotlib - Lancaster

*      Matplotlib – Quick start guide

Cette page

http://villemin.gerard.free.fr/aInforma/PYTHON/DessinT.htm