polygone, cercle, animation

Un mur de briques.

Écrire un script python créant l'image d'un mur de briques.

mur de briques


import tkinter 
import random as rd



# fenêtre principale
fenetre = tkinter.Tk()
# dimensions de l'écran :  
ll = fenetre.winfo_screenwidth() 
hh = fenetre.winfo_screenheight() 
# canvas prenant toute la fenêtre :
canevas = tkinter.Canvas(fenetre, width = ll, height = hh)
canevas.pack()



 

def mur(zone,lb,hb) :
    """
    le paramètre zone est de type canvas.
    lb : largeur d'une brique
    hb : hauteur d'une brique
    """
    largeur = zone.winfo_reqwidth() # largeur du canvas zone
    hauteur = zone.winfo_reqheight()  # hauteur du canvas zone
    
    for y in range(0, hauteur, 2*hb) :
        for x in range(0, largeur, lb) :
            zone.create_rectangle(x,y, x+lb,y+hb, fill = 'orange', outline = 'grey' , width=4)
            zone.create_rectangle(x-lb/2,y+hb, x-lb/2+lb,y+hb+hb, fill = 'orange', outline = 'grey' , width=4)
    


mur(canevas,40,15) 
fenetre.mainloop() 

Vaporisateur.

Écrire un script python créant l'image d'un jet de vaporisateur.

vaporisation


import tkinter 
import random as rd
 


# fenêtre principale
fenetre = tkinter.Tk()
# canvas   :
canevas = tkinter.Canvas(fenetre, width = 800, height = 300,background='white')
canevas.pack()



 

def vaporisateur(zone=canevas,nbparticules=1000, r=2) :
    """
    le paramètre zone est de type canvas.
    nbparticules : nombre de 'particules' visibles sortant du vaporisateur
    r est approximativement le rayon des particules
    """
    largeur = zone.winfo_reqwidth() # largeur du canvas zone
    hauteur = zone.winfo_reqheight()  # hauteur du canvas zone
    repartition = 0
    
    for i in range(nbparticules) :
        cx = i*largeur/nbparticules
        cy = (hauteur/2) + rd.random()*repartition -repartition/2 
        zone.create_oval(cx,cy, cx+r, cy+r,fill='grey'  )
        repartition += 0.1
         
     
     
while True :
    vaporisateur()
    fenetre.update()
    canevas.delete(tkinter.ALL)
     
    
fenetre.mainloop() 

Balade autour d'un rectangle.

Écrire un script python affichant un grand rectangle et un petit carré 'animé' parcourant le tour du grand rectangle.

animation


import time
import tkinter


# fenêtre tkinter
# dans laquelle on peut placer canevas, boutons...
fenetre = tkinter.Tk()

# ouverture d'un canevas sur fond blanc
canevas =  tkinter.Canvas(fenetre, width = 420, height = 420)
canevas.configure(bg = "white")
canevas.pack()

# création d'un bouton de 'sortie'
bouton = tkinter.Button(fenetre, text = 'Quitter',  command=fenetre.destroy )
bouton.pack()


# création des deux figures essentielles du script 
gdrectangle = canevas.create_rectangle(10,10,400,400, outline = 'yellow', width = 4)
ptrectangle = canevas.create_rectangle(6,5,16, 15, fill = 'red')


# déplacements successifs : 
while True :
    for i in range(390) :
        canevas.move(ptrectangle, 1,0)
        fenetre.update()
        time.sleep(0.01)
    for i in range(390) :
        canevas.move(ptrectangle, 0,1)
        fenetre.update()
        time.sleep(0.01)
    for i in range(390) :
        canevas.move(ptrectangle, -1,0)
        fenetre.update()
        time.sleep(0.01)
    for i in range(390) :
        canevas.move(ptrectangle, 0,-1)
        fenetre.update()
        time.sleep(0.01)

fenetre.mainloop()

Et en évitant l'utilisation du module time ainsi qu'un while True :


import tkinter

# fenêtre tkinter
# dans laquelle on peut placer canevas, boutons...
fenetre = tkinter.Tk()

# ouverture d'un canevas sur fond blanc
canevas =  tkinter.Canvas(fenetre, width = 420, height = 420)
canevas.configure(bg = "white")
canevas.pack()

# création d'un bouton de 'sortie'
bouton = tkinter.Button(fenetre, text = 'Quitter',  command=fenetre.destroy )
bouton.pack()


# création des deux figures essentielles du script 
gdrectangle = canevas.create_rectangle(10,10,400,400, outline = 'yellow', width = 4)
ptrectangle = canevas.create_rectangle(6,5,16, 15, fill = 'red')


def parcoursSegment(dx,dy) :
    for i in range(390) :
        canevas.move(ptrectangle, dx,dy)
        fenetre.after(3,fenetre.update_idletasks())  # temps de 3ms puis réaffichage fenêtre
    

def unTour() :
    parcoursSegment(1,0)
    parcoursSegment(0,1)
    parcoursSegment(-1,0)
    parcoursSegment(0,-1)
    fenetre.after(1, unTour) # temps d' 1ms puis relance de la fonction
    
 
fenetre.after(1, unTour)
fenetre.mainloop()

Déplacement au clavier .

Chercher sur le web le fonctionnement de la commande bind_all de tkinter.

Puis ouvrir une fenêtre dans laquelle vous pourrez déplacer un petit carré à l'aide des flèches du clavier (pour monter, descendre, aller à gauche ou à droite) et des touches d et m (pour descendre en diagonale ou monter en diagonale).

Il s'agit d'exécuter une fonction à l'appui sur une touche. Rappelons que bind signifie lier, attacher en anglais.
Une solution possible.

import tkinter

def monter_carre(evenement) :
    canevas.move(carre, 0,-5)
    
def descendre_carre(evenement) :
    canevas.move(carre, 0,5)
    
def pousser_a_gauche_carre(evenement):
    canevas.move(carre, -5,0)
    
def pousser_a_droite_carre(evenement):
    canevas.move(carre, 5,0)
     
def descend_diago_carre(evenement) :
    canevas.move(carre, 5,5)
    
def monte_diago_carre(evenement) :
    canevas.move(carre, -5,-5)

# fenêtre tkinter
# dans laquelle on peut placer canevas, boutons...
fenetre = tkinter.Tk()

# ouverture d'un canevas sur fond blanc
canevas =  tkinter.Canvas(fenetre, width = 420, height = 420)
canevas.configure(bg = "white")
canevas.pack()

# création d'un bouton de 'sortie'
bouton = tkinter.Button(fenetre, text = 'Quitter',  command=fenetre.destroy )
bouton.pack()


# création du petit carré :
carre = canevas.create_rectangle(12,5, 22, 15, fill = 'red')

canevas.bind_all('<KeyPress-Up>', monter_carre)
canevas.bind_all('<KeyPress-Down>', descendre_carre)
canevas.bind_all('<KeyPress-Left>', pousser_a_gauche_carre)
canevas.bind_all('<KeyPress-Right>', pousser_a_droite_carre)
canevas.bind_all('<KeyPress-m>', monte_diago_carre)
canevas.bind_all('<KeyPress-d>', descend_diago_carre)

fenetre.mainloop() 

Repérer des couleurs.

Pour les bases d'un jeu pour enfants (apprendre les couleurs), on souhaite afficher un canevas de 4 carrés de couleurs distinctes. Lorsque la souris se déplace dans le carré vert, le message 'vert' s'affiche, lorsqu'elle est dans le carré rouge, c'est bien entendu le message 'rouge' qui s'affiche...

fenetre étant initialisée par fenetre = tkinter.Tk(), vous commencerez par rechercher sur le web le rôle de l'instruction fenetre.bind('<Motion>', nomFonction ) (où nomFonction désigne le nom d'une fonction définie dans le programme).

Dans cette première version, les affichages se font dans le terminal :


import tkinter as tk
fenetre = tk.Tk()

 

def affiche(event) :

    # on récupère les coordonnées du pointeur souris
    # event est l'événement déclencheur, c'est à dire ici un déplacement de souris 
    # dans le canevas
    x, y = event.x, event.y
    
    # on affiche la couleur désignée :
    if x < cote :
        if y < cote : print('rouge')
        else : print('jaune')
    else :
        if y < cote : print('vert')
        else : print('bleu')
        
    # temps d'attente de 1 s :
    fenetre.after(1000)
    
    
    

# constante pour le côté d'un carré
cote = 100

# création d'un canevas :    
canevas = tk.Canvas(fenetre, width = 2*cote , height = 2*cote, background ='white')
canevas.pack(side =tk.TOP, padx =0, pady =0)  

# création de 4 carrés dans le canevas
canevas.create_rectangle(0, 0, cote, cote, fill='red' )  
canevas.create_rectangle(cote, 0, 2*cote, cote, fill='green' ) 
canevas.create_rectangle(0, cote, cote, 2*cote, fill='yellow' )  
canevas.create_rectangle(cote, cote, 2*cote, 2*cote, fill='blue' ) 


# on lie la fonction 'affiche' à l'événement  déplacement de souris :
canevas.bind('<Motion>', affiche)
# la boucle événementielle :
fenetre.mainloop()

Dans cette seconde version, on écrit dans le canevas lui-même plutôt que dans le terminal :

  
import tkinter as tk
fenetre = tk.Tk()
 
 

def affiche(event) :

    # on récupère les coordonnées du pointeur souris
    # event est l'événement déclencheur, c'est à dire ici un déplacement de souris 
    # dans le canevas
    x, y = event.x, event.y
    
    # on affiche la couleur désignée :
    if x < cote :
        if y < cote : 
            canevas.itemconfigure(texte, text = 'rouge', fill='red')
        else : 
            canevas.itemconfigure(texte, text = 'jaune', fill='orange')
    else :
        if y < cote : 
            canevas.itemconfigure(texte, text = 'vert',fill='green')
        else :
            canevas.itemconfigure(texte, text = 'bleu',fill='blue')
        
     
    
    
    

# constante pour le côté d'un carré
cote = 100

# création d'un canevas :    
canevas = tk.Canvas(fenetre, width = 2*cote , height = 2.5*cote, background ='white')
canevas.pack(side =tk.TOP, padx =0, pady =0)  

# création de 4 carrés dans le canevas
canevas.create_rectangle(0, 0, cote, cote, fill='red' )  
canevas.create_rectangle(cote, 0, 2*cote, cote, fill='green' ) 
canevas.create_rectangle(0, cote, cote, 2*cote, fill='yellow' )  
canevas.create_rectangle(cote, cote, 2*cote, 2*cote, fill='blue' ) 
# creation de texte dans le canevas :
texte = canevas.create_text(cote, 2*cote+cote//3, text = "",font = ('Times',20), anchor = 'center')

# on lie la fonction 'affiche' à l'événement  déplacement de souris :
canevas.bind('<Motion>', affiche)
# la boucle événementielle :
fenetre.mainloop()