# 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
punitionRingarde = " Je dois écrire 100 fois un texte inutile "
nn = 0
while (nn < 100):
print(punitionRingarde)
nn = nn + 1
# 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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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
'''
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.")
#!/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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
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
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
# 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
# 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
# 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_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
# À 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
# À 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
# À 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
# À 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()
# 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
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
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
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 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
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
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
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
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
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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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_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)
#!/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
#!/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
#!/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
#!/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
#!/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
#!/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
#!/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()
#!/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()
#!/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()
#!/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()
#!/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()
#!/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()
#!/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
'''
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é")
#!/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()
#!/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()
#!/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()
#!/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()
#!/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()
#!/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()
#!/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()
#!/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_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
'''
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 ''' 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)
'''
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")
'''
#!/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
'''
#!/usr/bin/python
# test_is_number.py
def is_int(strS):
#================
# Retourne True si strS représente un entier, False sinon
try:
int(strS)
return True
except ValueError:
return False
def is_float(strS):
#==================
# Retourne True si strS représente un float, False sinon
try:
float(strS)
return True
except ValueError:
return False
def test_nombre():
#=================
# Un autre exemple
while True:
base = input("Enter A Number Or Exit(exit): ")
try:
base = int(base)
print("nombre=", base)
except ValueError:
if base == "exit":
break
print("Invalid. Enter Valid Input")
def my_int(strS):
#================
# Retourne le nombre entier qui début strS,
# jusqu'à la fin de strS ou un caractère non numérique
# Correspond à la fonction parseInt() du javascript
while True:
try:
nbr = int(strS)
return(nbr)
except ValueError:
if len(strS) == 0:
return(0)
strS = strS[0:-1]
def my_float(strS):
#==================
# Retourne le nombre float qui début strS,
# jusqu'à la fin de strS ou un caractère non numérique
# Correspond à la fonction parseFloat() du javascript
while True:
try:
nbr = float(strS)
return(nbr)
except ValueError:
if len(strS) == 0:
return(0)
strS = strS[0:-1]
print(is_int("-33"))
print(is_float("-33"))
print(is_float("-33.7543"))
print(is_float("-33.7543a"))
#test_nombre()
s1 = input("entrez un nombre et des caractères :")
print("entier =", my_int(s1))
print("float =", my_float(s1))
print("format = {:8.3f}".format(my_float(s1)))
print("scientif = {:8.3e}".format(my_float(s1)))
Plan du Site :
Home
Python
python_code.html
( = http://www.juggling.ch/gisin/python/python_code.html )
Page mise à jour le 6 octobre 2025 par Bernard Gisin
( Envoyer un e-mail )
Hébergement par : www.infomaniak.ch