Exemples de codes Python

Un copier coller du code (sur fond blanc) dans l'IDLE, sauvé avec l'extension ".py" affichera le code en couleur.

° ex_II07a_if_elif_else.py
L'instruction if ... elif ... else
° ex_II08a_Punition_ringarde.py
Recopie simplement 100 fois le même texte.
° ex_II09a_Nombre_secret.py
Pretit programme qui demande de trouver par essais successifs un nombre carché par l'ordinateur.
° ex_II10a_Affiche_livret.py
Affiche le livret d'un nombre introdit par l'utilisateur.
° ex_III01a_Break.py
Exemple d'utilisation de l'instruction "break"
° ex_III02a_Table_multiplication.py
Affiche la table de multiplication de 1 fois 1 à 11 fois 11.
° ex_III03a_Tant_que_Tant_que_Tant_que.py
Exemple d'imbrication de 3 instructions while l'un dans l'autre.
° ex_III04a_Equ_2e_degre.py
Donne les solutions réelles d'une équation du second degré
° ex_III05a_Jeu_de_Nim.py
Jeu de Nim à deux joueurs. D'un tas d'allumettes, il faut en enlever chacun son tour...
° ex_III05b_Jeu_de_Nim.py
Jeu de Nim à deux joueurs. D'un tas d'allumettes, il faut en enlever chacun son tour...
Variante, où un joueur n'a pas le droit de prendre le même nombre d'allumettes que précédent.
° ex_III06a_Devine_mon_nombre.py
Un joueur doit deviner le nombre caché par l'ordinateur. Utilisation de la librairie random
Solution avec le bonus à la fin.
° ex_IV01a_Rebonds_ball.py
Simulation de rebonds d'une balle, avec perte d'énergie à chaque rebond.
° ex_IV02a_Test_nombre_premier.py
Test si un nombre donné par l'utilisateur est un nombre premier.
° ex_IV03a_Jeu_de_memory.py
Un joueur doit mémoriser une suite de nombre et les écrire ensuite.
° ex_V04a_Cherche_un_caractere.py
Compte le nombre de "e" dans une chaîne de caractères.
° ex_V06a_Compte_nombre_e.py
Compte le nombre de "e" dans une chaîne de caractères, en utilisant une boucle "for".
° ex_V07a_Insert_des_etoiles.py
Insert une étoile entre chaque lettre d'une chaîne de caractères.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
° ex_V08a_Inverse_une_chaine_de_caracteres.py
Inverse l'ordre des caractères d'une chaîne entrée par l'utilisateur.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
° ex_V09a_Test_palindrome.py
Test si une chaîne entrée par l'utilisateur est un palindrome.
Un palindrome est une chaîne qui est identique à la chaîne inversée.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
° ex_V90a_Jeu_de_de.py
Jeu de dé à deux joueurs.
Avec des couleurs à l'affichage.
° ex_VI01a_Testons_livret_de_7.py
Un exemple simple de fonction, sans paramètre.
° ex_VI01b_Testons_livret.py
Un exemple de fonction, avec un paramètre.
° ex_VI02a_Fonction_avec_plusieurs_parametres.py
Un exemple de fonction avec plusieurs paramètres.
° ex_VI03a_Les_parametres_facultatifs_d_une_fonction.py
Un exemple de fonction avec des paramètres facultatifs.
° ex_VI04a_Testons_une_variable_est_elle_la_meme_que_dans_la_boucle.py
Notion de variable locale et de variable globale
° ex_VI04b_Testons_une_variable_est_elle_la_meme_que_dans_la_boucle.py
Notion de variable locale et de variable globale
° ex_VI06a_Fonction_retournant_une_chaine.py
Exemple de fonction retournant une chaine de caractères.
° ex_VI07a_Fonction_retournant_un_livret_dans_une_chaine.py
Exemple de fonction retournant une chaine de caractères.
Montre également un traitement d'exception try: ... except:
° ex_VI08a_Fonction_retournant_un_reel.py
Exemple de fonction retournant un nombre réel (type float).
° ex_VI09a_Fonction_maximum.py
Fonction qui retourne le maximum de 3 nombres.
° ex_VI10a_Compter_une_occurence.py
Compte combien de fois un caractère apparaît dans une chaîne donnée
° ex_VI12a_Compter_les_mots.py
Fonction qui retourne le nombre de mots contenu dans une phrase.
Deux exemples de fonctions sont donnés.
° ex_VI13a_serie_approcher_pi_sur_2.py
Voici un code utilisant une fonction, pour approcher le nombre pi/2

° ex_VII01a_turtle_carre.py
À l'aide du module "turtle", dessine un carré de taille et de couleur choisie.
° ex_VII02a_turtle_defi_1.py
À l'aide du module "turtle", dessine un carré de taille, de couleur et d'orientation choisies, dessine un triangle de taille, de couleur et d'orientation choisies.
° ex_VII03a_turtle_defi_2.py
À l'aide du module "turtle", dessine un carré de taille, de couleur et d'orientation choisies, dessine un triangle de taille, de couleur et d'orientation choisies, dessine une étoile à 5 branches de taille, de couleur et d'orientation choisies.
° ex_VII04a_turtle_defi_3.py
À l'aide du module "turtle", dessine un carré de taille, de couleur et d'orientation choisies, dessine un triangle de taille, de couleur et d'orientation choisies, dessine une étoile à 5 branches de taille, de couleur et d'orientation choisies, dessine une étoile à 6 branches de taille, de couleur et d'orientation choisies.
° serie12_act_2.py
À l'aide du module "turtle", dessine un flocon de Koch.

Pour les séries 11 et 12, référez-vous à la page consacrée au cours d'OC informatique de 3ème, 2018 - 2019.
La série 12 traite en particulier du segment de Koch et du flocon de Koch.
La série 11 sur la marche de l'ivrogne est facultative.

° ex_VIII01a_le_type_de_donnee_list.py
° ex_VIII02a_l_instruction_list.py
° ex_VIII03a_operation_sur_les_listes_de_nombres.py
° ex_VIII04a_operation_sur_les_listes.py
° ex_VIII05a_test_d_appartenance.py
° ex_VIII06a_elements_d_une_liste.py
° ex_VIII07a_modulo.py
° ex_VIII09a_fusion_organisee_de_listes.py
° ex_VIII10a_afficher_proprement.py
° ex_VIII11a_le_plus_grand_vaut.py
° ex_VIII12a_separer_en_divers_listes.py
° ex_VIII14a_le_plus_grand_est_place.py

° s01a_ex01_jeu_du_beseu.py
serie 1 ex 1, sur le jeu du beseu.
° s01a_ex02_compte_voyelles.py
serie 1 ex 2, compte le nombre de voyelles.
° s01a_ex03_fonction_a_deviner.py
serie 1 ex 3, une fonction à deviner.
° s01a_ex04_turtle_marche_aleatoire.py
serie 1 ex 4, avec le module "turtle", une marche aléatoire.
° s01a_ex05_automate_1d_non_commente.py
serie 1 ex 5, un automate cellulaire non commenté.
° s01a_ex05_automate_1d_commente.py
serie 1 ex 5, un automate cellulaire avec les commentaires.
° s01a_ex06_turtle_marche_aleatoire_multiple.py
serie 1 ex 6, avec le module "turtle" marches aléatoires multiple.

° ex_XXI00a_premiers_pas_avec_tkinter.py
Série XXI : Premiers pas avec tkinter. Exercice XXI.0 Jouons.
° ex_XXI00b_premiers_pas_avec_tkinter.py
Série XXI : Premiers pas avec tkinter. Exercice XXI.0 Jouons. Avec positionnement de la fenêtre.
° ex_XXI01a_trace_de_lignes_dans_un_canevas.py
Serie XXI, exercice 1, tracé de lignes dans un canevas.
° ex_XXI01b_trace_de_lignes_dans_un_canevas.py
Serie XXI, exercice 1, tracé de lignes dans un canevas. Avec quelques adjonctions.
° ex_XXI03a_trace_de_lignes_dans_un_canevas.py
Série XXI, exercice 3, tracé de lignes dans un canevas, horizontales et verticales.
° ex_XXI05a_lignes_avec_viseur.py
Série XXI, exercice 5, lignes avec un viseur.
° ex_XXI08a_deux_dessins.py
Dessin de deux figures assez complexes.
° ex_XXI09a_olympique.py
Dessin des anneaux olympiques
° ex_XXI09b_olympique.py
Dessin des anneaux olympiques, avec un bouton par anneaux.
Le code est plus court que le précédent !
° ex_XXI12a_Calculatrice.py
Une calculatrice minimaliste, très simple, pas visuel.
° ex_XXI13a_detection_souris.py
Détection de la position de la souris et des clics de la souris..
° ex_XXI14x_methode_grid.py
Exemple très court et simple de positionnement avec la méthode "grid".
° ex_XXI14y_methode_grid.py
Exemple d'utilisation de la méthode "grid" pour positionner des widgets.
Exemple d'insertion d'une image dans un canevas.
° ex_XXI14z_magie.py
Code de préparation à la semestrielle de décembre 2018.
Un petit tour de "Mathémagie", utilisant les Widgets "Label", "Entry" et "Button".
Lit des données depuis un champ "Entry" et écrit dans un tel champ.
Voir le cours d'OC informatique de 4ème, 2018 - 2019, pour l'énoncé du "tour de magie".
° ex_XXI15x_animation.py
Déplacement d'un disque, en fonction de boutons pressés.
° ex_XXI15a_deux_astres.py
Deux objets dans une fenêtre.
Avec 4 bouttons par objets, permet de déplacer chacun de ses objets.
En permanence la distance entre les objets sont affichés.
Introduction de plusieurs notions :
1) avec l'instruction 'labmda', appel depuis un bouton d'une fonction avec des paramètres.
2) adjonction d'un texte dans un canvas
3) modification du texte du canvas
4) calcul de la racine carrée (sqrt) d'un nombre et mise au carré (**)
5) formattage d'un nombre à firgule pour l'afficher avec deux chiffres après la virgule, c.f. https://pyformat.info/
° ex_XXI15b_deux_astres.py
Amélioration de : ex_XXI15a_deux_astres.py
° ex_XXI15c_deux_astres.py
On reprend ex_XXI15b_deux_astres.py
On rajoute la fonctionnalité teste, que lors de la pression sur le bouton pour faire descendre
la boule bleue, elle descent tand que l'on appuie sur le bouton
C'est une incursion dans l'animation automatique, qui est vu dans : ex_XXI25a_animation_automatique.py
c.f. Bouge_bas_bleu ... et
l'instruction : fen1.after(50, Bouge_bas_bleu)
° ex_XXI16a_moins_de_boutons.py
Comme : ex_XXI15b_deux_astres.py , dans lequel des boutons ont été remplacés par des clicks sur les boules.
On positionne les objets en les cliquant-glissant avec la souris.
° ex_XXI22a_avec_une_jolie_trace.py
On reprend le programme ex_XXI16a_Moins_de_boutons.py
Lorsque l'on déplace un objet, il laisse une trace.
On a aussi la possibilité d'effacer le dessin tracé.
° ex_XXI22b_avec_une_jolie_trace.py
On reprend le programme ex_XXI22a_avec_une_jolie_trace.py
Le canvas prend toute la taille de la fenêtre, moins la place pour les boutons.
Lorsque la fenêtre est redimensionnée, le canvas aussi et le texte est déplacé.
c.f. :
def Canvas_resise(event):
can1.bind("<Configure>", Canvas_resise) # Appel de la fonction au redimentionnement de la fenêtre.
can1.pack(side=LEFT, fill="both", expand=True) # insertion du canvas dans la fenêtre.
def Window_resise(event): Montre comment obtenir des informations sur la fenêtre et l'écran.
° ex_XXI25a_animation_automatique.py
Déplacement d'un disque, automatiquement, à l'aide d'un "timer" (minuteur).
° ex_XXI50b_Boutons_dans_canvas.py
Place des boutons dans un canvas.
Le canvas d'adapte à la taille de la fenêtre.
Les boutons restent positionnés en bas à droite de la fenêtre (du canvas).
° ex_XXX01a_Classe_vertebres.py
Le but de ce programme est d'illustrer la programmation objet sur la classe des vertébrés
et quelques classes descendantes plus particulières.
Structure des classes :
- classe des vertébrés.
- classe des mammifères
- classe des chiens
- classe des chats
° ex_XXX02a_Classe_figures.py
Le but de ce programme est d'illustrer la programmation objet sur la classe des figures géométriques
et quelques classes descendantes plus particulières.
Structure des classes :
- classe des Figures.
- classe des quadrilatères
- classe des rectangles




° test0010_color_text.py
Comment afficher du texte en couleur dans l'IDLE3 de python, sous Linux.
° test0020_color_escape_code.py
Dans un Terminal Linux, exemples de "escape code" pour changer de couleurs ou déplacer le curseur.



ex_II07a_if_elif_else.py   TOP
L'instruction if ... elif ... else
# ex_II07a_if_elif_else.py

n=int(input('Tapez un nombre: '))
if n>100: 
    print("Ce nombre est plus grand que 100. " )
elif n<10: 
    print("Ce nombre est plus petit que 10. " )
else: 
    print("Ce nombre est compris entre 10 et 100. " )

ex_II08a_Punition_ringarde.py   TOP
Recopie simplement 100 fois le même texte.
# ex_II08a_Punition_ringarde.py

punitionRingarde = " Je dois écrire 100 fois un texte inutile "
nn = 0

while (nn < 100):
    print(punitionRingarde)
    nn = nn + 1

ex_II09a_Nombre_secret.py   TOP
Pretit programme qui demande de trouver par essais successifs un nombre carché par l'ordinateur.
# ex_II09a_Nombre_secret.py
'''
Petit programme qui nous demande de trouver un nombre
entre 10 et 99, pas essai successifs.
'''

print ("Le nombre a trouvé est composé de 2 chiffres" )
print (" " )
nbSecret = 79
nbEssai = 0
while (nbEssai != nbSecret):
    nbEssai = int(input ("Quel est mon nombre ? " ))
    if nbEssai > nbSecret :
        print ("mon nombre est plus petit ! " )
    if nbEssai < nbSecret :
        print ("mon nombre est plus grand ! " )

print ("Bravo ! Tu as trouvé mon nombre ! " )

ex_II10a_Affiche_livret.py   TOP
Affiche le livret d'un nombre introdit par l'utilisateur.
# ex_II10a_Affiche_livret.py
'''
Affiche le livret d'un nombre introduit pas l'utilisateur
'''

nb = int(input ("Quel livret ? " ))
aa = 1
while (aa < 11): 
	print(str(nb) + " x " + str(aa) + " = " + str(nb * aa ) ) 
	aa += 1

ex_III01a_Break.py   TOP
Exemple d'utilisation de l'instruction "break"
# ex_III01a_Break.py
'''
Exemple d'utilisation de l'instruction "break"
'''

print ('Devinez le nombre qui se cache . . . ' )
while (1 < 2): 
    nn = int(input("Tapez un chiffre : "))
    if (nn == 3): 
        print ("OUI" )
        break
    else:
        print ("NON" )

ex_III02a_Table_multiplication.py   TOP
Affiche la table de multiplication de 1 fois 1 à 11 fois 11.
# ex_III02a_Table_multiplication.py
'''
Affichage d'une table de multiplication de 1x1 à 11x11
'''
aa = 1
bb = 1
while (aa < 12):
  print("\nla table de " , aa)  # \n correspond à un retour à la ligne
  while (bb < 12):
    print(aa , "x" , bb , "=" , aa*bb)
    bb += 1 # Ajoute 1 à bb
  bb = 1
  aa += 1 # Ajoute 1 à aa

ex_III03a_Tant_que_Tant_que_Tant_que.py   TOP
Exemple d'imbrication de 3 instructions while l'un dans l'autre.
# ex_III03a_Tant_que_Tant_que_Tant_que.py
'''
Trois while de suite, imbriqué l'un dans l'autre.
'''
nbSecret = 659
aa = bb = cc = 0

while (aa < 10):
  while (bb < 10):
    while (cc < 10):
      nbGenerer = 100 * aa + 10 * bb + cc
      #print(aa, bb, cc)
      if (nbGenerer == nbSecret):
        print("Bravo, vous avez réussi trouver le mot de passe ! ")
        print( nbGenerer )
      cc = cc + 1
    cc = 0
    bb += 1 # Ajoute 1 à bb
  bb = 0
  aa += 1

ex_III04a_Equ_2e_degre.py   TOP
Donne les solutions réelles d'une équation du second degré
# ex_III04a_Equ_2e_degre.py
'''
Donne les solutions réelles d'une équation du second degré
'''
print("résolveur d ’équations du 2ème degré : a xˆ2 + b x + c = 0 ")

aa = float( input( "que vaut le coefficient a ?" ) ) 
bb = float( input( "que vaut le coefficient b ?" ) ) 
cc = float( input( "que vaut le coefficient c ?" ) ) 

delta = bb**2 - 4*aa*cc

if (delta < 0):
    print( "Il n’existe pas de solution réelle ! " )
elif (delta == 0):
    xx = -bb / (2* aa )
    print( "La solution est : " + str(xx) )

else:
    x1 = (-bb + delta **0.5) / (2 * aa )
    x2 = (-bb - delta **0.5) / (2 * aa )
    print( " les solutions sont : " + str( x1) + " et " + str( x2) )

ex_III05a_Jeu_de_Nim.py   TOP
Jeu de Nim à deux joueurs. D'un tas d'allumettes, il faut en enlever chacun son tour...
# ex_III05a_Jeu_de_Nim.py
'''
Jeu de Nim,
Il y a deux joueurs.
Un tas commence avec 30 allumettes.
Chacun à leur tour, un joueur doit enlever 1, 2 ou 3 allumettes du tas.
Celui qui pend la dernière allumette a perdu.
La stratégie gagnante est simple.
Une variante est d'interdire de prendre le même nombre d'allumettes
que le joueur précédent.
'''
nb_allumettes = 30

joueur1 = input( ' Quel est ton nom joueur 1 ? ' )
joueur2 = input( ' Quel est ton nom joueur 2 ? ' )

while ( nb_allumettes > 0) :
    print ( '−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−' )
    print ( ' Information : Il reste ', nb_allumettes, 'allumettes.' )
    print ( '−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−' )

    nb_enleve = 4
    while( (nb_enleve > 3) or (nb_enleve < 1) or (nb_enleve > nb_allumettes)):
        try:
            nb_enleve = int(input( "Combien enleves−tu d’allumettes " + joueur1 + " ? " ))
            if ( nb_enleve > 3):
                print ('Tu ne peux pas enlever plus que 3 allumettes ! ' )
            elif ( nb_enleve < 1):
                print ('Il faut enlever au moins une allumette ! ' )
            elif ( nb_enleve > nb_allumettes ):
                print ("Tu ne peux pas enlever autant d’allumettes ! " )
            else:
                nb_allumettes = nb_allumettes - nb_enleve
                joueur1, joueur2 = joueur2, joueur1 # échange le nom des joueurs.

            if ( nb_allumettes == 0 ):
                print ( "******************** \n \n \n \n " )
                print ( joueur1, ' a gagné ! ', joueur2, ' a perdu, car il a pris la dernière allumette.')
                break

            if ( nb_allumettes == 1 ):
                print ( "******************** \n \n \n \n " )
                print ( joueur2, ' a gagné ! ', joueur1, ' doit prendre la dernière allumette ! ! ! ')
                nb_allumettes = 0 # assure de sortir de la boucle principale
                break
        
        except:
            print("Entre un chiffre entre 1 et 3")


ex_III05b_Jeu_de_Nim.py   TOP
Jeu de Nim à deux joueurs. D'un tas d'allumettes, il faut en enlever chacun son tour...
Variante, où un joueur n'a pas le droit de prendre le même nombre d'allumettes que précédent.
# ex_III05b_Jeu_de_Nim.py
'''
Variante du jeu de Nim,
Il y a deux joueurs.
Un tas commence avec 30 allumettes.
Chacun à leur tour, un joueur doit enlever 1, 2 ou 3 allumettes du tas.
Celui qui pend la dernière allumette a perdu.
La variante est qu'il est interdit de prendre le même nombre d'allumettes
que le joueur précédent.
'''
nb_allumettes = 30
nb_precedent = 0  # nombre d'allumettes prise par le joueur précédent

joueur1 = input( ' Quel est ton nom joueur 1 ? ' )
joueur2 = input( ' Quel est ton nom joueur 2 ? ' )

while ( nb_allumettes > 0) :
    print ( '−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−' )
    print ( ' Information : Il reste ', nb_allumettes, 'allumettes.' )
    print ( '−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−' )

    nb_enleve = 4
    while( (nb_enleve > 3) or (nb_enleve < 1) or (nb_enleve > nb_allumettes)):
        try:
            nb_enleve = int(input( "Combien enleves−tu d’allumettes " + joueur1 + " ? " ))
            if ( nb_enleve > 3):
                print ('Tu ne peux pas enlever plus que 3 allumettes !' )
            elif ( nb_enleve < 1):
                print ('Il faut enlever au moins une allumette !' )
            elif ( nb_enleve == nb_precedent):
                print ('Tu ne peux pas prendre le même nombre d''allumette que le joueur précédent !' )
            elif ( nb_enleve > nb_allumettes ):
                print ("Tu ne peux pas enlever autant d’allumettes !" )
            else:
                nb_allumettes = nb_allumettes - nb_enleve
                joueur1, joueur2 = joueur2, joueur1 # échange le nom des joueurs.
                nb_precedent = nb_enleve # mémorise le nombre d'allumettes prises par le joueur précédent.
                
            if ( nb_allumettes == 0 ):
                print ( "******************** \n \n \n \n " )
                print ( joueur1, ' a gagné ! ', joueur2, ' a perdu, car il a pris la dernière allumette.')
                break
        
        except:
            print("Entre un chiffre entre 1 et 3")


ex_III06a_Devine_mon_nombre.py   TOP
Un joueur doit deviner le nombre caché par l'ordinateur. Utilisation de la librairie random
Solution avec le bonus à la fin.
# ex_III06a_Devine_mon_nombre.py
'''
Un joueur doit deviner le nombre caché par l'ordinateur.
Des indications lui sont données.
Lorsqu'il a trouvé, un joli dessin lui est présenté.
Utilise la librairie "random"
'''
import random

nbCache = random.randint(10, 99)
print("J'ai caché un nombre entre 10 et 99, essaye de le deviner")

nbTentatives = 0

while True:
  nbTentatives += 1
  try:
    nbEssai = int(input("Tapez un nombre entre 10 et 99 : "))

    if (nbEssai == nbCache):
      print ("Bravo, tu as trouvé en", nbTentatives, "tentatives.")
      break
    elif abs( nbEssai - nbCache ) <= 2:
      print("C’est bouillant !")

    elif abs( nbEssai - nbCache ) <= 5:
      print("C’est chaud !")

    elif abs( nbEssai - nbCache ) <= 10:
      print("C’est tiede !")

    elif abs( nbEssai - nbCache ) <= 20:
      print ("C’est froid !")

    else:
      print ("C’est glacé !")
  except:
    print("Entrez un nombre entre 10 et 99")
    
print( "Vous avez trouvé le nombre caché en", nbTentatives, "tentatives !" )

if (nbTentatives < 2):
  print( "Sacré coup de chance ! ! !")
elif (nbTentatives < 5):
  print ( "Joli score !")
elif nbTentatives < 8 :
  print ("Le score est acceptable.")
else :
  print( "pas terrible comme score ! ! !")

print() # pour sauter une ligne

ligne = 0
largeurMax = 4

while (ligne < largeurMax):
  largeur = 1* ( ( largeurMax ) - ligne )
  nbDiese = 2* ligne + 1
  print ( largeur * ' ' + nbDiese * '#' )
  ligne = ligne + 1

while (ligne >= 0):
  largeur = 1* ( ( largeurMax ) - ligne )
  nbDiese = 2* ligne + 1
  print ( largeur * ' ' + nbDiese * '#' )
  ligne = ligne - 1

ex_IV01a_Rebonds_ball.py   TOP
Simulation de rebonds d'une balle, avec perte d'énergie à chaque rebond.
# ex_IV01a_Rebonds_ball.py
'''
Simulation de rebonds d'une balle, avec perte d'énergie à chaque rebond.
Avec gestion d'erreur d'entrée : try: ... except: ...
'''
while True :
    h0 = float(input( 'Quelle est la hauteur initiale en [m] ? ' ))
    if (h0 >= 0):
        break
    
while True :
    eps = float(input( 'Quel est le coefficient de rebond ? ' ))
    if (eps >= 0) and (eps < 1):
        break

while True :
    try:
        nbr = int(input( 'Combien de rebonds de balle ? ' ))
        if (nbr < 0):
            print('Un nombre positif de rebonds :', end=' ')
        else:
            break
    except ValueError:
        print('Un nombre entier de rebonds :', end=' ')
        

rebonds = 0
g = 9.81
h = h0

while (rebonds < nbr):
    print('rebond', rebonds, ' ', h)
    v = (2 * g * h) ** 0.5
    v1 = eps * v
    h = (v1 **2) / (2 * g )
    rebonds = rebonds + 1

print( 'Après', rebonds, 'rebonds la balle atteint une hauteur de', h, ' mètres.')

ex_IV02a_Test_nombre_premier.py   TOP
Test si un nombre donné par l'utilisateur est un nombre premier.
# ex_IV02a_Test_nombre_premier.py
'''
Test si un nombre donné par l'utilisateur est un nombre premier.
'''
while True :
    nn = int(input( 'Entrez un nombre entier supérieur à 1 : '))
    if (nn > 1):
        break
      
isPremier = True
if (nn % 2 == 0) and (nn != 2):
    print( 'Le nombre n’est pas premier, car il est divisible par 2 !')
    isPremier = False

mm = 3 # diviseurs possibles du nombre nn
while (mm <= nn**0.5):  # On teste avec tous les nombres <= racine carrée de nn.
    if (nn % mm == 0):
        print ('Le nombre', nn, "n’est pas premier, car il est divisible par", mm, '!')
        isPremier = False
        break
    mm = mm + 2 # essaye la division avec le prochain nombre impair.

if (isPremier):
    print( 'Le nombre', nn, 'est premier !')

ex_IV03a_Jeu_de_memory.py   TOP
Un joueur doit mémoriser une suite de nombre et les écrire ensuite.
# ex_IV03a_Jeu_de_memory.py
'''
Un joueur doit mémoriser une suite de nombre et les écrire ensuite.
Utilise la librairie random.
'''
from random import *

c = n = 0

while True:
    a = randint(1 , 4 )
    print (100 * '\n' + 'Le nouveau nombre est ' + str( a ) )
    c = a + c * 10
    b = int(input( '\nRedis tous mes nombres : ' ))
    if (b != c):
        print( "FAUX, c'était          :", c )
        break
    n = n + 1

print( 'Nb de réussites :', n)

ex_V04a_Cherche_un_caractere.py   TOP
Compte le nombre de "e" dans une chaîne de caractères.
# ex_V04a_Cherche_un_caractere.py
'''
Compte le nombre de "e" dans une chaîne de caractères.
'''
chaine = input("Taper une chaine de caractères, \
je vous dirai le nombre de 'e' qu'elle contient.\n")

lesE="eéèêëEÈË" #Astuce : on va tester différents "e", on les groupe dans une chaîne

nCompte = 0 # Compte le nombre de 'e' dans la chaîne
nn = 0
while (nn < len(chaine)):
  if (chaine[nn] in lesE):
    #  in   permet de vérifier si un élément fait partie d'une séquence
    nCompte += 1
  nn += 1

if (nCompte > 0):
    print("Il y a", nCompte, "caractères 'e' dans la chaîne :", chaine)
else:
    print("Il n'y a pas de 'e' dans la chaine :", chaine)

ex_V06a_Compte_nombre_e.py   TOP
Compte le nombre de "e" dans une chaîne de caractères, en utilisant une boucle "for".
# ex_V06a_Compte_nombre_e.py
'''
Compte le nombre de "e" dans une chaîne de caractères,
en utilisant une boucle "for"
'''
chaine = input("Taper une chaine de caractères, \
je vous dirai le nombre de 'e' qu'elle contient.\n")

nCompte = 0 # Compte le nombre de 'e' dans la chaîne

for car in chaine:
  if (car == "e"):
    nCompte += 1

print("Il y a", nCompte, "'e' dans la chaîne :", chaine)

ex_V07a_Insert_des_etoiles.py   TOP
Insert une étoile entre chaque lettre d'une chaîne de caractères.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
# ex_V07a_Insert_des_etoiles.py
'''
Insert une étoile entre chaque lettre d'une chaîne de caractères.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'
'''

# Demande une chaine de caractères, mais pas vide.
chaine = ""
while (chaine == ""):
  chaine = input ("Donnez-moi une chaine que j'y insère des * !\n")

chaineEtoile = chaine[0]
nn = 1
while (nn < len(chaine)):
    chaineEtoile += "*" + chaine[nn]
    nn += 1
    
print(chaineEtoile)

# === Autre manière en utilisant une boucle for

chaineEtoile2 = chaine[0]
for car in chaine[1:]: # Prend tous les caractères de la chaîne, sauf le premier.
    chaineEtoile2 += "*" + car

print(chaineEtoile2)

ex_V08a_Inverse_une_chaine_de_caracteres.py   TOP
Inverse l'ordre des caractères d'une chaîne entrée par l'utilisateur.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
# ex_V08a_Inverse_une_chaine_de_caracteres.py
'''
Inverse l'ordre des caractères d'une chaîne entrée par l'utilisateur.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
'''

# Demande une chaine de caractères, mais pas vide.
chaine = ""
while (chaine == ""):
  chaine = input ("Donnez-moi une chaine que je l'inverse !\n")

chaineInverse=""
nn = len(chaine)
while (nn > 0):
    nn-=1
    chaineInverse += chaine[nn]
    
print(chaineInverse)

# *** Version avec une boucle 'for'

chaineInverse2 = ""
for car in chaine:
    chaineInverse2 = car + chaineInverse2

print(chaineInverse2)

ex_V09a_Test_palindrome.py   TOP
Test si une chaîne entrée par l'utilisateur est un palindrome.
Un palindrome est une chaîne qui est identique à la chaîne inversée.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
# ex_V09a_Test_palindrome.py
'''
Test si une chaîne entrée par l'utilisateur est un palindrome.
Un palindrome est une chaîne qui est identique à la chaîne inversée.
De deux manières différentes, avec une boucle 'while' et avec une boucle 'for'.
Normalement, on devrait enlever les espaces et signes de ponctuations.
'''

# Demande une chaine de caractères, mais pas vide.
chaine = ""
while (chaine == ""):
  chaine = input ("Donnez-moi une chaine que je teste si c'est un palindrome.\n")

nLast = len(chaine) - 1
nn = len(chaine) // 2
while (nn > 0):
  nn -= 1
  if (chaine[nn] != chaine[nLast - nn]):
    print("Votre chaîne n'est PAS un palindrome.")
    break

if (nn == 0):
  print("La chaine suivante est un palindrome :\n", chaine)

# *** Version avec une boucle 'for'

chaineInverse2 = ""
for car in chaine:
    chaineInverse2 = car + chaineInverse2

if (chaine == chaineInverse2):
  print("Votre chaîne est un palindrome.")
else:
  print("Votre chaîne n'est PAS un palindrome.")

ex_V90a_Jeu_de_de.py   TOP
Jeu de dé à deux joueurs.
Avec des couleurs à l'affichage.
#!/usr/bin/python
# -*- coding: utf-8 -*-
# ex_V90a_Jeu_de_de.py
'''
Jeu de dé à deux joueurs.
On part d'une valeur initiale, par exemple Somme = 21
On lance un dé à 6 faces.
Chaque joueur à son tour tourne le dé d'un quart de tour.
La valeur obtenue est enlevée à la somme.
Le premier qui arrive à 0 ou moins a perdu.
'''

import random
import sys # pour afficher du texte en couleur

color = sys.stdout.shell # Pour pouvoir écrire en couleur.

# Valeur de départ. Un nombre au hasard entre 24 et 32
Somme = random.randint(24,32) 

# On lance le dé au hasard
ValDe = random.randint(1,6) # un nombre au hasard entre 1 et 6

while (Somme > 0):
  # Boucle du jeu
  color.write("La somme vaut : " + str(Somme) + \
              ". Le dé montre la face : " + str(ValDe) + "\n", "console")

  # Demande un nombre au joueur, en testant qu'il est possible.
  color.write("Joueur n°1, en entrez la nouvelle face : ", "stdout")
  nJoueur1 = int(input())
  while (nJoueur1 < 1) or (nJoueur1 > 6) \
     or (nJoueur1 == ValDe) or (nJoueur1 == 7 - ValDe):
      color.write("Entrée non valide\n", "stderr")
      color.write("Joueur, en entrez la nouvelle face : ", "stdout")
      nJoueur1 = int(input())

  ValDe = nJoueur1
  Somme = Somme - nJoueur1
  color.write("La somme vaut : " + str(Somme) + \
              ". Le dé montre la face : " + str(ValDe) + "\n", "console")

  if (Somme <= 0):
    color.write("Vous avez perdu.\n", "stderr")
    break

  # L'ordinateur joue au hasard, en testant qu'il est possible.
  nJoueur2 = random.randint(1,6)
  while (nJoueur2 == ValDe)or (nJoueur2 == 7 - ValDe):
    nJoueur2 = random.randint(1,6)

  ValDe = nJoueur2
  Somme = Somme - nJoueur2

  color.write("L'ordinateur a joué : " + str(nJoueur2) + "\n", "STRING")

  if (Somme <= 0):
    color.write("L'ordinateur a perdu.\n", "stderr")
    break

color.write("Terminé avec la somme : " + str(Somme) + "\n", "console")


ex_VI01a_Testons_livret_de_7.py   TOP
Un exemple simple de fonction, sans paramètre.
# ex_VI01a_Testons_livret_de_7.py
# Tapez : help(livretDe7)  pour avoir de l'aide sur la fonction.

def livretDe7():
#=============
    ''' Affiche le livret de 7.'''
    nn=1
    while nn<11:
        print(nn*7,end=" ")
        nn+=1
    print()

livretDe7()

ex_VI01b_Testons_livret.py   TOP
Un exemple de fonction, avec un paramètre.
# ex_VI01b_Testons_livret.py
# Tapez : help(livretDe)  pour avoir de l'aide sur la fonction.
'''
Affiche le livret d'une base choisi par l'utilisateur.
Montre également la gestion d'exception.
"int(lettre)" génère une exception, qui est traitée dans
la partie "except:". Ici, on sort simplement du programme.
'''

def livretDe(base):
#=============
    ''' Affiche le livret d'une base choisie pas l'utilisateur.'''
    nn=1
    while nn<11:
        print(nn*base,end=" ")
        nn+=1
    print()


while True:
    try:
        aa=int(input("Quelle base ? (Taper Q pour quitter) : "))
    except:
        print("Au revoir...")
        break
    livretDe(aa)

ex_VI02a_Fonction_avec_plusieurs_parametres.py   TOP
Un exemple de fonction avec plusieurs paramètres.
# ex_VI02a_Fonction_avec_plusieurs_parametres.py
# Tapez : help(tableMulti)  pour avoir de l'aide sur la fonction.

def tableMulti(base, debut, fin):
# ===============================
    ''' Génère la table de multiplication de "base" de debut à fin'''
    nn=debut
    while (nn<fin):
        print(nn*base, end=" ")
        nn+=1

# Utilisation de la fonction "tableMulti"
# Pour générer plusieurs tables de multiplications.
tt, dd, ff = 11, 5, 10 
while (tt<21):
    tableMulti(tt, dd, ff)
    print()
    tt, dd, ff = tt +1, dd +3, ff +5 

ex_VI03a_Les_parametres_facultatifs_d_une_fonction.py   TOP
Un exemple de fonction avec des paramètres facultatifs.
# ex_VI03a_Les_parametres_facultatifs_d_une_fonction.py
# Tapez : help(essai)  pour avoir de l'aide sur la fonction.
'''
Montre que l'on peut définir des paramètres facultatifs,
qui ont une valeur par défaut.
Montre également que si on nomme les paramètres,
leur ordre n'est pas important.
'''

def essai(x, y=0):
# ===============================
    ''' Un essai de paramètre facultatif '''
    return(x+y)

print(essai(21))
print(essai(21, 2))
print(essai(21, y=2))
print(essai(y=2, x=21))

ex_VI04a_Testons_une_variable_est_elle_la_meme_que_dans_la_boucle.py   TOP
Notion de variable locale et de variable globale
# ex_VI04a_Testons_une_variable_est_elle_la_meme_que_dans_la_boucle.py
# Tapez : help(chezMoi)  pour avoir de l'aide sur la fonction.
'''
Montre qu'une variable locale à une fonction ne peut pas changer
la variable de même nom définie à l'extérieur de la fonction.
'''

#rr = 130
def chezMoi():
#=============
    ''' Montre que la variable "rr" est locale à la fonction\
        et ne modifie pas la variable "rr" définie à l'extérieur de la fonction.'''
    pp=100
    rr=200
    print("chezMoi:", end=" ")
    print(pp, end=" ")
    print(qq, end=" ")
    print(rr)

# boucle principale
pp, qq = 111, 120
chezMoi()
print("dehors :", end=" ")
print(pp, end=" ")
print(qq, end=" ")
print(rr)

ex_VI04b_Testons_une_variable_est_elle_la_meme_que_dans_la_boucle.py   TOP
Notion de variable locale et de variable globale
# ex_VI04b_Testons_une_variable_est_elle_la_meme_que_dans_la_boucle.py
# Tapez : help(chezMoi)  pour avoir de l'aide sur la fonction.
'''
Montre qu'en définissant une variable "global" dans une fonction
elle peut changer la variable de même nom définie à l'extérieur de la fonction.
'''

#rr = 130
def chezMoi():
#=============
    ''' Montre que les variables "rr" et "pp" sont globals\
        et modifient les variables "rr" et "pp" définient à l'extérieur de la fonction.'''
    global pp, rr
    pp=100
    rr=200
    print("chezMoi:", end=" ")
    print(pp, end=" ")
    print(qq, end=" ")
    print(rr)

# boucle principale
pp, qq = 111, 120
chezMoi()
print("dehors :", end=" ")
print(pp, end=" ")
print(qq, end=" ")
print(rr)

ex_VI06a_Fonction_retournant_une_chaine.py   TOP
Exemple de fonction retournant une chaine de caractères.
# ex_VI06a_Fonction_retournant_une_chaine.py
# Tapez : help(ligneCar)  pour avoir de l'aide sur la fonction.

def ligneCar(nn, car):
#=====================
    ''' Retourne une chaîne de caractères qui répète nn fois le caractère "car"'''
    chaine=""
    for ii in range(0,nn): # range(0, nn) donne les nombre de  0 à  nn-1
        chaine += car
    return chaine

def hmi_ligneCar():
#==================
    lettre=input("Quelle lettre ? ")
    nb=int(input("Combien de fois la répéter ? (<=0 pour quitter) : "))
    if (nb<=0):
        return False
    
    print(ligneCar(nb,lettre))
    return True

while hmi_ligneCar():
    continue

ex_VI07a_Fonction_retournant_un_livret_dans_une_chaine.py   TOP
Exemple de fonction retournant une chaine de caractères.
Montre également un traitement d'exception try: ... except:
# ex_VI07a_Fonction_retournant_un_livret_dans_une_chaine.py

def livretDe(base):
#==================
    ''' Retourne le livret de "base" dans une chaîne de caractères'''
    nn = 1
    resultat = ""
    while (nn<11):
        resultat = resultat + " " + str(nn*base)
        nn += 1
    return resultat

while True:
    try:
        aa = int(input("Quelle base ? (Taper une lettre pour quitter) : "))
    except:
        break
    print(livretDe(aa))

ex_VI08a_Fonction_retournant_un_reel.py   TOP
Exemple de fonction retournant un nombre réel (type float).
# ex_VI08a_Fonction_retournant_un_reel.py

def surfCercle(rr):
#==================
    ''' Retourne l'aire d'un disque de rayon "rr"'''
    from math import pi
    return pi*rr**2

def hmi_surfCercle():
#====================
    ''' Calcule plusieurs aires, de rayon introduit par l'utilisateur'''
    rayon = float(input("Quel est le rayon du cercle ? (<=0 pour quitter) : "))
    if (rayon <= 0):
        return False
    print(surfCercle(rayon))
    return True

while hmi_surfCercle():
    continue

ex_VI09a_Fonction_maximum.py   TOP
Fonction qui retourne le maximum de 3 nombres.
# ex_VI09a_Fonction_maximum.py
# Fonction qui retourne le maximum de 3 nombres

def maximum(n1, n2, n3):
#=======================
    ''' Retourne le maximum des trois nombres donnés'''
    if (n1 > n2):
        # Le maximum est n1 ou n3
        if (n1 > n3):
            return n1
        else:
            return n3
    else:
        # le maximum est n2 ou n3
        if (n2 > n3):
            return n2
        else:
            return n3

# Dans tous les exemples ci-dessous, l'affichage donne le nombre  : 7
print(maximum(2, 5, 7))
print(maximum(5, 2, 7))
print(maximum(2, 7, 5))
print(maximum(7, 2, 5))

ex_VI10a_Compter_une_occurence.py   TOP
Compte combien de fois un caractère apparaît dans une chaîne donnée
# ex_VI10a_Compter_une_occurence.py
# Fonction compte combien de fois un caractère apparaît dans une chaîne donnée

def CompteCar(car, ch):
#======================
    ''' Retourne le nombre de fois que le caractère car apparaît dans la chaîne ch'''
    nbCar=0  # compte le nombre de caractères
    for cc in ch:
        if cc == car:
            nbCar += 1; # un caractère a été trouvé

    return nbCar

# Test de la fonction
print("Nombre de caractères =", CompteCar("e", "Cette phrase est un exemple"))

ex_VI12a_Compter_les_mots.py   TOP
Fonction qui retourne le nombre de mots contenu dans une phrase.
Deux exemples de fonctions sont donnés.
# ex_VI12a_Compter_les_mots.py
# Fonction qui retourne le nombre de mots contenu dans une phrase
# La fonction est assez subtile, pas facile à trouver.

def compteMot(phrase):
#=====================
    '''Compte le nombre de mots se trouvant dans la phrase donnée.
    (un mot etant tout ensemble de caracteres inclus entre des espaces)'''
    nbMot = 0 # Compteur du nombre de mots

    # Il faut avoir un ou plusieurs espaces suivit d'un caractère pour comptabiliter un mot.
    separateur=True  # comme si on avait un espace en début de phrase.
    for car in phrase:
        if car==" ":
            separateur=True
        elif separateur:
            nbMot+=1
            separateur=False
        else:
            separateur=False
            
    return nbMot

# Autre fonction identique, selon un algorithme différent.
def compteMot2(phrase):
#======================
    '''Compte le nombre de mots se trouvant dans la phrase donnée.
    (un mot etant tout ensemble de caracteres inclus entre des espaces)'''
    nbMot = 0 # Compteur du nombre de mots

    # Il faut avoir un ou plusieurs espaces suivit d'un caractère pour comptabiliter un mot.
    nn = 0 # compte où on en est dans la phrase
    while (nn < len(phrase)):
        while ( (nn < len(phrase)) and (phrase[nn] == " ") ): # saute les espaces consécutifs
            nn += 1;

        if (nn < len(phrase)):
            nbMot+=1 # on comptabilise un mot
                
        while ( (nn < len(phrase)) and (phrase[nn] != " ") ): # saute caractères non espaces consécutifs
            nn += 1;
            
    return nbMot

# Test de la fonction
print("Nombre de mots =", compteMot("Cette   phrase est un exemple qui contient neuf mots"))
print("Nombre de mots =", compteMot2("Cette   phrase est un exemple qui contient neuf mots"))



ex_VI13_serie_approcher_pi_sur_2.py   TOP
Voici un code utilisant une fonction, pour approcher le nombre pi/2
# ex_VI13a_serie_approcher_pi_sur_2
# Voici un code utilisant une fonction, pour approcher le nombre pi/2

def FractionCalcule(k):
#======================
    return (float(2*k + 2) / (2*k + 1) * (2*k + 2) / (2*k + 3))

n = 0
produit = 1

while n < 100000:
    produit = produit * FractionCalcule(n)
    n = n + 1
    
print("Le nombre pi est environs égale à ", 2*produit)

ex_VII01a_turtle_carre.py   TOP
À l'aide du module "turtle", dessine un carré de taille et de couleur choisie.
# ex_VII01a_turtle_carre.py
# À l'aide du module "turtle",
# dessine un carré de taille et de couleur choisie

from turtle import *

# défini la position et la taille de la fenêtre.
setup(width=900, height=950, startx=10, starty=15)
speed(0) # vitesse maximale de dessin
delay(0) # va encore plus vite

def carre(taille, couleur="black"):
    color(couleur)
    c = 0
    while (c < 4):
        forward(taille)
        right(90)
        c += 1

# Test la fonction carre
up()
goto(-400,0) # se positionne plus à gauche de la fenêtre
down()
carre(200, 'blue')

up()
forward(300)
down()
carre(200)

ex_VII02a_turtle_defi_1.py   TOP
À l'aide du module "turtle", dessine un carré de taille, de couleur et d'orientation choisies, dessine un triangle de taille, de couleur et d'orientation choisies.
# ex_VII02a_turtle_defi_1.py
# À l'aide du module "turtle",
# dessine un carré de taille, de couleur et d'orientation choisies,
# dessine un triangle de taille, de couleur et d'orientation choisies.

from turtle import *

# défini la position et la taille de la fenêtre.
setup(width=900, height=950, startx=10, starty=15)
speed(0) # vitesse maximale de dessin
delay(0) # va encore plus vite

def carre(taille, couleur="black", angle=0):
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 4):
        forward(taille)
        right(90)
        c += 1

def triangle(taille, couleur="black", angle=0):
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 3):
        forward(taille)
        right(120)
        c += 1

# Test la fonction carre
def test1():
    up()
    goto(-400,0) # se positionne plus à gauche de la fenêtre
    down()
    carre(200, 'blue')

    up()
    forward(300)
    down()
    carre(200)

    up()
    forward(300)
    down()
    carre(200, 'green', 30)


# Test la fonction triangle
def test2():
    up()
    goto(-400,0) # se positionne plus à gauche de la fenêtre
    down()
    triangle(200, 'blue')

    up()
    forward(300)
    down()
    triangle(200)

    up()
    forward(300)
    down()
    triangle(200, 'green', 30)


# Test une suite de carrés et de triangles
def test3():
    up()
    goto(-440,0) # se positionne plus à gauche de la fenêtre
    down()

    # Dessine une suite de 5 carrés rouge et 5 triangles bleus
    nn = 0
    while (nn < 5):
        carre(40+20*nn, 'red')
        up()
        forward(50+20*nn)
        down()
        triangle(40+20*nn, 'blue')
        up()
        forward(50+20*nn)
        down()
        nn += 1

test3()

ex_VII03a_turtle_defi_2.py   TOP
À l'aide du module "turtle", dessine un carré de taille, de couleur et d'orientation choisies, dessine un triangle de taille, de couleur et d'orientation choisies, dessine une étoile à 5 branches de taille, de couleur et d'orientation choisies.
# ex_VII03a_turtle_defi_2.py
# À l'aide du module "turtle",
# dessine un carré de taille, de couleur et d'orientation choisies,
# dessine un triangle de taille, de couleur et d'orientation choisies,
# dessine une étoile à 5 branches de taille, de couleur et d'orientation choisies.

from turtle import *

# défini la position et la taille de la fenêtre.
setup(width=900, height=950, startx=10, starty=15)
speed(0) # vitesse maximale de dessin
delay(0) # va encore plus vite

def carre(taille, couleur="black", angle=0):
    '''dessine un carré'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 4):
        forward(taille)
        right(90)
        c += 1

def triangle(taille, couleur="black", angle=0):
    '''dessine un triangle'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 3):
        forward(taille)
        right(120)
        c += 1

def etoile5(taille, couleur="black", angle=0):
    '''dessine une étoile à 5 branches'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 5):
        forward(taille)
        right(180 - 36)
        c += 1

# Test la fonction carre
def test1():
    up()
    goto(-400,0) # se positionne plus à gauche de la fenêtre
    down()
    carre(200, 'blue')

    up()
    forward(300)
    down()
    carre(200)

    up()
    forward(300)
    down()
    carre(200, 'green', 30)


# Test la fonction triangle
def test2():
    up()
    goto(-400,0) # se positionne plus à gauche de la fenêtre
    down()
    triangle(200, 'blue')

    up()
    forward(300)
    down()
    triangle(200)

    up()
    forward(300)
    down()
    triangle(200, 'green', 30)


# Test une suite de carrés et de triangles
def test3():
    up()
    goto(-440,0) # se positionne plus à gauche de la fenêtre
    down()

    # Dessine une suite de 5 carrés rouge et 5 triangles bleus
    nn = 0
    while (nn < 5):
        carre(40+20*nn, 'red')
        up()
        forward(50+20*nn)
        down()
        triangle(40+20*nn, 'blue')
        up()
        forward(50+20*nn)
        down()
        nn += 1


# Test une suite de 9 d'étoiles à 5 branches
def test4():
    up()
    goto(-440,0) # se positionne plus à gauche de la fenêtre
    down()

    nn = 0
    while (nn < 9):
        taille = 100 - 5*(nn - 4)**2
        etoile5(taille, 'blue')
        up()
        forward(taille+10)
        down()
        nn += 1

test4()

ex_VII04a_turtle_defi_3.py   TOP
À l'aide du module "turtle", dessine un carré de taille, de couleur et d'orientation choisies, dessine un triangle de taille, de couleur et d'orientation choisies, dessine une étoile à 5 branches de taille, de couleur et d'orientation choisies, dessine une étoile à 6 branches de taille, de couleur et d'orientation choisies.
# ex_VII04a_turtle_defi_3.py
# À l'aide du module "turtle",
# dessine un carré de taille, de couleur et d'orientation choisies,
# dessine un triangle de taille, de couleur et d'orientation choisies,
# dessine une étoile à 5 branches de taille, de couleur et d'orientation choisies,
# dessine une étoile à 6 branches de taille, de couleur et d'orientation choisies.

from turtle import *

# défini la position et la taille de la fenêtre.
setup(width=900, height=950, startx=10, starty=15)
speed(0) # vitesse maximale de dessin
delay(0) # va encore plus vite

def carre(taille, couleur="black", angle=0):
    '''dessine un carré'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 4):
        forward(taille)
        right(90)
        c += 1

def triangle(taille, couleur="black", angle=0):
    '''dessine un triangle'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 3):
        forward(taille)
        right(120)
        c += 1

def etoile5(taille, couleur="black", angle=0):
    '''dessine une étoile à 5 branches'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    c = 0
    while (c < 5):
        forward(taille)
        right(180 - 36)
        c += 1

def etoile6(taille, couleur="black", angle=0):
    '''dessine une étoile à 6 branches'''
    seth(angle) # défini l'orientation de la tortue
    color(couleur)
    triangle(taille, couleur, angle)
    up()
    right(90)
    forward(taille*0.577) # 0.577 = sin(120°) / (3 * sin(30°))
    down()
    triangle(taille, couleur, angle+60)
    seth(angle)
    up()
    left(90)
    forward(taille*0.577)
    down()
    seth(angle)

# Test la fonction carre
def test1():
    up()
    goto(-400,0) # se positionne plus à gauche de la fenêtre
    down()
    carre(200, 'blue')

    up()
    forward(300)
    down()
    carre(200)

    up()
    forward(300)
    down()
    carre(200, 'green', 30)


# Test la fonction triangle
def test2():
    up()
    goto(-400,0) # se positionne plus à gauche de la fenêtre
    down()
    triangle(200, 'blue')

    up()
    forward(300)
    down()
    triangle(200)

    up()
    forward(300)
    down()
    triangle(200, 'green', 30)


# Test une suite de carrés et de triangles
def test3():
    up()
    goto(-440,0) # se positionne plus à gauche de la fenêtre
    down()

    # Dessine une suite de 5 carrés rouge et 5 triangles bleus
    nn = 0
    while (nn < 5):
        carre(40+20*nn, 'red')
        up()
        forward(50+20*nn)
        down()
        triangle(40+20*nn, 'blue')
        up()
        forward(50+20*nn)
        down()
        nn += 1


# Test une suite de 9 d'étoiles à 5 branches
def test4():
    up()
    goto(-440,0) # se positionne plus à gauche de la fenêtre
    down()

    nn = 0
    while (nn < 9):
        taille = 100 - 5*(nn - 4)**2
        etoile5(taille, 'blue')
        up()
        forward(taille+10)
        down()
        nn += 1


# Test une suite de carrés, de triangles et d'étoiles
# N'est pas exactement le dessin du cours, mais c'est joli.
def test5():
    up()
    goto(-120,-140) # se positionne plus à gauche de la fenêtre
    down()

    nn = 0
    while (nn < 10):
        taille = 20 + 10*nn

        etoile6(taille, 'blue', 60*nn)
        up()
        forward(taille+10)
        down()
        carre(taille, 'red', 60*nn)
        up()
        forward(taille+10)
        down()
        etoile5(taille, 'blue', 60*nn)
        up()
        forward(taille+10)
        down()
        triangle(taille, 'red', 60*nn)
        up()
        forward(taille+10)
        right(90)
        forward(taille*0.66)
        down()

        nn += 1

test5()

serie12_act_2.py   TOP
À l'aide du module "turtle", dessine un flocon de Koch.
Pour les séries 11 et 12, référez-vous à la page consacrée au cours d'OC informatique de 3ème, 2018 - 2019.
# s12af2_turtle_flocon_Koch.py
# Série 12, activité F.2
# Utilisant la turtle et
# Dessin de flocon de Koch, récursif

# c.f. https://docs.python.org/3/library/turtle.html
# c.f. https://docs.python.org/3/library/turtle.html#turtle.speed
from turtle import *
#from random import randrange

def segment(taille, niveau):
   "Un segment de Koch"
   if niveau == 0:
      forward(taille)
   else:
      # angle = 40 + randrange(31)
      segment(taille//3, niveau-1)
      left(angle)
      segment(taille//3, niveau-1)
      right(2*angle)
      segment(taille//3, niveau-1)
      left(angle)
      segment(taille//3, niveau-1)

def flocon(taille, niveau):
   "Un flocon de Koch"
   segment(taille, niveau)
   right(120)
   segment(taille, niveau)
   right(120)
   segment(taille, niveau)
   right(120)

# Fonction  __main__
setup(width=900, height=950, startx=10, starty=15)
title("Flocon de Koch")
speed(0) # 0 = vitesse maximale, 10 = rapide,  1 = lent
delay(0) # va encore plus vite

up()
goto(-420, 200)
down()

angle=60  # angle = 60 pour un flocon de Koch standard
flocon(729, 3)    

ex_VIII01a_le_type_de_donnee_list.py   TOP
# ex_VIII01a_le_type_de_donnee_list.py

Li1 = [ 1 , 2 , 3 ]
print (type ( Li1 ))
print (Li1)
#
Li2 =[27 , "Bonjour  comment  allez-vous  ?" , 3.1415 , Li1 ]
print (type ( Li2 ))
print (Li2)
#
Li3=range ( 1 , 4 , 1 )
print (type ( Li3 ))
print (Li3)
#
Li4 = [ ]
print (type ( Li4 ))
print (Li4)
#
Li5 =[ Li1 , Li2 , Li3 , Li4 ]
print (type ( Li5 ))
print (Li5)

# La liste  Li5  est une liste de listes
# Vu qu'un élément de  Li2  est une liste,
# Li5  contient un élément qui est une liste qui contient une liste !
# Clairement les éléments d'un objet de type "list"
# ne sont pas obligatoirement du même type.

#----------------------------------------------------
print("Conversions de listes...")
print("Concersion de string en liste : ", end="")
li11 = list("bonjour")
print(li11)
print("Concersion de list en string : ", end="")
li11[0] = 'B'
str11 = "".join(li11) # c.f. https://www.w3schools.com/python/ref_string_join.asp
print(str11)

ex_VIII02a_l_instruction_list.py   TOP
# ex_VIII02a_l_instruction_list.py

txt="Bonjour ,  comment  allez-vous  ?"
Li = list( txt ) # Crée un objet de type "list", à partir d'un "string"
                 # Décompose le "string" en ses caractères.
print( Li )
print(type( txt ))
print(type( Li ))

ex_VIII03a_operation_sur_les_listes_de_nombres.py   TOP
# ex_VIII03a_operation_sur_les_listes_de_nombres.py

Li = [ -2, 3.14, 37, -786.2 ]
print(Li)
print(min( Li ))
print(max( Li ))
print(sum( Li ))

t2 = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\
        'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']

ex_VIII04a_operation_sur_les_listes.py   TOP
# ex_VIII04a_operation_sur_les_listes.py

Li1 = [ 1, 2, " bonjour " ]
Li2 = [ [ 3, list( "texte" ) ] , [ ] , 7.56 , "a" ]

print(Li1)
print(Li2)
print(len ( Li1 ) ,  len ( Li2 ))

Li = Li1 + Li2
print(Li)

Li3 = 2 * Li1
print(Li3)

ex_VIII05a_test_d_appartenance.py   TOP
# ex_VIII05a_test_d_appartenance.py

texte="Bonjour, comment allez-vous  ?"
Li = list(texte) + [[ 1, 2, 3 ], 7 ]
print(Li)

print("o"  in  Li)
print("o"  in texte)
print(1  in  Li)
print(7 not in  Li)
print([1,2,3]  in  Li)
print([2,1,3]  in  Li)

ex_VIII06a_elements_d_une_liste.py   TOP
# ex_VIII06a_elements_d_une_liste.py

texte = "Bonjour, comment allez-vous ?"
Li = list( texte )
print("a :", Li)
print("b :", len(Li))

print("c :", Li[0])
print("d :", Li[5])

print("e :", Li[1])
print("f :", Li[3])

print("g :", Li[3 : 9 : 2 ])
print("h :", Li[3 : ])
print("i :", Li[: 3 ])

print("j :", Li[ : : 2 ])
print("k :", Li[ 1 :  1 : 2 ])
print("l :", Li[ : :  1 ])

ex_VIII07a_modulo.py   TOP
# ex_VIII07a_modulo.py

jour = ['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi']
a, b = 0, 0
while (a < 25):
     a = a + 1
     b = a % 7
     print('{:3d}'.format(a), jour[b]) # c.f. https://pyformat.info/

ex_VIII09a_fusion_organisee_de_listes.py   TOP
# ex_VIII09a_fusion_organisee_de_listes.py

t1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
t2 = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\
      'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
t3 = []
for nn in range(0,len(t1)): # nn varie de 0 à len(t1)-1
     t3.append(t1[nn])
     t3.append(t2[nn])

# Affiche la nouvelle liste.  "\n" insert un retour à la ligne.
print("Nouvelle liste :\n", t3)

ex_VIII10a_afficher_proprement.py   TOP
# ex_VIII10a_afficher_proprement.py

t2 = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',\
      'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
for elem in t2:
     print(elem, end=" ")

ex_VIII11a_le_plus_grand_vaut.py   TOP
# ex_VIII11a_le_plus_grand_vaut.py
# Recherche du plus grand élément d'une liste de nombres.

Li = [32, 5, 12, 8, 3, 75, 2, 15]

# Méthode évidente, en utilisant une méthode de la liste.
print("Le max. de la liste vaut :", max(Li))

# Méthode qui cherche les deux plus grand éléments de la liste.
if (Li[0] > Li[1]):
    Max1 = Li[0]  # est le plus grand
    Max2 = Li[1]  # est le 2ème plus grand
else:    
    Max1 = Li[0]
    Max2 = Li[1]

# Cherche les deux plus grand éléments de la liste
for elem in Li[2::]:
    print(elem)
    if (elem >= Max1):
        Max2 = Max1  # 2ème plus grand élément
        Max1 = elem
    elif (elem >= Max2):
        Max2 = elem # le 2ème plus grand élément change.

print("Les deux plus grands éléments de la liste sont :\n", Max2, Max1)

# Autre manière de faire, qui modifie la liste
newMax1 = max(Li)
Li.remove(newMax1)
newMax2 = max(Li)
Li.append(newMax1) # pour ne pas perdre un élément de la liste
print("Les deux plus grands éléments de la liste sont :\n", newMax2, newMax1)

ex_VIII12a_separer_en_divers_listes.py   TOP
# ex_VIII12a_separer_en_divers_listes.py
# Sépare une liste de nombres en ses éléments pairs et ses éléments impairs

Li = [32, 5, 12, 8, 3, 75, 2, 15]

Paires = []
Impaires = []

# Cherche les deux plus grand éléments de la liste
for elem in Li:
    if (elem % 2 == 0): # Nombre pair, car divisible par 2
        Paires.append(elem)
    else:
        Impaires.append(elem)

print("Les nombres pairs de la liste sont :\n", Paires)
print("Les nombres impairs de la liste sont :\n", Impaires)

ex_VIII14a_le_plus_grand_est_place.py   TOP
# ex_VIII14a_le_plus_grand_est_place.py
# Sépare une liste de nombres en ses éléments pairs et ses éléments impairs

Li = [32, 5, 12, 8, 3, 75, 2, 15]

Max1 = max(Li)
Max1pos = Li.index(Max1)
print("Le plus grand nombre de la liste est :", Max1)
print("Il est placé en position :", Max1pos)

s01a_ex01_jeu_du_beseu.py   TOP
# s01a_ex01_jeu_du_beseu.py
# Série 1, exercice 1
'''
Le jeu du beseu.
Programme qui affiche les nombres entiers de 1 à 30 (ou plus),
qui affiche "beseu" à la place des multiples de 7 et des nombres terminant par 7 et
qui affiche le sens, soit "droite" soit "gauche".
'''

import time # pas indispensable, pour ne pas afficher trop rapidement.

nn = 0
sens = "droite"  # le sens
while (nn < 30):
    nn += 1
    if (nn % 10 == 7) or (nn % 7 == 0):
        if (sens == "droite"):
            sens = "gauche"
        else:
            sens = "droite"
 
        print("beseu")
    else:
        print(sens, nn)

    time.sleep(0.1)

s01a_ex02_compte_voyelles.py   TOP
# s01a_ex02_compte_voyelles.py
# Série 1, exercice 2
'''
Compte le nombre de voyelles se trouvant dans un texte.
'''

chaine = input("Taper une chaine de caractères, je vous dirai le nombre de 'e' qu'elle contient.\n")

lesVoyelles="aàâAÀÂeéèêëEÈËiîïiIÏÎoôöOÔÖuùüûUÙÜÛyY" #Astuce : on va tester différentes voyelles, on les groupe dans une chaîne

nCompte = 0 # Compte le nombre de voyelles dans la chaîne
nn = 0
while (nn < len(chaine)):
  if (chaine[nn] in lesVoyelles):
    #  in   permet de vérifier si un élément fait partie d'une séquence
    nCompte += 1
  nn += 1

if (nCompte > 0):
    print("Il y a", nCompte, "voyelles dans la chaîne :", chaine)
else:
    print("Il n'y a pas de voyelles dans la chaine :", chaine)

s01a_ex03_fonction_a_deviner.py   TOP
# s01a_ex03_fonction_a_deviner.py
# Série 1, exercice 3
'''
Fonction qui prend deux nombres entiers en entrée.
Tant que les deux nombres sont positifs, remplace le plus grand par la différence entre le plus grand et le plus petit.
À la sortie de la boucle, un des deux nombres est nul.
L'autre nombre est affiché.
'''

def adeviner(nb1, nb2):
#======================
    ''' À commenter pour indiquer ce que calcule cette fonction. '''
    nb10 = nb1 # mémorise les valeurs de nb1 et nb2
    nb20 = nb2
    while (nb1 > 0) and (nb2 > 0):
        if (nb2 > nb1): # Assure que nb1 > nb2
            nb2 = nb2 - nb1
        else:
            nb1 = nb1 - nb2

    if (nb1 == 0):
        sol = nb2
    else:
        sol = nb1
        
    print("Le résultat entre", nb10, "et", nb20, "est", sol)

adeviner(60, 42)
adeviner(1092, 1001)
adeviner(714285, 999999)
adeviner(60, 15)

print(714285 / 142857)
print(999999 / 142857)

s01a_ex04_turtle_marche_aleatoire.py   TOP
# s01a_ex04_turtle_marche_aleatoire.py
# Série 1, exercice 4
# Utilisant : turtle
# Simulation d'une marche aléatoire, la marche de l'ivrogne
# L'ivrogne tourne aléatoirement d'un angle de 90°, ou ne tourne pas

# c.f. https://docs.python.org/3/library/turtle.html
# c.f. https://docs.python.org/3/library/turtle.html#turtle.speed
from turtle import *
from random import randrange

setup(width=700, height=550, startx=10, starty=15) # Position et dimension de la fenêtre graphique
title("Marche aléatoire, marche de l'ivrogne")
speed(0) # 0 = vitesse maximale, 10 = rapide,  1 = lent
delay(0) # va encore plus vite

down()
nn = 0 # compte le nombre de pas fait par l'ivrogne.
while (nn < 200):
    nn += 1
    # Aléatoirement, tourne à gauche ou à droite
    aleat = randrange(3) # tire un nombre entier entre 0 et 2
    if (aleat == 0):
        left(90)
    elif (aleat == 1):
        right(90)
    # else: continue tout droit.

    # puis avance de ... pixels.
    forward(5)

s01a_ex05_automate_1d_non_commente.py   TOP
# s01a_ex05_automate_1d_non_commente.py
# Automate cellulaire en une dimension

str = 30*" "    # 
Li = list(str)  # Conversion de la chaine en liste
Li[15] = "*"    # 
Li2 = Li.copy() # 

# 
for elem in Li:
    print(elem, end="") #
print()

# 
for repete in range(1,90):

    # 
    for nn in range(2, len(Li)-2):

        # 
        cpt = 0
        for kk in range(nn-2, nn+3):
            if (Li[kk] == "*"):
                cpt += 1
        
        if (cpt == 1):    # 
            Li2[nn] = "*"
        elif (cpt == 3):    # 
            Li2[nn] = " "
        else:                # 
            Li2[nn] = Li[nn]

    Li = Li2.copy() # 

    # 
    for elem in Li:
        print(elem, end="")
    print()

s01a_ex05_automate_1d_commente.py   TOP
# s01a_ex05_automate_1d_commente.py
# Automate cellulaire en une dimension

str = 30*" "    # Création d'une chaine de caractère de 30 espaces
Li = list(str)  # Conversion de la chaine en liste
Li[15] = "*"    # Remplace le 15e élément de la liste par une étoile
Li2 = Li.copy() # Duplification de la liste

# Affiche les éléments de la liste
for elem in Li:
    print(elem, end="") # affiche un élément de la liste, sans retour de ligne.
print()

# Répète 90 fois une suite d'instructions
for repete in range(1,90):

    # Boucle sur tous les éléments de la liste, sauf les deux premiers et les deux derniers
    for nn in range(2, len(Li)-2):

        # Compte le nombre d'étoiles dans les 5 "voisins" de la position  nn
        cpt = 0
        for kk in range(nn-2, nn+3):
            if (Li[kk] == "*"):
                cpt += 1
        
        if (cpt == 1):    # Si un seul voisin, change l'élément  nn en  "*"
            Li2[nn] = "*"
        elif (cpt == 3):    # Si trois voisins, change l'élément  nn  en  " "
            Li2[nn] = " "
        else:                # Sinon, laisse inchangé l'élément  nn
            Li2[nn] = Li[nn]

    Li = Li2.copy() # Copie la nouvelle liste dans l'originale

    # Affiche les éléments de la liste
    for elem in Li:
        print(elem, end="")
    print()

s01a_ex06_turtle_marche_aleatoire_multiple.py   TOP
# s01a_ex05_turtle_marche_aleatoire_multiple.py
# Série 1, exercice 4
# Utilisant : turtle
# Simulation d'une marche aléatoire, la marche de l'ivrogne
# L'ivrogne tourne aléatoirement d'un angle de 90°, ou ne tourne pas

# c.f. https://docs.python.org/3/library/turtle.html
# c.f. https://docs.python.org/3/library/turtle.html#turtle.speed
from turtle import *
from random import randrange

MAXTurtle = 10 # nombre de tortues noires + 1 pour la rouge

setup(width=700, height=550, startx=10, starty=15) # Position et dimension de la fenêtre graphique
title("Marche aléatoire, marche de l'ivrogne")
speed(0) # 0 = vitesse maximale, 10 = rapide,  1 = lent
delay(0) # va encore plus vite

colorlist = ["#8000ff","#8000ff", "yellow", "green", "black", "blue", "brown", "purple", "cyan", "magenta"]
            # c.f. https://matplotlib.org/examples/color/named_colors.html

aList = list()
for ii in range(MAXTurtle+1):
    aList.append(Turtle(shape="classic")) # “arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”.
    aList[ii].color(colorlist[ii % len(colorlist)])
    aList[ii].speed(0) # 0 = vitesse maximale, 10 = rapide,  1 = lent
    #aList[ii].turtlesize(0.5)

#down()
nn = 0 # compte le nombre de pas fait par l'ivrogne.
while (nn < 300):
    nn += 1
    for ii in range(MAXTurtle+1):
        # Aléatoirement, tourne à gauche ou à droite
        aleat = randrange(3) # tire un nombre entier entre 0 et 2
        if (aleat == 0):
            aList[ii].left(90)
        elif (aleat == 1):
            aList[ii].right(90)
        # else: continue tout droit.

        # puis avance de ... pixels.
        aList[ii].forward(5)

ex_XXI00a_premiers_pas_avec_tkinter.py   TOP
Série XXI : Premiers pas avec tkinter. Exercice XXI.0 Jouons.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI00a_premiers_pas_avec_tkinter.py
Commence à utiliser la librairie graphique standard de python
'''

from tkinter import *  # importe toutes les classes du module tkinter

fen1 = Tk()
# instanciation d’un objet à partir d’une classe :
# Avec la classe Tk(), nous en créons une instance la fenêtre fen1
        
tex1 = Label(fen1, text='Bonjour tout le monde !', fg='red')
# objet "widget" tex1 créé par instanciation de la classe Label()

tex1.pack() # active une méthode associée à l’objet tex1

bou1 = Button(fen1, text='Quitter', command = fen1.destroy)
# création d’un autre widget « esclave » : un bouton.

bou1.pack()
# méthode pack() pour adapter la géométrie de la fenêtre au nouvel objet

fen1.mainloop()
# démarrage du réceptionnaire d’événements associé à la fenêtre

ex_XXI00b_premiers_pas_avec_tkinter.py   TOP
Série XXI : Premiers pas avec tkinter. Exercice XXI.0 Jouons. Avec positionnement de la fenêtre.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI00b_premiers_pas_avec_tkinter.py
Commence à utiliser la librairie graphique standard de python
'''

from tkinter import *  # importe toutes les classes du module tkinter

fen1 = Tk()
# instanciation d’un objet à partir d’une classe :
# Avec la classe Tk(), nous en créons une instance la fenêtre fen1

# Permet de positionner la fenêtre sur l'écran et de définir
# les dimensions de la fenêtre.
hauteur = 300
largeur = 600
xpos = 400
ypos = 300
fen1.wm_geometry("%dx%d+%d+%d" % (largeur, hauteur, xpos, ypos))
# Définit la position et les dimensions de la fenêtre.

#fen1.wm_geometry("+%d+%d" % (xpos, ypos))
# Ne définit que la position, hauteur et largeur par défaut.

        
tex1 = Label(fen1, text='Bonjour tout le monde !', fg='red')
# objet "widget" tex1 créé par instanciation de la classe Label()

tex1.pack() # active une méthode associée à l’objet tex1

bou1 = Button(fen1, text='Quitter', command = fen1.destroy)
# création d’un autre widget « esclave » : un bouton.

bou1.pack()
# méthode pack() pour adapter la géométrie de la fenêtre au nouvel objet

fen1.mainloop()
# démarrage du réceptionnaire d’événements associé à la fenêtre

ex_XXI01a_trace_de_lignes_dans_un_canevas.py   TOP
Serie XXI, exercice 1, tracé de lignes dans un canevas.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI01a_trace_de_lignes_dans_un_canevas.py
Utilisation de tkinter pour tracer des lignes dans un canevas
'''

from tkinter import *  # importe toutes les classes du module tkinter
from random import randrange

# --- définition des fonctions gestionnaires d'événements : ---
def drawline():
#==============
    "Tracé d'une ligne dans le canevas can1"
    global x1, y1, x2, y2
    can1.create_line(x1,y1,x2,y2,width=2,fill=coul)

    # modification des coordonnées pour la ligne suivante :
    y2, y1 = y2+10, y1-10


def changecolor():
#=================
    "Changement aléatoire de la couleur du tracé"
    global coul
    pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
    c = randrange(8) # => génère un nombre aléatoire de 0 à 7
    coul = pal[c]

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
x1, y1, x2, y2 = 10, 190, 190, 10 # coordonnées de la ligne
coul = 'dark green' # couleur de la ligne

fen1 = Tk()
# Création du widget principal ("maître") :
# instanciation d’un objet à partir d’une classe :
# Avec la classe Tk(), nous en créons une instance la fenêtre fen1

# Permet de positionner la fenêtre sur l'écran
xpos = 400
ypos = 300
fen1.wm_geometry("+%d+%d" % (xpos, ypos))

fen1.title("Tacer des lignes avec tkinter") # titre de la fenêtre

# création des widgets "esclaves" :
can1 = Canvas(fen1, bg='dark grey', height=200, width=200)
can1.pack(side=LEFT)
bou1 = Button(fen1, text='Quitter', command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Tracer une ligne', command=drawline)
bou2.pack()
bou3 = Button(fen1, text='Autre couleur', command=changecolor)
bou3.pack()

fen1.mainloop() # démarrage du réceptionnaire d’événements associé à la fenêtre

fen1.destroy() # destruction (fermeture) de la fenêtre

ex_XXI01b_trace_de_lignes_dans_un_canevas.py   TOP
Serie XXI, exercice 1, tracé de lignes dans un canevas. Avec quelques adjonctions.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI01b_trace_de_lignes_dans_un_canevas.py
Utilisation de tkinter pour tracer des lignes dans un canevas

Exemple d'appel de plusieurs fonctions en pressant sur un bouton.
'''

from tkinter import *  # importe toutes les classes du module tkinter
from random import randrange

# --- définition des fonctions gestionnaires d'événements : ---
def drawline():
#==============
    "Tracé d'une ligne dans le canevas can1"
    global x1, y1, x2, y2
    can1.create_line(x1,y1,x2,y2,width=2,fill=coul)

    # modification des coordonnées pour la ligne suivante :
    y2, y1 = y2+10, y1-10


def changecolor():
#=================
    "Changement aléatoire de la couleur du tracé"
    global coul
    pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
    c = randrange(8) # => génère un nombre aléatoire de 0 à 7
    coul = pal[c]
    return True

def combine_funcs(*funcs):
#=========================
# Sert à appeler plusieurs fonctions en une seule fonction !
    def combined_func(*args, **kwargs):
        for f in funcs:
            f(*args, **kwargs)
    return combined_func

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
x1, y1, x2, y2 = 10, 190, 190, 10 # coordonnées de la ligne
coul = 'dark green' # couleur de la ligne

fen1 = Tk()
# Création du widget principal ("maître") :
# instanciation d’un objet à partir d’une classe :
# Avec la classe Tk(), nous en créons une instance la fenêtre fen1

# Permet de positionner la fenêtre sur l'écran
xpos = 400
ypos = 300
fen1.wm_geometry("+%d+%d" % (xpos, ypos))

fen1.title("Tacer des lignes avec tkinter") # titre de la fenêtre

# création des widgets "esclaves" :
can1 = Canvas(fen1, bg='dark grey', height=200, width=200)
can1.pack(side=LEFT)
bou1 = Button(fen1, text='Quitter', command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Tracer une ligne', command=drawline)
bou2.pack()
bou3 = Button(fen1, text='Autre couleur', command=changecolor)
bou3.pack()

# Manière d'appeler deux fonctions (ou plus) avec un seul bouton.
bou4 = Button(fen1, text='Ligne & couleur', command=combine_funcs(changecolor, drawline))
bou4.pack()
# On aurait également pu écrire une fonction qui appelle les deux fonctions désirées.

# Autre manière d'appeler deux fonctions comme une seule :
bou5 = Button( fen1, text='2 Lignes & couleurs',
               command=lambda:[changecolor(), drawline(),changecolor(), drawline()])
bou5.pack()

fen1.mainloop() # démarrage du réceptionnaire d’événements associé à la fenêtre
fen1.destroy() # destruction (fermeture) de la fenêtre

ex_XXI03a_trace_de_lignes_dans_un_canevas.py   TOP
Série XXI, exercice 3, tracé de lignes dans un canevas, horizontales et verticales.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI03a_trace_de_lignes_dans_un_canevas.py
Utilisation de tkinter pour tracer des lignes dans un canevas
Les lignes sont horizontales et verticales
'''

from tkinter import *  # importe toutes les classes du module tkinter
from random import randrange

# --- définition des fonctions gestionnaires d'événements : ---
def drawline():
#==============
    "Tracé d'une ligne dans le canevas can1"
    global x1, y1, x2, y2
    can1.create_line(x1,  3,  x1, 203,     width=2, fill=coul)
    can1.create_line( 3, y1, 203, y1, width=2, fill=coul)

    # modification des coordonnées pour les lignes suivantes :
    x1 = x1+10
    y1 = y1+10


def changecolor():
#=================
    "Changement aléatoire de la couleur du tracé"
    global coul
    pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
    c = randrange(8) # => génère un nombre aléatoire de 0 à 7
    coul = pal[c]

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
x1, y1 = 3, 3 # coordonnées de la ligne
coul = 'dark green' # couleur de la ligne

fen1 = Tk()
# Création du widget principal ("maître") :
# instanciation d’un objet à partir d’une classe :
# Avec la classe Tk(), nous en créons une instance la fenêtre fen1

# Permet de positionner la fenêtre sur l'écran
xpos = 400
ypos = 300
fen1.wm_geometry("+%d+%d" % (xpos, ypos))

fen1.title("Tacer des lignes avec tkinter") # titre de la fenêtre

# création des widgets "esclaves" :
can1 = Canvas(fen1, bg='dark grey', height=208, width=208)
can1.pack(side=LEFT)
bou1 = Button(fen1, text='Quitter', command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Tracer une ligne', command=drawline)
bou2.pack()
bou3 = Button(fen1, text='Autre couleur', command=changecolor)
bou3.pack()

fen1.mainloop() # démarrage du réceptionnaire d’événements associé à la fenêtre

fen1.destroy() # destruction (fermeture) de la fenêtre

ex_XXI05a_lignes_avec_viseur.py   TOP
Série XXI, exercice 5, lignes avec un viseur.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI05a_lignes_avec_viseur.py
Utilisation de tkinter pour tracer des lignes dans un canevas
Les lignes sont horizontales et verticales
Un viseur est tracé, si le bouton est cliqué.
'''

from tkinter import *  # importe toutes les classes du module tkinter
from random import randrange

# --- définition des fonctions gestionnaires d'événements : ---
def drawline():
#==============
    "Tracé d'une ligne dans le canevas can1"
    global x1, y1, x2, y2
    can1.create_line(x1,  3,  x1, 203,     width=2, fill=coul)
    can1.create_line( 3, y1, 203, y1, width=2, fill=coul)

    # modification des coordonnées pour les lignes suivantes :
    x1 = x1+10
    y1 = y1+10

def drawline2():
#==============
    "Tracé de lignes de viseur dans le canevas can1"
    can1.create_line(104 - 20, 104     , 104 + 20, 104,      width=2, fill="red")
    can1.create_line(104     , 104 - 20, 104     , 104 + 20, width=2, fill="red")


def changecolor():
#=================
    "Changement aléatoire de la couleur du tracé"
    global coul
    pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
    c = randrange(8) # => génère un nombre aléatoire de 0 à 7
    coul = pal[c]

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
x1, y1 = 3, 3 # coordonnées de la ligne
coul = 'dark green' # couleur de la ligne

fen1 = Tk()
# Création du widget principal ("maître") :
# instanciation d’un objet à partir d’une classe :
# Avec la classe Tk(), nous en créons une instance la fenêtre fen1

# Permet de positionner la fenêtre sur l'écran
xpos = 400
ypos = 300
fen1.wm_geometry("+%d+%d" % (xpos, ypos))

fen1.title("Tacer des lignes avec tkinter") # titre de la fenêtre

# création des widgets "esclaves" :
can1 = Canvas(fen1, bg='dark grey', height=208, width=208)
can1.pack(side=LEFT)
bou1 = Button(fen1, text='Quitter', command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Tracer une ligne', command=drawline)
bou2.pack()
bou4 = Button(fen1, text='Trace le viseur', command=drawline2)
bou4.pack()
bou3 = Button(fen1, text='Autre couleur', command=changecolor)
bou3.pack()

fen1.mainloop() # démarrage du réceptionnaire d’événements associé à la fenêtre

fen1.destroy() # destruction (fermeture) de la fenêtre

ex_XXI08a_deux_dessins.py   TOP
Dessin de deux figures assez complexes.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI08a_deux_dessins.py
Utilisation de tkinter pour tracer des deux types de dessins.
'''

from tkinter import *

def cercle(x, y, r, coul ='black'):
#==================================
    "tracé d'un cercle de centre (x,y) et de rayon r"
    can.create_oval(x-r, y-r, x+r, y+r, outline=coul)
    
def figure_1():
#==============
    "dessiner une cible"
    # Effacer d'abord tout dessin préexistant :
    can.delete(ALL)

    # tracer les deux lignes (vert. Et horiz.) :
    can.create_line(100, 0, 100, can.winfo_height() -5, fill ='blue')
    can.create_line(0, 100, can.winfo_width() -5, 100, fill ='blue')
    
    # tracer plusieurs cercles concentriques :
    rayon = 15
    while rayon < 100:
        cercle(100, 100, rayon)
        rayon += 15 

    # affiche les dimensions du canvas.
    # 2 pixels de plus que lors de la création !
    print(can.winfo_width())
    print(can.winfo_height())

def figure_2():
#==============
    "dessiner un visage simplifié"
    # Effacer d'abord tout dessin préexistant :
    can.delete(ALL)

    # Les caractéristiques de chaque cercle sont
    # placées dans une liste de listes :
    cc = [[100, 100, 80, 'red'], # visage
          [70, 70, 15, 'blue'], # yeux
          [130, 70, 15, 'blue'], 
          [70, 70, 5, 'black'], 
          [130, 70, 5, 'black'],
          [44, 115, 20, 'red'], # joues
          [156, 115, 20, 'red'],
          [100, 95, 15, 'purple'], # nez
          [100, 145, 30, 'purple']] # bouche

    # on trace tous les cercles à l'aide d'une boucle :
    ii =0
    while ii < len(cc): # parcours de la liste
        el = cc[ii] # chaque élément est lui-même une liste
        cercle(el[0], el[1], el[2], el[3])
        ii += 1

##### Programme principal : ############
fen = Tk()
can = Canvas(fen, width=200, height=200, bg='ivory')
can.pack(side=TOP, padx=5, pady=5)
b1 = Button(fen, text='dessin 1', command=figure_1)
b1.pack(side=LEFT, padx=3, pady=3)
b2 = Button(fen, text='dessin 2', command=figure_2)
b2.pack(side=RIGHT, padx=3, pady=3)

# Affiche des valeurs incorrectes
print(can.winfo_width())
print(can.winfo_height())

# fen.update() permet de récupérer des valeurs correctes de taille de canvas.
# 2 pixels de plus que lors de la création.
fen.update()
print(can.winfo_width())
print(can.winfo_height())

fen.mainloop()

ex_XXI09a_olympique.py   TOP
Dessin des anneaux olympiques
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI09a_olympique.py
Utilisation de tkinter pour tracer des 5 anneaux olympiques
'''

from tkinter import *

def cercle(x, y, r, coul ='black'):
#==================================
    "tracé d'un cercle de centre (x,y) et de rayon r"
    can.create_oval(x-r, y-r, x+r, y+r, outline=coul, width=5)
    # c.f. http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/create_oval.html

def figure_1():
#==============
    "dessin des 5 anneaux olympique"
    # Effacer d'abord tout dessin préexistant :
    can.delete(ALL)

    # Les caractéristiques de chaque cercle sont
    # placées dans une liste de listes :
    cc = [[ 50,  80, 40, 'cyan'],   # 'cyan' = '#00FFFF' 
          [100,  80, 40, 'black'],  # 'black' = '#000000' 
          [150,  80, 40, 'red'],    # 'red' = '#FF0000' 
          [ 75, 110, 40, 'yellow'], # 'cyan' = '#00FFFF' 
          [125, 110, 40, 'green']]  # 'green' = '#00FF00' 

    # on trace tous les cercles à l'aide d'une boucle :
    ii =0
    while ii < len(cc): # parcours de la liste
        el = cc[ii] # chaque élément est lui-même une liste
        cercle(el[0], el[1], el[2], el[3])
        ii += 1

##### Programme principal : ############
fen = Tk()
can = Canvas(fen, width=200, height=200, bg='#808080') # '#FFFFFF' = 'white'
can.pack(side=TOP, padx=5, pady=5)
b1 = Button(fen, text='Olympique', command=figure_1)
b1.pack(side=LEFT, padx=3, pady=3)
b2 = Button(fen, text='Quitter', command=fen.destroy)
b2.pack(side=RIGHT, padx=3, pady=3)
fen.mainloop()

ex_XXI09b_olympique.py   TOP
Dessin des anneaux olympiques, avec un bouton par anneaux.
Le code est plus court que le précédent !
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI09b_olympique.py
Utilisation de tkinter pour tracer des 5 anneaux olympiques
Un tracé par bouton pressé
'''

from tkinter import *

def cercle(x, y, r, coul ='black'):
#==================================
    "tracé d'un cercle de centre (x,y) et de rayon r"
    can.create_oval(x-r, y-r, x+r, y+r, outline=coul, width=5)
    # c.f. http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/create_oval.html

def figure_1(param):
#===================
    "dessin des 5 anneaux olympique"
    # Les caractéristiques de chaque cercle sont
    # placées dans une liste de listes :
    cc = [[ 50,  80, 40, 'cyan'],   # 'cyan' = '#00FFFF' 
          [100,  80, 40, 'black'],  # 'black' = '#000000' 
          [150,  80, 40, 'red'],    # 'red' = '#FF0000' 
          [ 75, 110, 40, 'yellow'], # 'cyan' = '#00FFFF' 
          [125, 110, 40, 'green']]  # 'green' = '#00FF00' 

    # on trace le cercle sélectionné dans "param"
    el = cc[param] # Sélectionne le cercle désiré
    cercle(el[0], el[1], el[2], el[3])
    
##### Programme principal : ############
fen = Tk()
can = Canvas(fen, width=200, height=200, bg='#808080') # '#FFFFFF'='white'  '#808080'='gray'
can.pack(side=TOP, padx=5, pady=5)
for nn in range(0,5):
    bb = Button(fen, text='Olympique' + str(nn), command=lambda arg=nn : figure_1(arg))
    bb.pack(side=LEFT, padx=3, pady=3)
    
# Pour le bouton de fermeture de l'application
b9 = Button(fen, text='Quitter', command=fen.destroy)
b9.pack(side=RIGHT, padx=3, pady=3)
fen.mainloop()

ex_XXI12a_Calculatrice.py   TOP
Une calculatrice minimaliste, très simple, pas visuel.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI12a_Calculatrice.py
Création d'une calculatrice minimaliste.
Utilisant la bibliothèque graphique tkinter et le module math.
'''

from tkinter import *
from math import *

# définition de l'action à effectuer si l'utilisateur actionne
# la touche "enter" alors qu'il édite le champ d'entrée :

def evaluer(event):
     chaine.configure(text = "Résultat = " + str(eval(entree.get())))

# ----- Programme principal : -----
fenetre = Tk()
entree = Entry(fenetre)
entree.bind("<Return>", evaluer)
chaine = Label(fenetre)
entree.pack()
chaine.pack()
fenetre.mainloop()

ex_XXI13a_detection_souris.py   TOP
Détection de la position de la souris et des clics de la souris.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI13a_detection_souris.py
Détection de la position de la souris et des clics de la souris.
'''

from tkinter import *

def pointeur(event):
#===================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    chaine.configure( text = "Clic détecté en X =" + str(event.x) \
                      + ", Y =" + str(event.y) \
                      + ", x_root =" + str(event.x_root)
                      + ", y_root =" + str(event.y_root)
                      + ", num =" + str(event.num)
                      + ", char =" + str(event.char)
                      + ", keysym =" + str(event.keysym)
                      + ", keycode =" + str(event.keycode)
                      + ", widget =" + str(event.widget)
                      + ", width =" + str(event.width)
                      + ", height =" + str(event.height)
                      + ", type =" + str(event.type))

fen = Tk()
cadre = Frame(fen, width =200, height =150, bg="light yellow")
cadre.bind("<Button-1>", pointeur)
cadre.bind("<Button-2>", pointeur)
cadre.bind("<Shift-Button-3>", pointeur)  # Ne réagit que si "Shift" est aussi pressé.
#cadre.bind("<Enter>", pointeur)  # Entrée de la souris dans le cadre
#cadre.bind("<Leave>", pointeur)  # Sortie de la souris du cadre
#cadre.bind_all("<Return>", pointeur)
#cadre.bind_all("a", pointeur)
#cadre.bind_all("<space>", pointeur)
#cadre.bind_all("<Key>", pointeur) # Pour toutes les touches
#cadre.bind_all("<KeyRelease>", pointeur) # Pour toutes les touches
cadre.pack()
chaine = Label(fen)
chaine.pack()

fen.mainloop()

ex_XXI14x_methode_grid.py   TOP
Exemple très court et simple de positionnement avec la méthode "grid".
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI14x_methode_grid.py
Utilisation de la méthode "grid" pour contrôler la disposition des widgets
'''

from tkinter import *

fen1 = Tk()
txt1 = Label(fen1, text = 'Premier champ :')
txt2 = Label(fen1, text = 'Second :')
entr1 = Entry(fen1)
entr2 = Entry(fen1)
txt1.grid(row =0, sticky =E)
txt2.grid(row =1, sticky =E)
entr1.grid(row =0, column =1)
entr2.grid(row =1, column =1)
fen1.mainloop()

ex_XXI14y_methode_grid.py   TOP
Exemple d'utilisation de la méthode "grid" pour positionner des widgets.
Exemple d'insertion d'une image dans un canevas.
L'image est disponible ici.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI14y_methode_grid.py
Utilisation de la méthode "grid" pour contrôler la disposition des widgets
'''

from tkinter import *

fen1 = Tk()
# Permet de positionner la fenêtre sur l'écran
fen1.wm_geometry("+%d+%d" % (400, 100))
# Définit la position de la fenêtre.
# Pour définir également la dimension :
# fen1.wm_geometry("%dx%d+%d+%d" % (largeur, hauteur, xpos, ypos))

# création de widgets 'Label' et 'Entry' :
txt1 = Label(fen1, text ='Premier champ :')
txt2 = Label(fen1, text ='Second :')
txt3 = Label(fen1, text ='Troisième :')
entr1 = Entry(fen1)
entr2 = Entry(fen1)
entr3 = Entry(fen1)

# création d'un widget 'Canvas' contenant une image bitmap :
can1 = Canvas(fen1, width =160, height =160, bg ='white')
photo = PhotoImage(file ='martin_p.png')
item = can1.create_image(80, 80, image =photo)

# Mise en page à l'aide de la méthode 'grid' :
txt1.grid(row =1, sticky =E)
txt2.grid(row =2, sticky =E)
txt3.grid(row =3, sticky =E)
entr1.grid(row =1, column =2)
entr2.grid(row =2, column =2)
entr3.grid(row =3, column =2)
can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)

# démarrage :
fen1.mainloop()

ex_XXI14z_magie.py   TOP
Code de préparation à la semestrielle de décembre 2018.
Un petit tour de "Mathémagie", utilisant les Widgets "Label", "Entry" et "Button".
Lit des données depuis un champ "Entry" et écrit dans un tel champ.
Voir le cours d'OC informatique de 4ème, 2018 - 2019, pour l'énoncé du "tour de magie".
# ex_XXI14z_magie.py
'''
Un tour de magie.
Une personne calcule sur une calculatrice le produit suivant :
117 * n1 * n2 * n3
n1, n2, n3 sont trois nombres de deux chiffres.
Du résultat qu'il obtient,
Il choisi la position d'un chiffre différent de zéro.
Il tape la suite des chiffres qui apparaîssent dans le résultat,
sauf le chiffre qui apparaît à la position qu'il a choisi.
Lorsque c'est fait, en cliquant sur le bouton "Magique",
l'ordinateur indique quelle est le chiffre que la personne a omise.
'''

from tkinter import *  # importe toutes les classes du module tkinter

def Magique():
#=============
    '''Fonction appelée pour réaliser le tour de magie'''
    string_entry1 = entry1.get()    
    list_nbr = list(string_entry1)
    somme = 0
    # Boucle pour faire la somme des chiffres donnés dans l'"entry1"
    for ch in list_nbr:
        somme += int(ch)
        #print(somme)

    # Affichage du chiffre omis par la personne
    chiffre_manquant = 9 - (somme % 9)
    #print("Le chiffre manquant est :", chiffre_manquant)
    entry2.delete(0, END)
    entry2.insert(0, chiffre_manquant)
    entry2.insert(0, "Le chiffre manquant est : ")

def Magique2(event):
#===================
    # Puisque cette fonction est appelée lors d'un événement,
    # elle a un paramètre. Elle est donc différente de la fonction
    # "Magique", qui n'a pas de paramètre.
    Magique()
    
def Quitter(event):
#================
    '''Ferme la fenêtre et quitte le programme'''
    fen1.destroy()
    
#------ Programme principal -------

# Les variables suivantes seront utilisées de manière globale :
coul = 'red'
numCoul = 4

fen1 = Tk()
# Création du widget principal ("maître") :

# Permet de positionner la fenêtre sur l'écran
xpos = 400
ypos = 300
fen1.wm_geometry("+%d+%d" % (xpos, ypos))

fen1.title("Quelques dessins simples avec tkinter") # Titre de la fenêtre

# création des widgets "esclaves" :

# création de widgets 'Label' et 'Entry' :
Label(fen1, text ='Voici un tour de magie qui vous surprendra.').grid(row=1, columnspan=2, sticky =W)
Label(fen1, text ='Sur une calculatrice, faites le calcule suivant :').grid(row=2, columnspan=2, sticky =W)
Label(fen1, text ='117 * nb1 * nb2 * nb3 :').grid(row=3, columnspan=2, sticky =W)
Label(fen1, text ='nb1, nb2 et nb3 sont trois nombres de deux chiffres').grid(row=4, columnspan=2, sticky =W)
Label(fen1, text ='que vous choisissez comme vous voulez.').grid(row=5, columnspan=2, sticky =W)
Label(fen1, text ='Du résultat obtenu, choisissez la position...').grid(row=6, columnspan=2, sticky =W)
Label(fen1, text ='').grid(row=7, columnspan=2, sticky =W)
Label(fen1, text ='Tapez la suite des chiffres, en omettant celui de la case choisie :').grid(row=8, columnspan=2, sticky =W)

Label(fen1, text ='Chiffres :').grid(row=9, column=0, sticky =W)
Label(fen1, text ='Chiffre manquant :').grid(row=10, column=0, sticky =W)
entry1 = Entry(fen1, width=30)
entry2 = Entry(fen1, width=30)

# Mise en page à l'aide de la méthode 'grid' :
entry1.grid(row =9,  column=1, sticky=W)
entry2.grid(row =10, column=1, sticky=W)

# c.f. http://effbot.org/tkinterbook/grid.htm
bouQuit = Button(fen1, text='Quitter', command=fen1.destroy)
bouQuit.grid(row =11, column=1, sticky=E)

bouTest = Button(fen1, text='Magique', command=Magique)
bouTest.grid(row =11, column=0, sticky=W)

fen1.bind("<Return>", Magique2) # Pour effectuer la divination magique !
fen1.bind("<KP_Enter>", Magique2) # Pour effectuer la divination magique en pressant sur le "enter" du clavier numérique
fen1.bind("<Escape>", Quitter) # Pour quitter le programme en pressant la touche "Esc"

fen1.mainloop() # Démarrage du réceptionnaire d’événements associé à la fenêtre
try:
    fen1.destroy() # Destruction (fermeture) de la fenêtre
except:
    # On ne fait rien.
    print("terminé")
    

ex_XXI15a_animation.py   TOP
Déplacement d'un disque, en fonction de boutons pressés.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI15a_animation_grid.py
Animation d'un objet dans une fenêtre.
'''

from tkinter import *

# procédure générale de déplacement :
def avance(gd, hb):
    global x1, y1
    x1, y1 = x1 +gd, y1 +hb
    can1.coords(oval1, x1, y1, x1+30, y1+30)

# gestionnaires d'événements :
def depl_gauche():
    avance(-10, 0)

def depl_droite():
    avance(10, 0)

def depl_haut():
    avance(0, -10)

def depl_bas():
    avance(0, 10) 

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
x1, y1 = 10, 10 # coordonnées initiales

# Création du widget principal ("maître") :
fen1 = Tk()
fen1.title("Exercice d'animation avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='red')
can1.pack(side=LEFT)
Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)
Button(fen1,text='Gauche',command=depl_gauche).pack()
Button(fen1,text='Droite',command=depl_droite).pack()
Button(fen1,text='Haut',command=depl_haut).pack()
Button(fen1,text='Bas',command=depl_bas).pack()

# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI15a_deux_astres.py   TOP
Deux objets dans une fenêtre.
Avec 4 bouttons par objets, permet de déplacer chacun de ses objets.
En permanence la distance entre les objets sont affichés.

Introduction de plusieurs notions :
1) avec l'instruction 'labmda', appel depuis un bouton d'une fonction avec des paramètres.
2) adjonction d'un texte dans un canvas
3) modification du texte du canvas
4) calcul de la racine carrée (sqrt) d'un nombre et mise au carré (**)
5) formattage d'un nombre à firgule pour l'afficher avec deux chiffres après la virgule, c.f. https://pyformat.info/
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI15a_deux_astres.py
Deux objets dans une fenêtre.
Avec 4 bouttons par objets, permet de déplacer chacun de ses objets
En permanence la distance entre les objets sont affichés.

Introduction de plusieurs notions :
1) avec l'instruction 'labmda', appel depuis un bouton d'une fonction avec des paramètres.
2) adjonction d'un texte dans un canvas
3) modification du texte du canvas
4) calcul de la racine carrée (sqrt) d'un nombre et mise au carré (**)
5) formattage d'un nombre à firgule pour l'afficher avec deux chiffres après la virgule, c.f. https://pyformat.info/
'''

from tkinter import *
import math   # c.f. https://docs.python.org/3/library/math.html

def deplacement(Num_Objet, dx, dy):
#==================================
    # Procédure générale de déplacement de la boule numéro : Num_Objet,
    # de  dx  horizontalement et  dy  verticalement.
    global x1, y1, x2, y2
    if (Num_Objet == oval1):
        x1, y1 = x1 + dx, y1 + dy
        can1.coords(oval1, x1, y1, x1+30, y1+30)
    if (Num_Objet == oval2):
        x2, y2 = x2 + dx, y2 + dy
        can1.coords(oval2, x2, y2, x2+30, y2+30)

    distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) # Distance en pixels entre les deux boules.
    
    # Permet de modifier le contenu du texte    
    # Pour formatter la conversion en string d'un nombre, c.f. : https://pyformat.info/
    can1.itemconfigure(text1, text='Distance =' + '{:9.2f}'.format(distance) + ' px')

    # Cette manière ne permet pas de formatter le nombre à son affichage.
    # can1.itemconfigure(text1, text='Distance =' + str(distance) + ' px')

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
x1, y1 = 10, 10 # coordonnées initiales de la première boule
x2, y2 = 20, 100 # coordonnées initiales de la deuxième boule

# Création du widget principal ("maître") :
fen1 = Tk()
fen1.title("Animation de deux astres avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='red')
oval2 = can1.create_oval(x2,y2,x2+30,y2+30,width=2,fill='blue')
# label1 = can1.create_(fen1, text ='Donnez une date,')

# text1 est un numéro référençant l'objet 'text1' du canevas can1
text1 = can1.create_text( 10,280,    # position x, y
                          anchor=W,  # NW, N, NE, W, E, SW, S, SE, CENTER (défaut)
                          fill="darkblue",
                          font="Arial 20 italic bold",
                          text="Distance = ")
can1.pack(side=LEFT) # insertion du canvas dans la fenêtre.

# Création d'une série de 9 boutons
Button(fen1,text='Gauche 1',command=lambda arg1=1, arg2=-10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Droite 1',command=lambda arg1=1, arg2=10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Haut 1',command=lambda arg1=1, arg2=0, arg3=-10 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Bas 1',command=lambda arg1=1, arg2=0, arg3=10 : deplacement(arg1, arg2, arg3) ).pack()

Button(fen1,text='Gauche 2',command=lambda arg1=2, arg2=-10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Droite 2',command=lambda arg1=2, arg2=10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Haut 2',command=lambda arg1=2, arg2=0, arg3=-10 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Bas 2',command=lambda arg1=2, arg2=0, arg3=10 : deplacement(arg1, arg2, arg3) ).pack()

Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)

# Pour que l'affichage de la distance se fasse dès le départ
deplacement(1, 0, 0) # donc pas de déplacement.
    
# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI15b_deux_astres.py   TOP
Amélioration de : ex_XXI15a_deux_astres.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI15b_deux_astres.py
Deux objets dans une fenêtre.
Avec 4 bouttons par objets, permet de déplacer chacun de ses objets
En permanence la distance entre les objets sont affichés.

On reprend le programme ex_XXI15a_deux_astres.py
On simplifie, en utilisant les coordonnées des objets et non des variables intermédiaires.

Avec plusieurs notions :
1) avec l'instruction 'labmda', appel depuis un bouton d'une fonction avec des paramètres.
2) adjonction d'un texte dans un canvas
3) modification du texte du canvas
4) calcul de la racine carrée (sqrt) d'un nombre et mise au carré (**)
5) formattage d'un nombre à firgule pour l'afficher avec deux chiffres après la virgule, c.f. https://pyformat.info/
'''

from tkinter import *
import math   # c.f. https://docs.python.org/3/library/math.html

def deplacement(Num_Objet, dx, dy):
#==================================
    # Procédure générale de déplacement de la boule numéro : Num_Objet,
    # de  dx  horizontalement et  dy  verticalement.

    can1.move(Num_Objet, dx, dy) # Déplacement de l'objet
    
    Pos1 =can1.coords(oval1) # = [left, top, right, bottom], coordonnées de l'objet : oval1
    Pos2 =can1.coords(oval2) # = [left, top, right, bottom], coordonnées de l'objet : oval2
    
    distance = math.sqrt((Pos2[0] - Pos1[0])**2 + (Pos2[1] - Pos1[1])**2) # Distance en pixels entre les deux boules.
    
    # Permet de modifier le contenu du texte    
    # Pour formatter la conversion en string d'un nombre, c.f. : https://pyformat.info/
    # c.f. http://effbot.org/tkinterbook/canvas.htm
    can1.itemconfigure(text1, text='Distance =' + '{:9.2f}'.format(distance) + ' px')

    # Cette manière ne permet pas de formatter le nombre à son affichage.
    # can1.itemconfigure(text1, text='Distance =' + str(distance) + ' px')

#------ Programme principal -------

# Création du widget principal ("maître") :
fen1 = Tk()
fen1.title("Animation avec la souris de deux astres avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

# text1 est un numéro référençant l'objet 'text1' du canevas can1
text1 = can1.create_text( 10,280,    # position x, y
                          anchor=W,  # NW, N, NE, W, E, SW, S, SE, CENTER (défaut)
                          fill="darkblue",
                          font="Arial 20 italic bold",
                          text="Distance = ")

can1.pack(side=LEFT) # insertion du canvas dans la fenêtre.

# Création d'une série de 9 boutons
Button(fen1,text='Gauche 1',command=lambda arg1=1, arg2=-10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Droite 1',command=lambda arg1=1, arg2=10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Haut 1',command=lambda arg1=1, arg2=0, arg3=-10 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Bas 1',command=lambda arg1=1, arg2=0, arg3=10 : deplacement(arg1, arg2, arg3) ).pack()

Button(fen1,text='Gauche 2',command=lambda arg1=2, arg2=-10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Droite 2',command=lambda arg1=2, arg2=10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Haut 2',command=lambda arg1=2, arg2=0, arg3=-10 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Bas 2',command=lambda arg1=2, arg2=0, arg3=10 : deplacement(arg1, arg2, arg3) ).pack()

Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)

# Pour que l'affichage de la distance se fasse dès le départ
deplacement(1, 0, 0) # donc pas de déplacement.
    
# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI15c_deux_astres.py   TOP
On reprend ex_XXI15b_deux_astres.py
On rajoute la fonctionnalité teste, que lors de la pression sur le bouton pour faire descendre
la boule bleue, elle descent tand que l'on appuie sur le bouton
C'est une incursion dans l'animation automatique, qui est vu dans : ex_XXI25a_animation_automatique.py
c.f. Bouge_bas_bleu ... et
l'instruction : fen1.after(50, Bouge_bas_bleu)
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI15c_deux_astres.py
On reprend  ex_XXI15b_deux_astres.py
On rajoute la fonctionnalité teste, que lors de la pression sur le bouton pour faire descendre
la boule bleue, elle descent tand que l'on appuie sur le bouton
C'est une incursion dans l'animation automatique, qui est vu dans : ex_XXI25a_animation_automatique.py
c.f. Bouge_bas_bleu ...   et
l'instruction : fen1.after(50, Bouge_bas_bleu)
'''

from tkinter import *
import math   # c.f. https://docs.python.org/3/library/math.html

def deplacement(Num_Objet, dx, dy):
#==================================
    # Procédure générale de déplacement de la boule numéro : Num_Objet,
    # de  dx  horizontalement et  dy  verticalement.

    can1.move(Num_Objet, dx, dy) # Déplacement de l'objet
    
    Pos1 =can1.coords(oval1) # = [left, top, right, bottom], coordonnées de l'objet : oval1
    Pos2 =can1.coords(oval2) # = [left, top, right, bottom], coordonnées de l'objet : oval2
    
    distance = math.sqrt((Pos2[0] - Pos1[0])**2 + (Pos2[1] - Pos1[1])**2) # Distance en pixels entre les deux boules.
    
    # Permet de modifier le contenu du texte    
    # Pour formatter la conversion en string d'un nombre, c.f. : https://pyformat.info/
    # c.f. http://effbot.org/tkinterbook/canvas.htm
    can1.itemconfigure(text1, text='Distance =' + '{:9.2f}'.format(distance) + ' px')

    # Cette manière ne permet pas de formatter le nombre à son affichage.
    # can1.itemconfigure(text1, text='Distance =' + str(distance) + ' px')

def Bouge_bas_bleu():
#==================== 
    # Déplacement de la boule bleue vers le bas
    if Click_Bouge_bas_bleu > 0:
        deplacement(oval2, 0, 1)
        fen1.after(50, Bouge_bas_bleu) # demande de rappeler la fonction Bouge_bas_bleu après 50 [ms]

def Bouge_bas_bleu_go(event):
#============================ 
    # Déplacement de la boule bleue vers le bas
    global Click_Bouge_bas_bleu
    Click_Bouge_bas_bleu = 1
    Bouge_bas_bleu()

def Bouge_bas_bleu_stop(event):
#============================== 
    # Arrête le déplacement de la boule bleue vers le bas
    global Click_Bouge_bas_bleu
    Click_Bouge_bas_bleu = 0

#------ Programme principal -------

# les variables suivantes seront utilisées de manière globale :
Click_Bouge_bas_bleu = 0 # Est mis à 1 pour que la boule bleu bouge vers le bas

# Création du widget principal ("maître") :
fen1 = Tk()
fen1.title("Animation de deux astres avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

# text1 est un numéro référençant l'objet 'text1' du canevas can1
text1 = can1.create_text( 10,280,    # position x, y
                          anchor=W,  # NW, N, NE, W, E, SW, S, SE, CENTER (défaut)
                          fill="darkblue",
                          font="Arial 20 italic bold",
                          text="Distance = ")
can1.pack(side=LEFT) # insertion du canvas dans la fenêtre.

# Création d'une série de 9 boutons
Button(fen1,text='Gauche 1',command=lambda arg1=1, arg2=-10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Droite 1',command=lambda arg1=1, arg2=10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Haut 1',command=lambda arg1=1, arg2=0, arg3=-10 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Bas 1',command=lambda arg1=1, arg2=0, arg3=10 : deplacement(arg1, arg2, arg3) ).pack()

Button(fen1,text='Gauche 2',command=lambda arg1=2, arg2=-10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Droite 2',command=lambda arg1=2, arg2=10, arg3=0 : deplacement(arg1, arg2, arg3) ).pack()
Button(fen1,text='Haut 2',command=lambda arg1=2, arg2=0, arg3=-10 : deplacement(arg1, arg2, arg3) ).pack()
btn2bas = Button(fen1,text='Bas 2')
btn2bas.pack()

# Ainsi, la boule bleu part vers la bas lorsque l'on clique dessus.
btn2bas.bind("<Button-1>", Bouge_bas_bleu_go)
btn2bas.bind("<ButtonRelease-1>", Bouge_bas_bleu_stop)

Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)

# Pour que l'affichage de la distance se fasse dès le départ
deplacement(1, 0, 0) # donc pas de déplacement.
    
# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI16a_moins_de_boutons.py   TOP
Comme : ex_XXI15b_deux_astres.py , dans lequel des boutons ont été remplacés par des clicks sur les boules.
On positionne les objets en les cliquant-glissant avec la souris.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI16a_moins_de_boutons.py
Deux objets dans une fenêtre.

On reprend le programme ex_XXI15b_deux_astres.py, duquel on enlève des boutons
et on ajoute des fonctionnalités de la souris.
On positionne les objets en les cliquant-glissant avec la souris.

Avec plusieurs notions :
1) avec l'instruction 'labmda', appel depuis un bouton d'une fonction avec des paramètres.
2) adjonction d'un texte dans un canvas
3) modification du texte du canvas
4) calcul de la racine carrée (sqrt) d'un nombre et mise au carré (**)
5) formattage d'un nombre à firgule pour l'afficher avec deux chiffres après la virgule, c.f. https://pyformat.info/
'''

from tkinter import *
import math   # c.f. https://docs.python.org/3/library/math.html

def Mouse_press(event):
#======================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    # c.f. http://effbot.org/tkinterbook/canvas.htm

    # Converti les coordonnées de la souris en coordonnées du canvas
    x = can1.canvasx(event.x)
    y = can1.canvasy(event.y)

    if (0 == 1) and (event.num == 1): # pour des informations et le développement
        # c.f. : http://effbot.org/tkinterbook/canvas.htm#coordinate-systems
        # Voir aussi :  "find_closest"  ;  "find_enclosed"  ;  "find_overlapping"
        print(can1.find_closest(x, y), end=" ... ") # affiche le numéro de l'objet du canvas le plus proche de la souris
        print(can1.find_overlapping(x, y, x, y), end=" ... ") # affiche les numéros des objets du canvas où l'on a cliqué
        print(len(can1.find_overlapping(x, y, x, y)), end=" ... ") # nombre d'objets où l'on a cliqué
        print("   ", event.num, event.type)

    global gloNum, glPosDX, glPosDY
    objectsList = can1.find_overlapping(x, y, x, y)
    if (len(objectsList) > 0):
        gloNum = objectsList[0] # objet sélectionné

        # Position de l'objet sur lequel on a cliqué
        Pos =can1.coords(gloNum) # = [left, top, right, bottom], coordonnées de l'objet : oval1
        
        # Mémorise le décalage entre l'endroit où l'on a cliqué sur l'objet et la position de l'objet
        glPosDX = Pos[0] - x
        glPosDY = Pos[1] - y

def Mouse_move(event):
#======================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    # c.f. http://effbot.org/tkinterbook/canvas.htm

    # can1.itemconfigure(text1, text = 'X =' + str(event.x) + 'Y =' + str(event.y))

    # Converti les coordonnées de la souris en coordonnées du canvas
    x = can1.canvasx(event.x)
    y = can1.canvasy(event.y)
    
    if (gloNum != 0):
        # Un objet est délectionné, déplace-le
        can1.coords(gloNum, x+glPosDX, y+glPosDY, x+glPosDX+30, y+glPosDY+30)
    
        Pos1 =can1.coords(oval1) # = [left, top, right, bottom], coordonnées de l'objet : oval1
        Pos2 =can1.coords(oval2) # = [left, top, right, bottom], coordonnées de l'objet : oval2
        
        distance = math.sqrt((Pos2[0] - Pos1[0])**2 + (Pos2[1] - Pos1[1])**2) # Distance en pixels entre les deux boules.
        
        # Permet de modifier le contenu du texte    
        # Pour formatter la conversion en string d'un nombre, c.f. : https://pyformat.info/
        # c.f. http://effbot.org/tkinterbook/canvas.htm
        can1.itemconfigure(text1, text='Distance =' + '{:9.2f}'.format(distance) + ' px')


def Mouse_release(event):
#========================
    # Plus d'objet sélectionné.
    global gloNum
    gloNum = 0

def Reset():
#===========
    # Pour remettre les objets à une place fixe.
    can1.coords(oval1, 20,  20, 20+30,  20+30)
    can1.coords(oval2, 30, 100, 30+30, 100+30)

#------ Programme principal -------
# Variables globales
gloNum = 0 # numéro de l'objet du canvas sélectionné par un clique, lorsque le clique est maintenu

# Pour mémoriser le décalage entre l'endroit où l'on a cliqué sur l'objet et la position de l'objet
glPosDX = 0
glPosDY = 0

# Création du widget principal ("maître") :
fen1 = Tk()
fen1.title("Animation avec la souris de deux astres avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

# text1 est un numéro référençant l'objet 'text1' du canevas can1
text1 = can1.create_text( 10,280,    # position x, y
                          anchor=W,  # NW, N, NE, W, E, SW, S, SE, CENTER (défaut)
                          fill="darkblue",
                          font="Arial 20 italic bold",
                          text="Distance = ")

# c.f. : https://www.python-course.eu/tkinter_events_binds.php
can1.bind("<Motion>", Mouse_move) # à chaque déplacement de la souris, la fonction  est appelée
can1.bind("<Button-1>", Mouse_press) # à chaque click gauche de la souris, la fonction est appelée
can1.bind("<ButtonRelease-1>", Mouse_release) # à chaque click gauche relaché de la souris, la fonction est appelée

can1.pack(side=LEFT) # insertion du canvas dans la fenêtre.

# Création du bouton pour quitter
Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)

# Pour repositionner les objets à des places par défaut.
Button(fen1,text='Reset',command=Reset).pack(side=BOTTOM)
    
# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI22a_avec_une_jolie_trace.py   TOP
On reprend le programme ex_XXI16a_Moins_de_boutons.py
Lorsque l'on déplace un objet, il laisse une trace.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI22a_avec_une_jolie_trace.py

On reprend le programme ex_XXI16a_Moins_de_boutons.py
Lorsque l'on déplace un objet, il laisse une trace.
On a aussi la possibilité d'effacer le dessin tracé.
'''

from tkinter import *
import math   # c.f. https://docs.python.org/3/library/math.html

def Mouse_press(event):
#======================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    # c.f. http://effbot.org/tkinterbook/canvas.htm

    # Converti les coordonnées de la souris en coordonnées du canvas
    x = can1.canvasx(event.x)
    y = can1.canvasy(event.y)

    if (0 == 1) and (event.num == 1): # pour des informations et le développement
        # c.f. : http://effbot.org/tkinterbook/canvas.htm#coordinate-systems
        # Voir aussi :  "find_closest"  ;  "find_enclosed"  ;  "find_overlapping"
        print(can1.find_closest(x, y), end=" ... ") # affiche le numéro de l'objet du canvas le plus proche de la souris
        print(can1.find_overlapping(x, y, x, y), end=" ... ") # affiche les numéros des objets du canvas où l'on a cliqué
        print(len(can1.find_overlapping(x, y, x, y)), end=" ... ") # nombre d'objets où l'on a cliqué
        print("   ", event.num, event.type)

    global gloNum, glPosDX, glPosDY
    objectsList = can1.find_overlapping(x, y, x, y)
    if (len(objectsList) > 0):
        gloNum = objectsList[0] # objet sélectionné

        # Position de l'objet sur lequel on a cliqué
        Pos =can1.coords(gloNum) # = [left, top, right, bottom], coordonnées de l'objet : oval1
        
        # Mémorise le décalage entre l'endroit où l'on a cliqué sur l'objet et la position de l'objet
        glPosDX = Pos[0] - x
        glPosDY = Pos[1] - y

def Mouse_move(event):
#======================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    # c.f. http://effbot.org/tkinterbook/canvas.htm

    # can1.itemconfigure(text1, text = 'X =' + str(event.x) + 'Y =' + str(event.y))

    # Converti les coordonnées de la souris en coordonnées du canvas
    x = can1.canvasx(event.x)
    y = can1.canvasy(event.y)
    
    if (gloNum != 0):
        # Un objet est délectionné, déplace-le

        Pos =can1.coords(gloNum) # = [left, top, right, bottom], coordonnées de l'objet sélectionné
        
        can1.coords(gloNum, x+glPosDX, y+glPosDY, x+glPosDX+30, y+glPosDY+30)
    
        Pos1 =can1.coords(oval1) # = [left, top, right, bottom], coordonnées de l'objet : oval1
        Pos2 =can1.coords(oval2) # = [left, top, right, bottom], coordonnées de l'objet : oval2
        
        distance = math.sqrt((Pos2[0] - Pos1[0])**2 + (Pos2[1] - Pos1[1])**2) # Distance en pixels entre les deux boules.
        
        # Permet de modifier le contenu du texte    
        # Pour formatter la conversion en string d'un nombre, c.f. : https://pyformat.info/
        # c.f. http://effbot.org/tkinterbook/canvas.htm
        can1.itemconfigure(text1, text='Distance =' + '{:9.2f}'.format(distance) + ' px')

        # Trace une ligne entre les positions initiale et finale du centre de l'objet
        if (gloNum == oval1): # Sélectionne la couleur en fonction de l'objet sélectionné.
            theColor = "red"
        else:
            theColor = "blue"
    
        can1.create_line(Pos[0] + 30//2, Pos[1] + 30//2, x+glPosDX+30//2, y+glPosDY+30//2, width=2, fill=theColor)


def Mouse_release(event):
#========================
    # Plus d'objet sélectionné.
    global gloNum
    gloNum = 0

def Reset():
#===========
    # Pour remettre les objets à une place fixe. Et effacer les traits
    global oval1, oval2
    can1.coords(oval1, 20,  20, 20+30,  20+30)
    can1.coords(oval2, 30, 100, 30+30, 100+30)

    # Efface tous les objets dans le canvas
    can1.delete(ALL)

    # Recrée les deux boules de bases.
    oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
    oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

#------ Programme principal -------
# Variables globales
gloNum = 0 # numéro de l'objet du canvas sélectionné par un clique, lorsque le clique est maintenu

# Pour mémoriser le décalage entre l'endroit où l'on a cliqué sur l'objet et la position de l'objet
glPosDX = 0
glPosDY = 0

# Création du widget principal ("maître") :
fen1 = Tk()

# Permet de positionner la fenêtre sur l'écran
xpos = 500
ypos = 100
fen1.wm_geometry("+%d+%d" % (xpos, ypos))
fen1.title("Animation avec la souris de deux astres avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

# text1 est un numéro référençant l'objet 'text1' du canevas can1
text1 = can1.create_text( 10,280,    # position x, y
                          anchor=W,  # NW, N, NE, W, E, SW, S, SE, CENTER (défaut)
                          fill="darkblue",
                          font="Arial 20 italic bold",
                          text="Distance = ")

# c.f. : https://www.python-course.eu/tkinter_events_binds.php
can1.bind("<Motion>", Mouse_move) # à chaque déplacement de la souris, la fonction  est appelée
can1.bind("<Button-1>", Mouse_press) # à chaque click gauche de la souris, la fonction est appelée
can1.bind("<ButtonRelease-1>", Mouse_release) # à chaque click gauche relaché de la souris, la fonction est appelée

can1.pack(side=LEFT) # insertion du canvas dans la fenêtre.

# Création du bouton pour quitter
Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)

# Pour repositionner les objets à des places par défaut.
Button(fen1,text='Reset',command=Reset).pack(side=BOTTOM)
    
# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI22b_avec_une_jolie_trace.py   TOP
On reprend le programme ex_XXI22b_avec_une_jolie_trace.py
Le canvas prend toute la taille de la fenêtre, moins la place pour les boutons.
Lorsque la fenêtre est redimensionnée, le canvas aussi et le texte est déplacé.
c.f. :
def Canvas_resise(event):
can1.bind("<Configure>", Canvas_resise) # Appel de la fonction au redimentionnement de la fenêtre.
can1.pack(side=LEFT, fill="both", expand=True) # insertion du canvas dans la fenêtre.
def Window_resise(event): Montre comment obtenir des informations sur la fenêtre et l'écran.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI22b_avec_une_jolie_trace.py

On reprend le programme ex_XXI22b_avec_une_jolie_trace.py
Le canvas prend toute la taille de la fenêtre, moins la place pour les boutons.
Lorsque la fenêtre est redimensionnée, le canvas aussi et le texte est déplacé.
c.f. :
def Canvas_resise(event):
can1.bind("<Configure>", Canvas_resise) # Appel de la fonction au redimentionnement de la fenêtre.
can1.pack(side=LEFT, fill="both", expand=True) # insertion du canvas dans la fenêtre.
def Window_resise(event):  Montre comment obtenir des informations sur la fenêtre et l'écran.
'''

from tkinter import *
import math   # c.f. https://docs.python.org/3/library/math.html

def Mouse_press(event):
#======================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    # c.f. http://effbot.org/tkinterbook/canvas.htm

    # Converti les coordonnées de la souris en coordonnées du canvas
    x = can1.canvasx(event.x)
    y = can1.canvasy(event.y)

    if (0 == 1) and (event.num == 1): # pour des informations et le développement
        # c.f. : http://effbot.org/tkinterbook/canvas.htm#coordinate-systems
        # Voir aussi :  "find_closest"  ;  "find_enclosed"  ;  "find_overlapping"
        print(can1.find_closest(x, y), end=" ... ") # affiche le numéro de l'objet du canvas le plus proche de la souris
        print(can1.find_overlapping(x, y, x, y), end=" ... ") # affiche les numéros des objets du canvas où l'on a cliqué
        print(len(can1.find_overlapping(x, y, x, y)), end=" ... ") # nombre d'objets où l'on a cliqué
        print("   ", event.num, event.type)

    global gloNum, glPosDX, glPosDY
    objectsList = can1.find_overlapping(x, y, x, y)
    if (len(objectsList) > 0):
        gloNum = objectsList[0] # objet sélectionné

        # Position de l'objet sur lequel on a cliqué
        Pos =can1.coords(gloNum) # = [left, top, right, bottom], coordonnées de l'objet : oval1
        
        # Mémorise le décalage entre l'endroit où l'on a cliqué sur l'objet et la position de l'objet
        glPosDX = Pos[0] - x
        glPosDY = Pos[1] - y

def Mouse_move(event):
#======================
    # c.f. http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
    # c.f. http://tkinter.fdex.eu/doc/event.html
    # c.f. http://effbot.org/tkinterbook/canvas.htm

    # can1.itemconfigure(text1, text = 'X =' + str(event.x) + 'Y =' + str(event.y))

    # Converti les coordonnées de la souris en coordonnées du canvas
    x = can1.canvasx(event.x)
    y = can1.canvasy(event.y)
    
    if (gloNum != 0):
        # Un objet est délectionné, déplace-le

        Pos =can1.coords(gloNum) # = [left, top, right, bottom], coordonnées de l'objet sélectionné
        
        can1.coords(gloNum, x+glPosDX, y+glPosDY, x+glPosDX+30, y+glPosDY+30)
    
        Pos1 =can1.coords(oval1) # = [left, top, right, bottom], coordonnées de l'objet : oval1
        Pos2 =can1.coords(oval2) # = [left, top, right, bottom], coordonnées de l'objet : oval2
        
        distance = math.sqrt((Pos2[0] - Pos1[0])**2 + (Pos2[1] - Pos1[1])**2) # Distance en pixels entre les deux boules.
        
        # Permet de modifier le contenu du texte    
        # Pour formatter la conversion en string d'un nombre, c.f. : https://pyformat.info/
        # c.f. http://effbot.org/tkinterbook/canvas.htm
        can1.itemconfigure(text1, text='Distance =' + '{:9.2f}'.format(distance) + ' px')

        # Trace une ligne entre les positions initiale et finale du centre de l'objet
        if (gloNum == oval1): # Sélectionne la couleur en fonction de l'objet sélectionné.
            theColor = "red"
        else:
            theColor = "blue"
    
        can1.create_line(Pos[0] + 30//2, Pos[1] + 30//2, x+glPosDX+30//2, y+glPosDY+30//2, width=2, fill=theColor)


def Mouse_release(event):
#========================
    # Plus d'objet sélectionné.
    global gloNum
    gloNum = 0

def Reset():
#===========
    # Pour remettre les objets à une place fixe. Et effacer les traits
    global oval1, oval2
    can1.coords(oval1, 20,  20, 20+30,  20+30)
    can1.coords(oval2, 30, 100, 30+30, 100+30)

    # Efface tous les objets dans le canvas
    can1.delete(ALL)

    # Recrée les deux boules de bases.
    oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
    oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

def Canvas_resise(event):
#========================
    # Est appelé à chaque modification de la taille du canvas.
    # Repositionne le texte en fonction de la taille du canvas.
    large, hauteur = event.width, event.height # Largeur et hauteur du canvas    
    can1.coords(text1, 10, hauteur-20) # repositionne le texte
    
def Window_resise(event):
#========================
    # est appelé à chaque redimensionnement de la fenêtre principale.
    # Ne sert à rien ici, juste pour info.
    # print("Window resize", event.x, event.y, event.width, event.height)
    print( "Window resize"
         , fen1.winfo_width(), fen1.winfo_height()  # dimension de la fenêtre
         , fen1.winfo_reqheight(), fen1.winfo_reqwidth()
         , fen1.winfo_screenwidth(), fen1.winfo_screenheight() # Dimensions de l'écran
         )
    
#------ Programme principal -------
# Variables globales
gloNum = 0 # numéro de l'objet du canvas sélectionné par un clique, lorsque le clique est maintenu

# Pour mémoriser le décalage entre l'endroit où l'on a cliqué sur l'objet et la position de l'objet
glPosDX = 0
glPosDY = 0

# Création du widget principal ("maître") :
fen1 = Tk()

# Permet de positionner la fenêtre sur l'écran
xpos = 500
ypos = 100
fen1.wm_geometry("+%d+%d" % (xpos, ypos))
fen1.title("Animation avec la souris de deux astres avec tkinter")

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='dark grey',height=300,width=300)
oval1 = can1.create_oval(20,  20, 20+30,  20+30,width=2,fill='red')
oval2 = can1.create_oval(30, 100, 30+30, 100+30,width=2,fill='blue')

# text1 est un numéro référençant l'objet 'text1' du canevas can1
text1 = can1.create_text( 10,280,    # position x, y
                          anchor=W,  # NW, N, NE, W, E, SW, S, SE, CENTER (défaut)
                          fill="darkblue",
                          font="Arial 20 italic bold",
                          text="Distance = ")

# c.f. : https://www.python-course.eu/tkinter_events_binds.php
can1.bind("<Motion>", Mouse_move) # à chaque déplacement de la souris, la fonction  est appelée
can1.bind("<Button-1>", Mouse_press) # à chaque click gauche de la souris, la fonction est appelée
can1.bind("<ButtonRelease-1>", Mouse_release) # à chaque click gauche relaché de la souris, la fonction est appelée
can1.bind("<Configure>", Canvas_resise) # Appel de la fonction au redimentionnement de la fenêtre.
fen1.bind("<Configure>", Window_resise) # Appel de la fonction au redimentionnement de la fenêtre.

#can1.pack(side=LEFT) # insertion du canvas dans la fenêtre.

# Une manière de faire en sorte que le canvas s'adapte au dimensions de la fenêtre.
# c.f. https://stackoverflow.com/questions/47115684/python-tkinter-frame-canvas-resize
can1.pack(side=LEFT, fill="both", expand=True) # insertion du canvas dans la fenêtre.

# Création du bouton pour quitter
Button(fen1,text='Quitter',command=fen1.destroy).pack(side=BOTTOM)

# Pour repositionner les objets à des places par défaut.
Button(fen1,text='Reset',command=Reset).pack(side=BOTTOM)
    
# démarrage du réceptionnaire d’évènements (boucle principale) :
fen1.mainloop()

ex_XXI25a_animation_automatique.py   TOP
Déplacement d'un disque, automatiquement, à l'aide d'un "timer" (minuteur).
#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
ex_XXI25a_animation_automatique.py
Animation
'''

from tkinter import *

# définition des gestionnaires d'événements :

def move():
#==========
    "déplacement de la balle"
    global x1, y1, dx, dy, flag
    x1, y1 = x1 +dx, y1 + dy
    
    if x1 >210:
        x1, dx, dy = 210, 0, 15
    if y1 >210:
        y1, dx, dy = 210, -15, 0
    if x1 <10:
        x1, dx, dy = 10, 0, -15
    if y1 <10:
        y1, dx, dy = 10, 15, 0
        
    can1.coords(oval1,x1,y1,x1+30,y1+30)
    
    if flag > 0: 
        fen1.after(50, move) # Demande au système d'appeler la fonction "move" après 50 millisecondes

def stop_it():
#=============
    "arrêt de l'animation"
    global flag 
    flag =0

def start_it():
#==============
    "démarrage de l'animation"
    global flag
    if flag ==0: # pour ne lancer qu’une seule boucle 
        flag =1
        move()  # que se passe-t-il si "move()" est désindenté ?


#========== Programme principal =============

# les variables suivantes seront utilisées de manière globale :
x1, y1 = 10, 10 # coordonnées initiales
dx, dy = 15, 0 # 'pas' du déplacement
flag =0 # commutateur

# Création du widget principal ("parent") :
fen1 = Tk()
fen1.title("Exercice d'animation avec tkinter")
# création des widgets "enfants" :
can1 = Canvas(fen1,bg='dark grey',height=250, width=250)
can1.pack(side=LEFT, padx =5, pady =5)
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill='red')
bou1 = Button(fen1,text='Quitter', width =8, command=fen1.destroy)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
bou2.pack()
bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
bou3.pack()
# démarrage du réceptionnaire d'événements (boucle principale) :
fen1.mainloop()

ex_XXI50b_Boutons_dans_canvas.py   TOP
Place des boutons dans un canvas.
Le canvas d'adapte à la taille de la fenêtre.
Les boutons restent positionnés en bas à droite de la fenêtre (du canvas).
# ex_XXI50b_Bouton_dans_canvas.py
# Référence : https://openclassrooms.com/forum/sujet/un-bouton-dans-un-canva-sur-tkinter
# Montre comment placer un bouton dans un canvas
#
# Le canvas d'adapte à la taille de la fenêtre.
# Les boutons restent toujours en bas à droite du canvas

from tkinter import *

def Canvas_resise(event):
#========================
    # Est appelé à chaque modification de la taille du canvas.
    # Repositionne le texte en fonction de la taille du canvas.
    large, hauteur = event.width, event.height # Largeur et hauteur du canvas    
    can.coords(bt_quit_w, large - 50, hauteur-20) # repositionne le bouton quit
    can.coords(bt_blue_w, large - 126, hauteur-20) # repositionne le bouton blue
    can.coords(bt_green_w, large - 200, hauteur-20) # repositionne le bouton green

fen = Tk()

can = Canvas(fen, width=400, height=300, bg="white")
can.pack(side=LEFT, fill="both", expand=True) # insertion du canvas dans la fenêtre.

can.bind("<Configure", Canvas_resise) # Appel de la fonction au redimentionnement du canvas

# Création d'un bouton et placement du bouton dans le canvas.
bt_blue = Button(fen, text="Blue", command=lambda: can.config(bg="blue"))
bt_blue_w = can.create_window(40, 20, window=bt_blue)

# Création d'un bouton et placement du bouton dans le canvas.
bt_green = Button(fen, text="Green", command=lambda: can.config(bg="green"))
bt_green_w = can.create_window(40, 60, window=bt_green)

# Création d'un bouton et placement du bouton dans le canvas.
bt_quit = Button(fen, text='Quitter', command=fen.destroy)
bt_quit_w = can.create_window(40, 280, window=bt_quit)

# Les trois boutons seront repositionnés dans la fonction "Canvas_resise"

fen.mainloop()

ex_XXX01a_Classe_vertebres.py   TOP
# ex_XXX01a_Classe_vertebres.py
'''
Le but de ce programme est d'illustrer la programmation objet sur la classe des vertébrés
et quelques classes descendantes plus particulières.
Structure des classes :
- classe des vertébrés.
	- classe des mammifères
		- classe des chiens
		- classe des chats
'''

# Il est usuel en Python que la première lettre du nom de la classe commence par une majuscule.
class Vertebres:
################
    """Classe des vertébrés"""
    # Constructeur de la classe
    def __init__(self, couleur, nom):
    #================================
        # Définition et initialisation des propriétés de cette classe
        self.couleur = couleur
        self.nom = nom
        self.maClass = "Vertébré"

    def AfficheInfo(self):
    #=====================    
        """Méthode qui affiche des informations sur ce vertébré."""    
        print("Class = ", self.maClass)
        print("Couleur = ", self.couleur)
        print("Nom = ", self.nom)

    def ChangeNom(self, nomNouveau):
    #===============================    
        """Méthode qui permet de changer de nom."""
        # Il serait aussi possible de changer le nom sans utiliser de méthode.
        self.nom = nomNouveau

def Fonction_qui_ne_connait_que_les_vertebre(monVertebre):
#=========================================================
    """Cette fonction peut avoir écrite juste après avoir défini la classe des Vertebres,
       sans avoir aucune connaissances des classes descendantes.
       Pourtant, elle accèdera à des méthodes des classes descendantes.
       C'est la force du polymorphisme."""
    monVertebre.AfficheInfo()

class Mammiferes(Vertebres):
############################
    """Classe des mamiferes"""
    # Constructeur de la classe
    def __init__(self, couleur, nom):
    #================================
        # Définition et initialisation des propriétés de cette classe
        Vertebres.__init__(self, couleur, nom) # appelle le constructeur parent
        self.maClass = "Mamifère"
        self.caracteristiques = "A des poiles et donne du lait" # Une propriété a été ajoutée.

    def AfficheInfo(self):
    #=====================    
        """Méthode qui affiche des informations sur ce vertébré."""    
        Vertebres.AfficheInfo(self) # Appelle la méthode partente
        print("Caractéristiques = ", self.caracteristiques) # ajoute une fonctionnalité

class Chiens(Mammiferes):
#########################
    """Classe des chiens"""
    # Constructeur de la classe
    def __init__(self, couleur, nom, ageMax):
    #========================================
        # Définition et initialisation des propriétés de cette classe
        Mammiferes.__init__(self, couleur, nom) # appelle le constructeur parent
        self.maClass = "Chien"
        self.ageMax = ageMax  # Une propriété a été ajoutée, fournie en paramètre au constructeur.
        self.son = "aboient"

    def AfficheInfo(self):
    #=====================    
        """Méthode qui affiche des informations sur ce vertébré."""    
        Mammiferes.AfficheInfo(self) # Appelle la méthode partente
        print("Vie au maximum", self.ageMax, "années") # ajoute une fonctionnalité
        print("Les", self.maClass, self.son, ".")

class Chats(Mammiferes):
########################
    """Classe des chats"""
    # Constructeur de la classe
    def __init__(self, couleur, nom, poils_longueur):
    #================================================
        # Définition et initialisation des propriétés de cette classe
        Mammiferes.__init__(self, couleur, nom) # appelle le constructeur parent
        self.maClass = "Chat"
        self.poils_longueur = poils_longueur  # Une propriété a été ajoutée, fournie en paramètre au constructeur.
        self.son = "miaulent"

    def AfficheInfo(self):
    #=====================    
        """Méthode qui affiche des informations sur ce vertébré."""    
        Mammiferes.AfficheInfo(self) # Appelle la méthode partente
        print(self.poils_longueur) # ajoute une fonctionnalité
        print("Les", self.maClass, self.son, ".");

##################################################################################        
# Création d'un objet particulier, qui est un vertébré en particulier.
# Mais rien ne dit de quel type de vertébré il s'agit.
unVertebre = Vertebres("brun", "mon Vertébré")

# demande d'afficher des informations sur ce vertébré.
unVertebre.AfficheInfo()
unVertebre.ChangeNom("Change le nom du vertébré")
unVertebre.AfficheInfo()
unVertebre.nom = "troisième changement de nom"  # Manière plus simple et plus directe de changer le nom
unVertebre.AfficheInfo()
print("--------------------------")
      
unMammifere = Mammiferes("blanc", "mon Mamifère")
unMammifere.AfficheInfo()
print("--------------------------")

unChien = Chiens("blanc clair", "mon Chien", 15)
unChien.AfficheInfo()
print("--------------------------")

unChat = Chats("gris", "mon Chat", "Poils longs.")
unChat.AfficheInfo()

print("@######################################")

# Ce qui suit montre la force du POLYMORPHISME.
# La fonction suivante a été écrite avant la définition des descendants de la class des Vertebres,
# pourtant, elle appelle les méthodes des enfants de la classe Vertebres.
Fonction_qui_ne_connait_que_les_vertebre(unVertebre)
print("--------------------------")
Fonction_qui_ne_connait_que_les_vertebre(unMammifere)
print("--------------------------")
Fonction_qui_ne_connait_que_les_vertebre(unChien)
print("--------------------------")
Fonction_qui_ne_connait_que_les_vertebre(unChat)

ex_XXX02a_Classe_figures.py   TOP
# ex_XXX02a_Classe_figures.py
'''
Teste de l'héritage et du polymorphisme de Classes 
sur la classe des figures géométriques
  Le but de ce programme est d'illustrer la programmation objet sur la classe des figures géométriques
et quelques classes descendantes plus particulières.
Structure des classes :
- classe des Figures.
- classe des quadrilatères
- classe des rectangles
''' class Figure(object): """ Représente une Figure géométrique quelconque""" strNom = "Figure" # Propriété de class def __init__(self, centreX=0.0, centreY=0.0): "Définit le nom de la figure et son centre" self.centreX = centreX # Propriété d'instance de classe = Propriété d'objet self.centreY = centreY # Propriété d'objet def printNom(self): print("Nom = ", self.strNom) # Affiche la propriété de la classe def printCentre(self): print("X = ", self.centreX, " ; Y = ", self.centreY) def getNombreCotes(self): # Cette méthode sera redéfinie dans les classes enfants return 0 def getSurface(self): # Cette méthode sera redéfinie dans les classes enfants return 0 def printNombreCotes(self): print("Nombre de côtés =", self.getNombreCotes()) # La méthode (=fonction) self.getNombreCotes() sera différente pour chaque classe def printSurface(self): print("Surface =", self.getSurface()) # La méthode (=fonction) self.getSurface() sera différente pour chaque classe class Quadrilatere(Figure): strNom = "Quadrilatère" # Propriété de class def __init__(self, centreX=0.0, centreY=0.0): Figure.__init__(self, centreX, centreY) def getNombreCotes(self): return 4 class Rectangle(Quadrilatere): strNom = "Rectangle" # Propriété de class def __init__(self, centreX=0.0, centreY=0.0, vLongueur=7.0, vLargeur=4.0): Quadrilatere.__init__(self, centreX, centreY) self.vLongueur = vLongueur self.vLargeur = vLargeur def getSurface(self): return self.vLongueur * self.vLargeur class Carre(Rectangle): strNom = "Carre" # Propriété de class def __init__(self, centreX=0.0, centreY=0.0, vCote=4.0): Rectangle.__init__(self, centreX, centreY, vCote, vCote) # On peut ajouter à Figure les méthodes : # translation(vx, vY) ; rotation(vAngle) ; homothetie(vX, vY=0.0) # Si vY == 0, alors vY = vX # On peut ajouter les Classes : # Trapeze(Quadrilatere) ; Parallelogramme(Trapeze) ; Losange(Parallelogramme) # Rectangle devrait être un descendant de Parallelogramme. # On peut encore ajouter les Classes : # Triangle(Figure) ; TriangleIsocele(Triangle) ; TriangleEquilateral(TriangleIsocele) # TriangleRectangle(Triangle) # On peut encore ajouter les Classes : # Ellipse(Figure) ; Cercle(Ellipse) def Imprime_nom(une_figure): #=========================== '''Imprime le nom de la figure qui est donnée en paramètre''' une_figure.printNom() print("Surface =", une_figure.getSurface()) fig1 = Figure() fig1.printNom() fig1.printCentre() fig1.printNombreCotes() fig1.printSurface() print("---") figQ = Quadrilatere() figQ.printNom() figQ.printCentre() figQ.printNombreCotes() figQ.printSurface() print("---") figRect1 = Rectangle() figRect1.printNom() figRect1.printCentre() figRect1.printNombreCotes() figRect1.printSurface() print("---") figRect2 = Rectangle(vLongueur=9.0, vLargeur=5.0) figRect2.printNom() figRect2.printCentre() figRect2.printNombreCotes() figRect2.printSurface() print("---") figCarre1 = Carre(vCote=6.0) figCarre1.printNom() figCarre1.printCentre() figCarre1.printNombreCotes() figCarre1.printSurface() print("---") Rectangle.strNom = "rectangle changé" # Changle la propriété de la classe Rectangle figRect1.printNom() figRect2.printNom() fig1.printNom() figCarre1.printNom() # Il faut éviter d'avoir un nom de propriété de classe identique # au nom de propriété d'instance de cette classe. # print(self.strNom) cherchera en premier à savoir si strNom est une propriété d'objet. # Si ce n'est pas le cas, il cherchera si strNom est une propriété de classe. # Si ce n'est pas le cas, il affiche une erreur print("---------") # Cette fonction peut avoir été écrite avant les classes Quadrilatere, Rectangle et Carre, # elle appellera quand-même leur méthode si l'argument leur correspond. Imprime_nom(fig1) Imprime_nom(figRect1) Imprime_nom(figCarre1)


test0010_color_text.py   TOP
Comment afficher du texte en couleur dans l'IDLE3 de python, sous Linux.
'''
Le 15.3.2018
L'objectif est d'afficher du texte en couleur dans le "Shell" de IDLE.  Réf :
https://stackoverflow.com/questions/42472958/how-do-i-print-colored-text-in-idles-terminal

Après avoir cherché des heures sur le Web comment afficher du texte en couleur
dans le "Shell" de "IDLE3" de Python, voici tout ce que j'ai trouvé.
Je suis persuadé qu'il y a d'autres couleurs possibles,
mais je ne sais pas comment y accéder.

Sion lance Python dans un Terminal sous Linux,
les "Escape code" donne beaucoup de possibilités.
Suivant le type de terminal émulé, on peut
° afficher de de différentes couleurs
° déplacer le curseur d'impression
° détercter la souris

Pour les escape code dans un Terminal :
https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

Inutile, utile que pour un Terminal : sudo pip3 install colorama
'''

import sys
# c.f. https://docs.python.org/3/library/sys.html

color = sys.stdout.shell

print("On est sous :", sys.platform) # 'linux' ou 'win32' ou 'cygwin' ou 'darwin'

color.write(" 1) en Noir  : stdin\n","stdin")
color.write(" 2) en Brun  : console\n","console")
color.write(" 3) en Bleu  : stdout\n","stdout")
color.write(" 4) en Mauve : BUILTIN\n","BUILTIN")
color.write(" 5) en Vert  : STRING\n","STRING")
color.write(" 6) en Rouge : stderr\n","stderr")
color.write(" 7) en Jaune : KEYWORD\n","KEYWORD")
color.write("11) en Fond noir : hit\n","hit")
color.write("12) en Fond rose ERROR: \n","ERROR")
color.write("en Fond gris : sel \n","sel")
print()
print("Supplément :")
color.write("en Noir  : SYNC\n","SYNC")
color.write("en Noir : TODO\n","TODO")
color.write("en Bleu : DEFINITION\n","DEFINITION")
color.write("en Rouge : COMMENT\n","COMMENT")
print()
print("il doit être possible d'écrire avec un fond jaund, mais comment ?")
print("C.f. breakpoint des Option > Configure IDLE > Highligthing")

print()
'''
color.write("Test de couleur\n","BREAK")
color.write("Test de couleur\n","BREAKP")
color.write("Test de couleur\n","BREAKPO")
color.write("Test de couleur\n","BREAKPOI")
color.write("Test de couleur\n","BREAKPOIN")
color.write("Test de couleur\n","BREAKPOINT")
color.write("Test de couleur\n","Breakpoint")
color.write("Test de couleur\n","Breakpoin")
color.write("Test de couleur\n","Breakpoi")
color.write("Test de couleur\n","Breakpo")
color.write("Test de couleur\n","Breakp")
color.write("Test de couleur\n","Break")
color.write("Test de couleur\n","break")
color.write("Test de couleur\n","brea")
color.write("Test de couleur\n","bre")
color.write("Test de couleur\n","br")
color.write("Test de couleur\n","bp")
color.write("Test de couleur\n","BP")
color.write("Test de couleur\n","EDITOR")
color.write("Test de couleur\n","editor")
color.write("Test de couleur\n","editorbreak")
color.write("Test de couleur\n","editorbreakpoint")
color.write("Test de couleur\n","bp")
color.write("Test de couleur\n","bp")

color.write("Test de couleur\n","rgb(56,99,99)")
color.write("Test de couleur\n","#FFFF44")
'''

test0020_color_escape_code.py   TOP
Dans un Terminal Linux, exemples de "escape code" pour changer de couleurs ou déplacer le curseur.
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Exemple de couleurs lorsqu'on exécute ce script python dans
un Terminal sous linux.

À faire une fois, pour le rendre exécutable
chmod a+x color_test_escape_code.py 

Pour l'exécuter depuis un terminal
./color_test_escape_code.py

Pour changer la version par défaut de Python (la version (3.5) peut changer avec le temps) :
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
update-alternatives --list python
update-alternatives --config python

Autre ??? :
python --version
alias python="/usr/bin/python3.5"
python --version

Il y a énormément de possibilités, cherchez "Escape code"

c.f. 
https://en.wikipedia.org/wiki/ANSI_escape_code
https://www.xfree86.org/4.8.0/ctlseqs.html   BIEN, parle de "mouse traacking"
https://gist.github.com/justinmk/a5102f9a0c1810437885a04a07ef0a91  Bien à étudier plus...
https://www.systutorials.com/docs/linux/man/4-console_codes/   chercher "Mouse"
https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
'''
# Essai de couleurs :
print("\033[1;41m" + "   ." +"\033[1;46m" + "   ." + "\033[1;42m  .")
print("\033[0;37;40m 0;37;40m : Normal text")
print("\033[1;37;40m 1;37;40m : Bright Colour")
print("\033[2;37;40m 2;37;40m : faint Colour")
print("\033[1;37;40m", end='') # Pour revenir aux couleur blanc sur fond noir
print("\033[3;37;40m 3;37;40m : standout Colour")
print("\033[4;37;40m 4;37;40m : Underlined text")
print("\033[24;7;37;40m 7;37;40m : Negative Colour \n")
 
print("\033[1;37;40m \033[2;37;40m TextColour BlackBackground          TextColour GreyBackground                WhiteText ColouredBackground\033[0;37;40m\n")
print("\033[1;30;40m Dark Gray      \033[0m 1;30;40m            \033[1;30;47m Black      \033[0m 0;30;47m               \033[0;30;41m Black      \033[0m 0;37;41m")
print("\033[1;31;40m Bright Red     \033[0m 1;31;40m            \033[0;31;47m Red        \033[0m 0;31;47m               \033[0;30;42m Black      \033[0m 0;37;42m")
print("\033[1;32;40m Bright Green   \033[0m 1;32;40m            \033[0;32;47m Green      \033[0m 0;32;47m               \033[0;30;43m Black      \033[0m 0;37;43m")
print("\033[1;33;40m Yellow         \033[0m 1;33;40m            \033[0;33;47m Brown      \033[0m 0;33;47m               \033[0;30;44m Black      \033[0m 0;37;44m")
print("\033[1;34;40m Bright Blue    \033[0m 1;34;40m            \033[0;34;47m Blue       \033[0m 0;34;47m               \033[0;30;45m Black      \033[0m 0;37;45m")
print("\033[1;35;40m Bright Magenta \033[0m 1;35;40m            \033[0;35;47m Magenta    \033[0m 0;35;47m               \033[0;30;46m Black      \033[0m 0;37;46m")
print("\033[1;36;40m Bright Cyan    \033[0m 1;36;40m            \033[0;36;47m Cyan       \033[0m 0;36;47m               \033[0;30;47m Black      \033[0m 0;37;47m")
print("\033[1;37;40m White          \033[0m 1;37;40m            \033[0;37;40m Light Grey \033[0m 0;37;40m               \033[0;30;48m Black      \033[0m 0;37;48m")

print("\033[s", end='') # Mémorise la position du curseur
print("\033[5;50f \033[1;37;41mTexte en ligne 3 colonne 50")
print("\033[1;37;40m") # Pour revenir aux couleur blanc sur fond noir
print("\033[u", end='') # Retourne à la position mémorisée du curseur
print()


'''

ESC doit être remplacé par  \e  ou par  \E  ou par  \033
Exemples :
echo -e "\e[3A"  monte le curseur de 3 lignes.
echo -e "\e[3B"  descent le curseur de 3 lignes.
echo -e "\e[3;4f"  met le curseur en position ligne 3, colonne 4
echo -e "\e[32m"   le texte est affiché en vert

ANSI Escape Sequences

Wherever you see '#', that should be replaced by the appropriate number.

        ESC code sequence Function
       ------------------- ---------------------------
Cursor Controls:
         ESC[#;#H or ESC[#;#f Moves cusor to line #, column #
         ESC[#A Moves cursor up # lines
         ESC[#B Moves cursor down # lines
         ESC[#C Moves cursor forward # spaces
         ESC[#D Moves cursor back # spaces
         ESC[#;#R Reports current cursor line & column
         ESC[s Saves cursor position for recall later
         ESC[u Return to saved cursor position

Erase Functions:
         ESC[2J Clear screen and home cursor
         ESC[K Clear to end of line

Set Graphics Rendition:
         ESC[#;#;....;#m Set display attributes where # is
                                       00 for normal display (or just 0)
                                       01 for bold on (or just 1)
                                       02 faint (or just 2)
                                       03 standout (or just 3)
                                       04 underline (or just 4)
                                       05 blink on (or just 5)
                                       07 reverse video on (or just 7)
                                       08 nondisplayed (invisible) (or just 8)
                                       22 normal
                                       23 no-standout
                                       24 no-underline
                                       25 no-blink
                                       27 no-reverse
                                       30 black foreground
                                       31 red foreground
                                       32 green foreground
                                       33 yellow foreground
                                       34 blue foreground
                                       35 magenta foreground
                                       36 cyan foreground
                                       37 white foreground
                                       39 default foreground
                                       40 black background
                                       41 red background
                                       42 green background
                                       43 yellow background
                                       44 blue background
                                       45 magenta background
                                       46 cyan background
                                       47 white background
                                       49 default background

         ESC[=#;7h or Put screen in indicated mode where # is
         ESC[=h or 0 for 40 x 25 black & white
         ESC[=0h or 1 for 40 x 25 color
         ESC[?7h    2 for 80 x 25 b&w
                    3 for 80 x 25 color
                    4 for 320 x 200 color graphics
                    5 for 320 x 200 b & w graphics
                    6 for 640 x 200 b & w graphics
                    7 to wrap at end of line

         ESC[=#;7l or ESC[=l or Resets mode # set with above command
         ESC[=0l or ESC[?7l

Keyboard Reassignments:

         ESC[#;#;...p Keyboard reassignment. The first ASCII
         or ESC["string"p code defines which code is to be
         or ESC[#;"string";#; changed. The remaining codes define
            #;"string";#p what it is to be changed to.

   E.g. Reassign the Q and q keys to the A and a keys (and vice versa).

         ESC [65;81p A becomes Q
         ESC [97;113p a becomes q
         ESC [81;65p Q becomes A
         ESC [113;97p q becomes a

         E.g. Reassign the F10 key to a DIR command.

         ESC [0;68;"dir";13p The 0;68 is the extended ASCII code
                                   for the F10 key and 13 is the ASCII
                                   code for a carriage return.

         Other function key codes F1=59,F2=60,F3=61,F4=62,F5=63
                                        F6=64,F7=65,F8=66,F9=67,F10=68

'''


Plan du Site : Home   arrow   Python   arrow   python_code.html ( = http://www.juggling.ch/gisin/python/python_code.html )


Page mise à jour le 25 mars 2019 par Bernard Gisin     ( Envoyer un e-mail )
Hébergement par : www.infomaniak.ch