Académique Documents
Professionnel Documents
Culture Documents
Initiation
programmation
à Python 3
Initiation à
Python 3
TS STIC 1
S. T. I. C
2018 - 2019
Auteur
CM : 24 Heure
Novembre 2018
A Celui qui peut tout
TS STIC 1 / 2018-2019
II. Les différents concepts de la POO (Programmation Orienté Objet) en Python .............................. 34
2.1. Le constructeur......................................................................................................................... 34
2.2. L’héritage .................................................................................................................................. 35
2.3. Le polymorphisme / Surcharge de méthode ............................................................................ 36
CHAPITRE 5 : Les bibliothèques Mathématiques.......................................................... 40
I. La bibliothèque math ....................................................................................................................... 41
1.2. Fonctions logarithme et exponentielle .................................................................................... 42
1.3. Fonctions trigonométriques ..................................................................................................... 43
1.4. Conversion angulaire ................................................................................................................ 43
1.5. Fonctions hyperboliques .......................................................................................................... 44
1.6. Constantes ................................................................................................................................ 44
II. Le module random ........................................................................................................................... 45
III. La bibliothèque mathplotlib ......................................................................................................... 46
3.1. Définition .................................................................................................................................. 46
3.2. Des détails ................................................................................................................................ 47
3.3. Quelques exemples .................................................................................................................. 48
CHAPITRE 6 : La gestion des fichiers ................................................................................. 52
I. Edition d’un fichier ........................................................................................................................... 53
1.1. Editer un fichier ........................................................................................................................ 53
1.2. La fonction open ....................................................................................................................... 53
1.3. Les types d'ouverture ............................................................................................................... 53
1.4. Fermeture d'un fichier.............................................................................................................. 54
1.5. Lire le contenu d'un fichier ....................................................................................................... 54
1.6. Ecrire dans un fichier ................................................................................................................ 54
1.7. Le mot clé with ......................................................................................................................... 54
II. Application........................................................................................................................................ 55
2.1. Concernant le répertoire .......................................................................................................... 55
2.2. Application 1............................................................................................................................. 55
2.3. Application 2............................................................................................................................. 55
2.4. Les exceptions .......................................................................................................................... 56
2.5. Application 3............................................................................................................................. 57
CHAPITRE 7 : La bibliothèque graphique tkinter .......................................................... 58
I. Présentation de tkinter .................................................................................................................... 59
II. Création d’une fenêtre avec tkinter ................................................................................................. 59
III. Construisons notre première fenêtre en python avec la bibliothèque « tkinter ». ........................ 59
TS STIC 1 / 2018-2019
IV. Considérons cette application suivante : ........................................................................................... 59
V. Les composants visuels ou widgets V. Les évènements ...................................................................... 60
VI. Les classes de widgets tkinter ...................................................................................................... 61
VII. Animation automatique – Récursivité.......................................................................................... 62
VIII. POO avec les interfaces graphiques ................................................................................................. 64
5.1. Cahier des charges de notre programme ................................................................................. 64
5.2. Mise en œuvre concrète .......................................................................................................... 65
5.3. Commentaires .......................................................................................................................... 67
Objectif visé :
Prérequis :
▪ Notions de base en algorithmique ;
TS STIC 1 / 2018-2019
CHAPITRE 1 : Introduction à python
TS STIC 1 / 2018-2019
I. Historique de python
1.1. Genèse
Python est un langage de programmation, dont la première version est sortie en 1991. Créé
par Guido van Rossum, il a voyagé du Macintosh de son créateur, qui travaillait à cette époque
au Centrum voor Wiskunde en Informatica aux Pays-Bas, jusqu'à se voir associer une
organisation à but non lucratif particulièrement dévouée, la Python Software Foundation, créée
en 2001. Ce langage a été baptisé ainsi en hommage à la troupe de comiques les « Monty
Python ».
1.2. Evolution
Lors de la création de la Python Software Foundation, en 2001, et durant les années qui ont
suivi, le langage Python est passé par une suite de versions que l'on a englobées dans
l'appellation Python 2.x (2.3, 2.5, 2.6…). Depuis le 13 février 2009, la version 3.0.1 est disponible.
Cette version casse la compatibilité ascendante qui prévalait lors des dernières versions. A
présent python existe sous la version 3.7.0
Python est un langage puissant, à la fois facile à apprendre et riche en possibilités. Dès l'instant
où vous l'installez sur votre ordinateur, vous disposez de nombreuses fonctionnalités intégrées
au langage que nous allons découvrir tout au long de ce livre.
Il est, en outre, très facile d'étendre les fonctionnalités existantes, comme nous allons le voir.
Ainsi, il existe ce qu'on appelle des bibliothèques qui aident le développeur à travailler sur des
projets particuliers. Plusieurs bibliothèques peuvent ainsi être installées pour, par exemple,
développer des interfaces graphiques en Python.
Concrètement, voilà ce qu'on peut faire avec Python :
de petits programmes très simples, appelés scripts, chargés d'une mission très précise
sur votre ordinateur ;
des programmes complets, comme des jeux, des suites bureautiques, des logiciels
multimédias, des clients de messagerie…
des projets très complexes, comme des progiciels (ensemble de plusieurs logiciels
pouvant fonctionner ensemble, principalement utilisés dans le monde professionnel).
Voici quelques-unes des fonctionnalités offertes par Python et ses bibliothèques :
créer des interfaces graphiques ;
faire circuler des informations au travers d'un réseau ;
dialoguer d'une façon avancée avec votre système d'exploitation ;
… et j'en passe…
Bien entendu, vous n'allez pas apprendre à faire tout cela en quelques minutes. Mais ce cours
vous donnera des bases suffisamment larges pour développer des projets qui pourront devenir,
par la suite, assez importants.
TS STIC 1 / 2018-2019
III. Les IDE pour développer en python
Sublime Text
Sublime text possède tout une panoplie de plugins dont vous serez vite
accroc ! Sa version de base est gratuite, une petite alerte vous
demandera de temps en temps si vous voulez acheter une licence pour
soutenir le projet mais rien ne vous oblige à le faire.
Spyder
Créé et développé par Pierre Raybaut en 2008, Spyder est maintenu, depuis 2012, par une
communauté de développeurs qui ont pour point commun d'appartenir à la communauté
Python scientifique.
En comparaison avec d'autres IDE pour le développement scientifique, Spyder a un ensemble
unique de fonctionnalités - multiplateforme, open-source, écrit en Python et disponible sous
TS STIC 1 / 2018-2019
une licence non-copyleft. Spyder est extensible avec des plugins, comprend le support d'outils
interactifs pour l'inspection des données et incorpore des instruments d'assurance de la qualité
et d'introspection spécifiques au code Python, tels que Pyflakes, Pylint et Rope. C’est celui que
nous allons utiliser dans ce cours.
Python notebook
L’interpréteur
TS STIC 1 / 2018-2019
L’interpréteur de script permet d’exécuter les instructions directement.
Python est un langage de programmation interprété, c'est-à-dire que les instructions que vous
lui envoyez sont « transcrites » en langage machine au fur et à mesure de leur lecture. D'autres
langages (comme le C / C++) sont appelés « langages compilés » car, avant de pouvoir les
exécuter, un logiciel spécialisé se charge de transformer le code du programme en langage
machine. On appelle cette étape la « compilation ». À chaque modification du code, il faut
rappeler une étape de compilation.
Les avantages d'un langage interprété sont la simplicité (on ne passe pas par une étape de
compilation avant d'exécuter son programme) et la portabilité (un langage tel que Python est
censé fonctionner aussi bien sous Windows que sous Linux ou Mac OS, et on ne devrait avoir à
effectuer aucun changement dans le code pour le passer d'un système à l'autre). Cela ne veut
pas dire que les langages compilés ne sont pas portables, loin de là ! Mais on doit utiliser des
compilateurs différents et, d'un système à l'autre, certaines instructions ne sont pas
compatibles, voire se comportent différemment.
En contrepartie, un langage compilé se révélera bien plus rapide qu'un langage interprété (la
traduction à la volée de votre programme ralentit l'exécution), bien que cette différence tende
à se faire de moins en moins sentir au fil des améliorations. De plus, il faudra installer Python
sur le système d'exploitation que vous utilisez pour que l'ordinateur puisse comprendre votre
code.
TS STIC 1 / 2018-2019
CHAPITRE 2 : Éléments de base en
python
TS STIC 1 / 2018-2019
I. Déclaration de variables
Une variable est un espace mémoire dans lequel il est possible de mettre une valeur. Python
est typé dynamiquement. C’est-à-dire qu’une variable déclarée en tant que qu’un entier peut
également contenir une chaine de caractère après.
Par exemple : X = 1 (X est du type Integer)
X = 1.0 (X passe au type float)
Cela n’existe pas dans les autres langages comme C, C++ …
Une variable ne doit pas faire partir du vocabulaire de Python ou mots réservés :
Nom Symbole
Addition +
Opérations Multiplication *
mathématique Division /
Division entière //
Modulo %
Comparaison <>
Différent !=
Logique Test égalité ==
ET – OU and - or
Affectation Affectation =
Exposant **
TS STIC 1 / 2018-2019
III. Structure d’un programme en python
La programmation en python est organisée en bloc d’instruction. Un bloc d'instructions est une
suite d'instructions qui est alignée sur la même tabulation. Les blocs d'instructions sont créés
par les instructions de contrôles comme if, while et for, ainsi que par les instructions permettant
de déclarer des fonctions.
Sous Python, toutes les instructions composées ont toujours la même structure : une ligne d'en-
tête terminée par un double point, suivie d'une ou de plusieurs instructions indentées sous
cette ligne d'en-tête. L’indentation est obligatoire en python.
Ligne d'en-tête:
première instruction du bloc
... ...
... ...
dernière instruction du bloc
autre instruction
une autre par ici
Il y a deux solutions pour indenter : utiliser quatre espaces ou un seul caractère tabulation, mais
jamais un mélange des deux sous peine d'erreurs IndentationError : unindent does not match
any outer indentation level. En effet, et même si le résultat paraît identique à l'écran, espaces
et tabulations sont des codes binaires distincts : Python considérera donc que ces lignes
indentées différemment font partie de blocs différents.
Commentez ce code !
Là se trouve un concept très important, que l'on retrouve dans beaucoup de langages de
programmation. Ouvrez grand vos oreilles, ou plutôt vos yeux, car vous devrez être
TS STIC 1 / 2018-2019
parfaitement à l'aise avec ce concept pour continuer la lecture de ce livre. Rassurez-vous
toutefois, du moment que vous êtes attentifs, il n'y a rien de compliqué à comprendre.
Qu'entend-on par « type de donnée » ?
Jusqu'ici, vous n'avez travaillé qu'avec des nombres. Et, s'il faut bien avouer qu'on ne fera que
très rarement un programme sans aucun nombre, c'est loin d'être la seule donnée que l'on peut
utiliser en Python. À terme, vous serez même capables de créer vos propres types de données,
mais n'anticipons pas.
Python a besoin de connaître quels types de données sont utilisés pour savoir quelles
opérations il peut effectuer avec. Dans ce chapitre, vous allez apprendre à travailler avec des
chaînes de caractères, et multiplier une chaîne de caractères ne se fait pas du tout comme la
multiplication d'un nombre. Pour certains types de données, la multiplication n'a d'ailleurs
aucun sens. Python associe donc à chaque donnée un type, qui va définir les opérations
autorisées sur cette donnée en particulier.
Le type entier se nomme int en Python (qui correspond à l'anglais « integer », c'est-à-dire
entier). La forme d'un entier est un nombre sans virgule.
Les flottants sont les nombres à virgule. Ils se nomment float en Python (ce qui signifie « flottant
» en anglais). La syntaxe d'un nombre flottant est celle d'un nombre à virgule (n'oubliez pas de
remplacer la virgule par un point). Si ce nombre n'a pas de partie flottante mais que vous voulez
qu'il soit considéré par le système comme un flottant, vous pouvez lui ajouter une partie
flottante de 0 (exemple 52.0).
Heureusement, les types de données disponibles en Python ne sont pas limités aux seuls
nombres, bien loin de là. Le dernier type « simple » que nous verrons dans ce chapitre est la
chaîne de caractères. Ce type de donnée permet de stocker une série de lettres, pourquoi pas
une phrase.
On peut écrire une chaîne de caractères de différentes façons :
• entre guillemets ("ceci est une chaîne de caractères") ;
• entre apostrophes ('ceci est une chaîne de caractères') ;
• entre triples guillemets ("""ceci est une chaîne de caractères""").
On peut, à l'instar des nombres (et de tous les types de données) stocker une chaîne de
caractères dans une variable (ma_chaine = "Bonjour, la foule !")
Une liste en python est une collection de donne de tout type dans une seul variable.
Création de liste : Pour créer une liste, rien de plus simple:
TS STIC 1 / 2018-2019
>>> liste = [] # ou bien
>>> liste = []
>>> liste
[]
>>> liste.append(1)
>>> liste
[1]
>>> liste.append("ok")
>>> liste
[1, 'ok']
>>> liste[0]
'a'
>>> liste[2]
'm'
Le premier item commence toujours avec l'index 0. Pour lire le premier item on utilise la valeur
0, le deuxième on utilise la valeur 1, etc.
Il est d'ailleurs possible de modifier une valeur avec son index
>>> liste[0]
'a'
>>> liste[2]
TS STIC 1 / 2018-2019
'm'
>>> liste
>>> liste
['a', 'c']
>>> liste.remove("a")
>>> liste
['b', 'c']
>>> len(liste)
>>> liste.count("a")
TS STIC 1 / 2018-2019
>>> liste.count("c")
>>> liste.index("b")
>>> liste[0]
500
[]
>>> ma_chaine.split(":")
TS STIC 1 / 2018-2019
Transformer une liste en string
L'inverse est possible avec la méthode "join".
>>> ":".join(liste)
'Olivier:ENGEL:Strasbourg'
>>> 3 in liste
True
>>> 11 in liste
False
>>> mon_tuple = ()
Les parenthèses ne sont pas obligatoires mais facilite la lisibilité du code (rappelons que la force
de python est sa simplicité de lecture):
>>> mon_tuple = 1, 2, 3
>>> type(mon_tuple)
<type 'tuple'>
Lorsque vous créez un tuple avec une seule valeur, n'oubliez pas d'y ajouter une virgule, sinon
ce n'est pas un tuple.
TS STIC 1 / 2018-2019
>>> mon_tuple = ("ok")
>>> type(mon_tuple)
<type 'str'>
>>> type(mon_tuple)
<type 'tuple'>
>>> mon_tuple[0]
>>> v1
11
>>> v2
22
➢ Il permet également de renvoyer plusieurs valeurs lors d'un appel d'une fonction :
TS STIC 1 / 2018-2019
...
>>> donne_moi_ton_nom()
('olivier', 'engel')
On utilisera un tuple pour définir des sortes de constantes qui n'ont donc pas vocation à
changer.
Un dictionnaire en python est une sorte de liste mais au lieu d'utiliser des index, on utilise
des clés, c'est à dire des valeurs autres que numériques.
>>> a = {}
>>> a = {}
>>> a
Vous pouvez utiliser des clés numériques comme dans la logique des listes.
La méthode get vous permet de récupérer une valeur dans un dictionnaire et si la clé est
introuvable, vous pouvez donner une valeur à retourner par défaut :
>>> data.get("name")
'Olivier'
'Adresse inconnue'
TS STIC 1 / 2018-2019
Vérifier la présence d'une clé dans un dictionnaire
Vous pouvez utiliser la méthode haskey pour vérifier la présence d'une clé que vous cherchez :
>>> a.has_key("nom")
True
>>> a
{'prenom': 'olivier'}
...
nom
prenom
...
engel
olivier
TS STIC 1 / 2018-2019
>>> fiche = {"nom":"engel","prenom":"olivier"}
...
nom engel
prenom olivier
>>> b = {}
>>> b[(3,2)]=12
>>> b[(4,5)]=13
>>> b
>>> e = d
>>> e
Pour créer une copie indépendante vous pouvez utiliser la méthode copy:
>>> e = d.copy()
>>> e
TS STIC 1 / 2018-2019
CHAPITRE 3 : Les fonctions / Les
exceptions en python
TS STIC 1 / 2018-2019
I. Notion de fonction et procédure en python
Une fonction est un programme portant un nom et réutilisable dans un ou plusieurs autres
programmes. Son utilisation nous permet de coder très vite rendant la vie du programmeur très
douce. Elle exécute une tâche unique !
Une fonction n'est pas obligée de renvoyer une valeur, on parlera alors dans ce cas
plutôt de procédure.
def maFonction():
Mes_instructions
return resultat
def maProcedure():
Mes_instructions
Les fonctions et les procédures sont utilisées à cause de leur capacité à avoir des paramètres à
l’entrée. Elles ont la capacité d’avoir assez d’argument possible.
Les paramètres
Créons une fonction :
... return a + 2
...
>>> augmente_moi(1)
... return 30 + a + b
...
>>> augmente_moi(1, 2)
33
TS STIC 1 / 2018-2019
Si vous avez compris les principes des fonctions, vous avez compris 80% de ce qu'est la
programmation.
>>> x = "hello"
... print x
...
>>> test()
hello
Et une variable déclarée dans une fonction ne sera visible que dans cette fonction. On parle
alors de variable locale.
>>> x = False
... x = "hello"
...
>>> test()
>>> x
False
>>> abs(-1)
str.capitalize()
La méthode capitalize permet de mettre une chaine de caractères au format Xxxxx
>>> "oLIviER".capitalize()
TS STIC 1 / 2018-2019
'Olivier'
choice([])
Retourne une valeur d'une liste aléatoirement.
>>> random.choice([1,2,3,4,5])
>>> random.choice([1,2,3,4,5])
str.count(string)
La méthode count compte le nombre d'occurrences de la recherche demandée.
>>> "olivier".count("i")
eval(expression,globals=None,locals=None)
Exécute une chaine de caractères.
>>> v = 101
>>> eval('v+1')
102
str.find(string)
La méthode find trouve la première occurrence de la recherche demandée.
>>> "olivier".find("i")
help(element)
Cette fonction vous retourne des informations sur l'utilisation de l'élément qui vous intéresse.
len(s)
Retourne le nombre d'items d'un objet.
>>> len([1,2,3])
>>> len("olivier")
TS STIC 1 / 2018-2019
7
max() / min()
Retourne la valeur la plus élevée pour max() et la plus basse pour min()
>>> max([1,3,2,6,99,1])
99
>>> max(1,4,6,12,1)
12
randint()
Retourne un int aléatoire.
>>> random.randint(1,11)
random()
Retourne une valeur aléatoire.
>>> random.random()
0.9563522652738929
str.replace(string, string)
La méthode replace remplace un segment d'une chaine de caractères par une autre :
'olavaer'
reverse()
La méthode reverse inverse l'ordre d'une liste.
>>> x = [1,4,7]
>>> x.reverse()
>>> x
[7, 4, 1]
TS STIC 1 / 2018-2019
list.sort()
La méthode sort permet de trier une liste.
>>> l = [5,1,4,2,10]
>>> l.sort()
>>> l
[1, 2, 4, 5, 10]
sum(iterable [,start])
Additionne les valeurs d'un élément itérable.
>>> sum([1,2,3])
>>> import module # pour importer toutes les fonctions de mon module
>>>from module import* # Pour importer aussi toutes les fonctions du module
Le package c’est un dossier qui contient plusieurs modules. Son importation est similaire à celui
des modules.
>>>from package.module import* # Pour importer aussi toutes les fonctions du module
>>> 5/0
TS STIC 1 / 2018-2019
ZeroDivisionError: integer division or modulo by zero
On remarque tout d'abord que python est certes sévère mais juste ; il nous dit pourquoi il n'est
pas content: ZeroDivisionError.
Cet exemple est sans intérêt mais il est tout à fait possible d'utiliser une variable comme
dénominateur et à ce moment-là comment éviter cette erreur?
Une solution serait de vérifier la valeur de la variable et si elle est égale à 0, on annule tout.
Une autre solution serait d'anticiper qu'il serait possible qu'il y ait une erreur et en cas d'erreur
prévoir des instructions spécifiques.
Try signifie "essayer" en anglais, ce mot clé permet d'essayer une action et si l'action échoue on
peut lui donner d'autres instructions dans un bloc except.
>>> v = 0
>>> w = 5
>>> try:
... w/v
... except:
...
Erreur
La syntaxe exposée plus haut répond à tout type d'erreur, mais il est possible d'affiner
la gestion d'erreur.
Par exemple que se passe-t-il si nous divisons un nombre par des lettres ?
>>> 5/"stic"
TS STIC 1 / 2018-2019
File "<stdin>", line 1, in <module>
On remarque que python nous affiche une erreur mais elle est différente de celle provoquée
par la division par 0. Ici l'erreur est TypeError.
Il est possible en python d'exécuter des instructions en fonction du type d'erreur. Par exemple
si la valeur est 0 on aimerait afficher un message et si le dénominateur est du texte on aimerait
pouvoir afficher un autre message à l'utilisateur.
>>> v = 0
>>> w = 5
>>> try:
... w/v
...
>>> v = "stic"
>>> w = 5
>>> try:
... w/v
TS STIC 1 / 2018-2019
...
4.3. Finally
On utilise le mot clé finally pour exécuter des instructions quelque soit les erreurs générées ou
non (et même s’il y a présence d'un return). Dans tous les cas les instructions placées
dans finally seront exécutées.
try:
pass
except:
pass
finally:
print "Execution"
Syntaxe
>>> a = [1,4,2,7,1,9,0,3,4,6,6,6,8,3]
Nous voulons filtrer les valeurs de cette liste et ne garder que ceux dont la valeur est supérieure
à5:
>>> b=[]
>>> for x in a:
... if x > 5:
TS STIC 1 / 2018-2019
... b.append(x)
...
>>> b
[7, 9, 6, 6, 6, 8]
Il est possible de faire exactement ce que fait ce bloc de code en une seule ligne :
[7, 9, 6, 6, 6, 8]
TS STIC 1 / 2018-2019
CHAPITRE 4 : La POO en python
TS STIC 1 / 2018-2019
I. Notion de classe et d’objet
Chaque objet est défini par des attributs et des méthodes qui lui sont propres.
Un attribut est une caractéristique de l’objet. Par exemple, un objet voiture peut avoir un
attribut couleur.
Une méthode est une action qui peut être appliquée à un objet. Par exemple, un objet voiture
peut avoir une méthode accélérer.
Une classe correspond à un modèle de données. En effet, tous les objets d’une classe partagent
les mêmes attributs et méthodes.
Par exemple, tous les objets de la classe voiture ont un attribut couleur et une méthode
accélérer.
Une classe regroupe des fonctions et des attributs qui définissent un objet. On appelle par
ailleurs les fonctions d'une classe des "méthodes".
Par exemple, une voiture rouge peut être une instance de la classe voiture.
class Voiture :
def __init__(self):
self.nom = "Ferrari"
Notre classe Voiture est une sorte d'usine à créer des voitures.
La méthode __init__() est appelée lors de la création d'un objet.
TS STIC 1 / 2018-2019
self.nom est une manière de stocker une information dans la classe. On parle d'attribut de
classe. Dans notre cas, on stock le nom dans l'attribut nom.
ma_voiture = Voiture()
print(ma_voiture.nom) #affiche Ferrari
class Voiture :
def __init__(self):
self.nom = "Ferrari"
self.modele = "250"
Les méthodes
class Voiture :
def __init__(self):
self.nom = "Ferrari"
self.modele = "250"
self.nb_roue = 3
def set_nom(self,newNom):
self.nom = newNom
TS STIC 1 / 2018-2019
v = Voiture()
v.set_nom("Mercedesse")
print(v.nom)#affiche Mercedesse
On peut aussi créer notre voiture avec les éléments de base déjà. Et pour cela, il faudrait
modifier légèrement le code précédent comme suit :
def set_nom(self,newNom):
self.nom = newNom
v = Voiture("Mercedesse","TY45",4)
print(v.get_modele())
2.1. Le constructeur
Une méthode constructeur a ceci de particulier qu’elle est exécutée automatiquement lorsque
l’on instancie un nouvel objet à partir de la classe. On peut donc y placer tout ce qui semble
nécessaire pour initialiser automatiquement l’objet que l’on crée.
Afin qu’elle soit reconnue comme telle par Python, la méthode constructeur devra
obligatoirement s’appeler __init__ (deux caractères « souligné », le mot init, puis encore deux
caractères « souligné »).
TS STIC 1 / 2018-2019
class Time(object) :
"Encore une nouvelle classe temporelle"
def __init__(self) :
self.heure = 12
self.minute = 0
self.seconde = 0
def affiche_heure(self) :
print("{}:{}:{}".format(self.heure,self.minute,
self.seconde))
2.2. L’héritage
Les classes constituent le principal outil de la programmation orientée objet (Object Oriented
Programming ou OOP), qui est considérée de nos jours comme la technique de programmation
la plus performante. L’un des principaux atouts de ce type de programmation réside dans le
fait que l’on peut toujours se servir d’une classe préexistante pour en créer une nouvelle, qui
héritera toutes ses propriétés mais pourra modifier certaines d’entre elles et/ou y ajouter les
siennes propres. Le procédé s’appelle dérivation. Il permet de créer toute une hiérarchie de
classes allant du général au particulier.
class Voiture :
roues = 4
moteur = 1
def __init__(self) :
self.nom = "A déterminer"
class VoitureSport(Voiture) :
def __init__(self):
self.nom = "Ferrari"
On a indiqué que VoitureSport a hérité de classe Voiture, elle récupère donc toutes ses
méthodes et ses attributs.
On peut toujours instancier la classe Voiture si on le désire :
V = Voiture()
print(v.nom)
rint(v.roues)
TS STIC 1 / 2018-2019
Instancions maintenant la classe VoitureSport :
ma_voiture_sport = VoitureSport()
print(ma_voiture_sport.nom)# affiche "Ferrari"
rint(ma_voiture_sport.nom)# affiche 4
On remarque tout d'abord que l'attribut roues a bien été hérité. Ensuite on remarque que la
méthode __init__ a écrasé la méthode de la classe Voiture. On parle alors de surcharge de
méthode.
Comme nous l'avons vu plus haut si une classe hérite d'une autre classe, elle hérite les
méthodes de son parent.
Exemple :
class Voiture:
roues = 4
moteur = 1
def __init__(self):
def allumer(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Le résultat :
La voiture démarre
TS STIC 1 / 2018-2019
Il est cependant possible d'écraser la méthode de la classe parente en la redéfinissant. On parle
alors de surcharger une méthode.
class Voiture:
roues = 4
moteur = 1
def __init__(self):
def allumer(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
def allumer(self):
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Le résultat :
Enfin dernier point intéressant : il est possible d'appeler la méthode du parent puis de faire la
spécificité de la méthode. On peut d'ailleurs appeler n'importe quelle autre méthode.
class Voiture:
roues = 4
moteur = 1
TS STIC 1 / 2018-2019
def __init__(self):
def allumer(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
def allumer(self):
Voiture.allumer(self)
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Le résultat :
La voiture démarre
Les classes Voiture et VoitureSport possèdent donc chacune une méthode de même nom mais
ces méthodes n'effectuent pas les mêmes tâches. On parle dans ce cas de polymorphisme.
class Rectangle(object):
"Classe de rectangles"
def __init__(self, longueur =0, largeur =0):
self.L = longueur
self.l = largeur
self.nom ="rectangle"
def perimetre(self):
return "(%d + %d) * 2 = %d" % (self.L, self.l, (self.L + self.l)*2)
def surface(self):
return "%d * %d = %d" % (self.L, self.l, self.L*self.l)
def mesures(self):
print("Un %s de %d sur %d" % (self.nom, self.L, self.l))
TS STIC 1 / 2018-2019
print("a une surface de %s" % (self.surface(),))
print("et un périmètre de %s\n" % (self.perimetre(),))
class Carre(Rectangle):
"Classe de carrés"
def __init__(self, cote):
Rectangle.__init__(self, cote, cote)
self.nom ="carré"
if __name__ == "__main__":
r1 = Rectangle(15, 30)
r1.mesures()
c1 = Carre(13)
c1.mesures()
Vous pouvez remarquer encore une fois que le constructeur de la classe Carre() doit faire appel
au constructeur de sa classe parente ( Rectangle.__init__(self, ...) ), en lui transmettant la
référence de l’instance (self) comme premier argument.
TS STIC 1 / 2018-2019
CHAPITRE 5 : Les bibliothèques
Mathématiques
TS STIC 1 / 2018-2019
I. La bibliothèque math
La bibliothèque math contient plusieurs fonctions mathématiques dont voici quelques-uns :
Import math
math.ceil(x)
Renvoie la fonction plafond de x, le plus petit entier plus grand ou égal à x. Si x est un flottant,
délègue à x.__ceil()__, qui doit renvoyer une valeur Intégral.
math.copysign(x, y)
Renvoie un flottant contenant la magnitude (valeur absolue) de x mais avec le signe de y. Sur
les plate-formes supportant les zéros signés, copysign(1.0, -0.0) renvoie -1.0.
math.fabs(x)
Renvoie la valeur absolue de x.
math.factorial(x)
Renvoie la factorielle de x. Lève une ValueError si x n’est pas entier ou s’il est négatif.
math.floor(x)
Renvoie le plancher de x, le plus grand entier plus petit ou égal à x. Si x n’est pas un flottant,
délègue à x.__floor()__, qui doit renvoyer une valeur Intégral.
math.fmod(x, y)
Renvoie fmod(x, y), tel que défini par la bibliothèque C de la plate-forme. Notez que l’expression
Python x % y peut ne pas renvoyer le même résultat. Le sens du standard C pour fmod(x, y) est
d’être exactement (mathématiquement, à une précision infinie) égal à x - n*y pour un
entier n tel que le résultat a le signe de x et une magnitude inférieure à abs(y). L’expression
Python x % y renvoie un résultat avec le signe de y, et peut ne pas être calculable exactement
pour des arguments flottants. Par exemple : fmod(-1e-100, 1e100) est -1e-100, mais le résultat
de l’expression Python -1e-100 % 1e100 est 1e100-1e-100, qui ne peut pas être représenté
exactement par un flottant et donc qui est arrondi à 1e100. Pour cette raison, la
fonction fmod() est généralement préférée quand des flottants sont manipulés, alors que
l’expression Python x % y est préféré quand des entiers sont manipulés.
math.frexp(x)
Renvoie la mantisse et l’exposant de x dans un couple (m, e). m est un flottant et e est un entier
tels que x == m * 2**e exactement. Si x vaut zéro, renvoie (0, 0), sinon 0.5 <= abs(m) < 1. Ceci
est utilisé pour « extraire » la représentation interne d’un flottant de manière portable.
math.fsum(iterable)
Renvoie une somme flottante exacte des valeurs dans l’itérable. Évite la perte de précision en
gardant plusieurs sommes partielles intermédiaires :
TS STIC 1 / 2018-2019
>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
0.9999999999999999
>>> fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
1.0
math.trunc(x)
Renvoie la valeur Real x tronquée en un Integral (habituellement un entier). Délègue
à x.__trunc__().
math.exp(x)
Renvoie e élevé à la puissance x, où e = 2.718281… est la base des logarithmes naturels. Cela
est en général plus précis que math.e ** x ou pow(math.e, x).
math.expm1(x)
Renvoie e à la puissance x, moins 1. Ici, e est la base des logarithmes naturels. Pour de petits
flottants x, la soustraction exp(x) - 1 peut résulter en une perte significative de précision; la
fonction expm1() fournit un moyen de calculer cette quantité en précision complète :
>>> from math import exp, expm1
>>> exp(1e-5) - 1 # gives result accurate to 11 places
1.0000050000069649e-05
>>> expm1(1e-5) # result accurate to full precision
1.0000050000166668e-05
math.log(x[, base])
Avec un argument, renvoie le logarithme naturel de x (en base e).
Avec deux arguments, renvoie le logarithme de x en la base donnée, calculé
par log(x)/log(base).
math.log1p(x)
Renvoie le logarithme naturel de 1+x (en base e). Le résultat est calculé par un moyen qui reste
exact pour x proche de zéro.
math.log2(x)
Renvoie le logarithme en base 2 de x. C’est habituellement plus exact que log(x, 2).
math.log10(x)
Renvoie le logarithme de x en base 10. C’est habituellement plus exact que log(x,10).
TS STIC 1 / 2018-2019
math.pow(x, y)
Renvoie x élevé à la puissance y. Les cas exceptionnels suivent l’annexe “F” du standard C99
autant que possible. En particulier, pow(1.0, x) et pow(x, 0.0)renvoient toujours 1.0, même
si x est zéro ou NaN. Si à la fois x et y sont finis, x est négatif et y n’est pas entier,
alors pow(x, y) est non défini et lève une ValueError.
À l’inverse de l’opérateur interne **, la fonction math.pow() convertit ses deux arguments
en float. Utilisez ** ou la primitive pow() pour calculer des puissances exactes d’entiers.
math.sqrt(x)
Renvoie la racine carrée de x.
math.acos(x)
Renvoie l’arc cosinus de x, en radians.
math.asin(x)
Renvoie l’arc sinus de x, en radians.
math.atan(x)
Renvoie l’arc tangente de x, en radians.
math.atan2(y, x)
Renvoie atan(y / x), en radians. Le résultat est entre -pi et pi. Le vecteur du plan allant de
l’origine vers le point (x, y) forme cet angle avec l’axe X positif. L’intérêt de atan2() est que le
signe des deux entrées est connu. Donc elle peut calculer le bon quadrant pour l’angle. par
exemple atan(1) et atan2(1, 1) donnent tous deux pi/4, mais atan2(-1, -1) donne -3*pi/4.
math.cos(x)
Renvoie le cosinus de x radians.
math.hypot(x, y)
Renvoie la norme euclidienne sqrt(x*x + y*y). C’est la longueur du vecteur allant de l’origine au
point (x, y).
math.sin(x)
Renvoie le sinus de*x* radians.
math.tan(x)
Renvoie la tangente de x radians.
math.degrees(x)
Convertit l’angle x de radians en degrés.
TS STIC 1 / 2018-2019
math.radians(x)
Convertit l’ange x de degrés en radians.
Hyperbolic functions sont analogues à des fonctions trigonométriques qui sont basés sur des
hyperboles au lieu de cercles.
math.acosh(x)
Renvoie l’arc cosinus hyperbolique de x.
math.asinh(x)
Renvoie l’arc sinus hyperbolique de x.
math.atanh(x)
Renvoie l’arc tangente hyperbolique de x.
math.cosh(x)
Renvoie le cosinus hyperbolique de x.
math.sinh(x)
Renvoie le sinus hyperbolique de x.
math.tanh(x)
Renvoie la tangente hyperbolique de x.
Fonctions spéciales
math.erf(x)
Renvoie la fonction d’erreur en x.
La fonction erf() peut être utilisée pour calculer des fonctions statistiques usuelles telles qu e
la répartition de la loi normale :
def phi(x):
'Cumulative distribution function for the standard normal distribution'
return (1.0 + erf(x / sqrt(2.0))) / 2.0
1.6. Constantes
math.pi
La constante mathématique π = 3.141592…, à la précision disponible.
math.e
La constante mathématique e = 2.718281…, à la précision disponible.
TS STIC 1 / 2018-2019
math.tau
La constante mathématique τ = 6.283185…, à la précision disponible. Tau est une constante du
cercle égale à 2 *π*, le rapport de la circonférence d’un cercle à son rayon. Pour en apprendre
plus sur Tau, regardez la vidéo de Vi Hart, Pi is (still) Wrong, et profitez-en pour célébrer le Jour
de Tau en bavardant comme deux pies
Source : https://docs.python.org/fr/3/library/math.html
rnd = random.Random()
random.seed(2) : pour initialiser le générateur (utile pour avoir des séquences aléatoire
reproductibles).
random.sample(['a', 'b', 'c', 'd', 'e'], 2) : sample de taille 2, sans remise (donc, la taille ne peut
pas être supérieure à celle de la liste).
Source : http://www.python-simple.com/python-modules-math/random.php
TS STIC 1 / 2018-2019
random.uniform(a, b)
Return a random floating point number N such
that a <= N <= b for a <= b and b<= N <= a for b < a.
The end-point value b may or may not be included in the range depending on floating-point
rounding in the equation a + (b-a) * random().
Sources : https://docs.python.org/3/library/random.html
3.1. Définition
D’une manière générale les fonctions plt.plot attendent des vecteur/matrice, bref des tableaux
de points du plan. Selon les options, ces points du plan sont reliés entre eux de façon ordonnée
par des segments : le résultat est une courbe.
Commençons par la fonction sinus.
TS STIC 1 / 2018-2019
Si tout se passe bien, une fenêtre doit s’ouvrir avec la figure ci-dessus. Il est possible de jouer
avec les menus dans le bas de cette fenêtre : zoomer, déplacer la figure, etc et surtout
sauvegarder dans un format PNG, PDF, EPS, etc.
plt.clf() : efface la fenêtre graphique
plt.savefig()
Sauvegarde le graphique. Par exemple plt.savefig("mongraphe.png") sauve sous le nom
“mongraphe.png” le graphique. Par défaut le format est PNG. Il est possible d’augmenter la
résolution, la couleur de fond, l’orientation, la taille (a0, a1, lettertype, etc) et aussi le format
de l’image. Si aucun format n’est spécifié, le format est celui de l’extension dans
“nomfigure.ext” (où “ext” est “eps”, “png”, “pdf”, “ps” ou “svg”). Il est toujours conseillé de
mettre une extension aux noms de fichier ; si vous y
tenez plt.savefig('toto',format='pdf') sauvegarder l’image sous le nom “toto” (sans extension !)
au format “pdf”.
Pour connaître toutes les options, le mieux est de se référer à la documentation de Matplotlib.
Voyons ici quelques-unes d’entre elles
Couleur du trait : pour changer la couleur du tracé une lettre g vert (green), r rouge
(red), k noir, b bleu, c cyan, m magenta, y jaune (yellow), wblanc
(white). plt.plot(np.sin(x),'r') tracera notre courbe sinus en rouge. Les amateurs
de gris sont servis via color='(un flottant entre 0 et1)'. Enfin pour avoir encore
plus de couleurs, comme en HTML la séquence color='#eeefff' donnera la couleur
attendu et les amateurs de RGB sont servis par color=( R, G, B) avec trois paramètres
compris entre 0 et 1 (RGBA est possible aussi).
Symboles : mettre des symboles aux points tracés se fait via l’option marker. Les
possibilités sont nombreuses parmi
[ ‘+’ | ‘*’ | ‘,’ | ‘.’ |‘1’ | ‘2’ | ‘3’ | ‘4’ | ‘<’ | ‘>’ | ‘D’ | ‘H’ | ‘^’ | ‘_’ | ‘d’ | ‘h’ | ‘o’ | ‘p’ | ‘s’ | ‘
v’ | ‘x’ | ‘|’ | TICKUP | TICKDOWN | TICKLEFT |TICKRIGHT | ‘None’ | ‘ ‘ | ‘’ ].
Style du trait : pointillés, absences de trait, etc se décident avec linestyle. Au choix '-
' ligne continue, '--' tirets, '-.' points-tirets, ':'pointillés, sachant que 'None', '', ' ' donnent
“rien-du-tout”. Plutôt que linestyle, ls (plus court) fait le même travail.
TS STIC 1 / 2018-2019
marker, markerfacecolor la couleur de l’intérieur (si le marker possède un intérieur
comme 'o'), markeredgsize=flottant l’épaisseur du trait du pourtour du marker. Remarquez
que si la couleur n’est pas spécifiée pour chaque nouvel appel la couleur des “markers”
change de façon cyclique.
Étiquettes sur l’axe des abscisses/ordonnées : Matplotlib décide tout seul des graduations
sur les axes. Tout ceci se modifie via plt.xticks(tf), plt.yticks(tl) où tf est un
vecteur de flottants ordonnés de façon croissante.
Légendes : c’est un peu plus compliqué. D’après ce que j’ai compris il faut assigner à des
variables le tracé, via g1=plt.plot(), etc. Enfin plt.legend((g1, g2), ("ligne 2","ligne 1")) fait le
boulot. Par exemple
TS STIC 1 / 2018-2019
Pour superposer plusieurs graphes de fonctions, il est possible de faire une succession de
commandes plt.plot ou encore en une seule commande. Remarquez aussi que pour des
choses simples il est possible de se passer des ls, color et marker.
import matplotlib.pyplot as plt
import numpy as np
t1=np.linspace(0,5,10)
t2=np.linspace(0,5,20)
plt.plot(t1, t1, 'r--', t1, t1**2, 'bs', t2, t2**3, 'g^-')
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
TS STIC 1 / 2018-2019
Dans la commande plt.subplot
l’argument est nbre de lignes, nbre de colonnes, numéro de la figure. Il y a une condition à
respecter : le nombre de lignes multiplié par le nombre de colonnes est supérieur ou égal au
nombre de figure. Ensuite Matplotlib place les figures au fur et à mesure dans le sens des lignes.
Dans le même registre, ouvrir plusieurs fenêtres graphiques est possible. Si vous avez déjà une
fenêtre graphique, la commande plt.figure(2) en ouvre une seconde et les
instructions plt.plot qui suivent s’adresseront à cette seconde figure. Pour revenir et
modifier la première fenêtre graphique, plt.figure(1) suffit.
TS STIC 1 / 2018-2019
Source: http://math.mad.free.fr/depot/numpy/courbe.html
TS STIC 1 / 2018-2019
CHAPITRE 6 : La gestion des fichiers
TS STIC 1 / 2018-2019
I. Edition d’un fichier
Une manière de stocker des données de manière pérenne est de les stocker dans des fichiers.
Voici la syntaxe pour lire un fichier : open("chemin absolu du fichier", "type d’ouverture")
>>> print(fichier)
a, pour une ouverture en mode ajout à la fin du fichier (APPEND). Si le fichier n'e
xiste pas python le crée.
TS STIC 1 / 2018-2019
1.4. Fermeture d'un fichier
Comme tout élément ouvert, il faut le refermer une fois les instructions terminées. Pour cela
on utilise la méthode close().
>>> fichier.close()
Pour afficher tout le contenu d'un fichier, vous pouvez utiliser la méthode read sur l'objet-
fichier.
print(fichier.read())
fichier.close()
fichier.write("Bonjour monde")
fichier.close()
A noter que pour le monde d'ouverture a, si vous voulez écrire à la ligne, vous pouvez utiliser le
saut de ligne \n:
fichier.write("\nBonjour monde")
fichier.close()
Il existe une autre syntaxe plus courte qui permet de s'émanciper du problème de fermeture
du fichier : le mot clé with.
Voici la syntaxe :
print(fichier.read())
TS STIC 1 / 2018-2019
II. Application
2.2. Application 1
Ecrire une fonction copieFichier qui permet de copier le contenu d’un fichier source dans
le un fichier destinataire. copieFichier(fsource, fdestination)
2.3. Application 2
Le script qui suit vous montre comment créer une fonction destinée à effectuer un certain
traitement sur un fichier texte. En l’occurrence, il s’agit ici de recopier un fichier texte, en
omettant toutes les lignes qui commencent par un caractère ’#’. Ecrivez cette fonction.
TS STIC 1 / 2018-2019
def filtre(source,destination):
"recopier un fichier en éliminant les lignes de remarques"
fs = open(source, 'r')
fd = open(destination, 'w')
while 1:
txt = fs.readline()
if txt =='':
break
if txt[0] != '#':
fd.write(txt)
fs.close()
fd.close()
return
Tester sur le fichier electionPr2018.txt
2.4. Les exceptions
Considérons par exemple un script qui demande à l’utilisateur d’entrer un nom de fichier, lequel
fichier étant destiné à être ouvert en lecture. Si le fichier n’existe pas, nous ne voulons
pas que le programme se « plante ». Nous voulons qu’un avertissement soit affiché, et
éventuellement que l’utilisateur puisse essayer d’entrer un autre nom.
Si nous estimons que ce genre de test est susceptible de rendre service à plusieurs endroits
d’un programme, nous pouvons aussi l’inclure dans une fonction :
def existe(fname):
try:
f = open(fname,'r')
f.close()
return 1
except:
return 0
TS STIC 1 / 2018-2019
2.5. Application 3
Écrivez un script qui permette de créer et de relire aisément un fichier texte. Votre
programme demandera d’abord à l’utilisateur d’entrer le nom du fichier. Ensuite il lui
proposera le choix, soit d’enregistrer de nouvelles lignes de texte, soit d’afficher le
contenu du fichier. L’utilisateur devra pouvoir entrer ses lignes de texte successives en utilisant
simplement la touche <Enter> pour les séparer les unes des autres. Pour terminer les entrées,
il lui suffira d’entrer une ligne vide (c’est-à-dire utiliser la touche <Enter> seule). L’affichage du
contenu devra montrer les lignes du fichier séparées les unes des autres de la manière la plus
naturelle (les codes de fin de ligne ne doivent pas apparaître)
def sansDC(ch):
"cette fonction renvoie la chaîne ch amputée de son dernier caractère"
nouv = ""
i, j = 0, len(ch) -1
while i < j:
nouv = nouv + ch[i]
i = i + 1
return nouv
def ecrireDansFichier():
of = open(nomF, 'a')
while 1:
ligne = input("entrez une ligne de texte (ou <Enter>) : ")
if ligne == '':
break
else:
of.write(ligne + '\n')
of.close()
def lireDansFichier():
of = open(nomF, 'r')
while 1:
ligne = of.readline()
if ligne == "":
break
# afficher en omettant le dernier caractère (= fin de ligne) :
print(sansDC(ligne))
of.close()
TS STIC 1 / 2018-2019
CHAPITRE 7 : La bibliothèque graphique
tkinter
TS STIC 1 / 2018-2019
I. Présentation de tkinter
Si vous ne le saviez pas encore, apprenez dès à présent que le domaine des interfaces
graphiques (ou GUI : Graphical User Interfaces) est extrêmement complexe. Chaque système
d’exploitation peut en effet proposer plusieurs « bibliothèques » de fonctions graphiques de
base, auxquelles viennent fréquemment s’ajouter de nombreux compléments, plus ou moins
spécifiques de langages de programmation particuliers. Tous ces composants sont
généralement présentés comme des classes d’objets, dont il vous faudra étudier les attributs
et les méthodes.
Avec Python, la bibliothèque graphique la plus utilisée jusqu’à présent est la bibliothèque
tkinter, qui est une adaptation de la bibliothèque Tk développée à l’origine pour le langage
Tcl. Plusieurs autres bibliothèques graphiques fort intéressantes ont été proposées pour Python
: wxPython, pyQT, pyGTK, etc. Il existe également des possibilités d’utiliser les bibliothèques de
widgets Java et les MFC de Windows. Dans le cadre de ces notes, nous nous limiterons
cependant à tkinter, dont il existe fort heureusement des versions similaires (et gratuites) pour
les platesformes Linux, Windows et Mac OS.
fenetre = Tk()
texte1 = Label(fenetre, text = "Bonjour la STIC 1", fg = "blue")
texte1.pack()
bouton1 = Button(fenetre, text = "Quiter", command = fenetre.destroy)
bouton1.pack()
fenetre.mainloop()
def drawline():
"Tracé d'une ligne dans le canevas can1"
global x1, y1, x2, y2, coul
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
TS STIC 1 / 2018-2019
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]
IV. Les composants visuels ou widgets
#------ Programme principal -------
V. Les évènements
# 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
# Création du widget principal ("maître") :
fen1 = Tk()
# 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
fen1.destroy() # destruction (fermeture) de la fenêtre
TP 2
1. Comment faut-il modifier le programme pour ne plus avoir
que des lignes de couleur cyan, maroon et green ?
3. Agrandissez le canevas de manière à lui donner une largeur de 500 unités et une hauteur
de 650. Modifiez également la taille des lignes, afin que leurs extrémités se
confondent avec les bords du canevas.
4. Ajoutez une fonction drawline2 qui tracera deux lignes rouges en croix au centre du
canevas : l’une horizontale et l’autre verticale. Ajoutez également un bouton portant
l’indication « viseur ». Un clic sur ce bouton devra provoquer l’affichage de la croix.
TS STIC 1 / 2018-2019
Petite calculatrice scientifique
Bien que très court, le petit script ci-dessous implémente une calculatrice complète, avec
laquelle vous pourrez même effectuer des calculs comportant des parenthèses et des fonctions
scientifiques. N’y voyez rien d’extraordinaire. Toute cette fonctionnalité n’est qu’une
conséquence du fait que vous utilisez un interpréteur plutôt qu’un compilateur pour exécuter
vos programmes.
def evaluer(event):
chaine.configure(text = "Résultat = " + str(eval(entree.get())))
TP 3 :
1. Modifier le programme afin qu’il prenne en compte le cas où
l’utilisateur entre une donnée erronée. Exemple : p/8. Dans ce cas
le programme ne doit pas présenter un bug ni rien du tout.
2. Ajouter des boutons à cette application afin qu’elle ressemble à
cette image :
Widget Description
Button Un bouton classique, à utiliser pour provoquer l’exécution d’une commande
quelconque.
Un espace pour disposer divers éléments graphiques. Ce widget peut être
Canvas utilisé pour dessiner, créer des éditeurs graphiques, et aussi pour
implémenter des widgets personnalisés.
TS STIC 1 / 2018-2019
Une case à cocher qui peut prendre deux états distincts (la case est cochée
Checkbutton ou
non). Un clic sur ce widget provoque le changement d’état.
Un champ d’entrée, dans lequel l’utilisateur du programme pourra insérer un
Entry texte quelconque à partir du clavier.
Une surface rectangulaire dans la fenêtre, où l’on peut disposer d’autres
Frame widgets. Cette surface peut être colorée. Elle peut aussi être décorée d’une
bordure.
Label Un texte (ou libellé) quelconque (éventuellement une image).
Une liste de choix proposés à l’utilisateur, généralement présentés dans une
Listbox sorte de boîte. On peut également configurer la Listbox de telle manière
qu’elle se comporte comme une série de « boutons radio » ou de cases à
cocher.
Menu Un menu. Ce peut être un menu déroulant attaché à la barre de titre, ou bien
un menu « pop up » apparaissant n’importe où à la suite d’un clic.
Menubutton Un bouton-menu, à utiliser pour implémenter des menus déroulants.
Permet d’afficher un texte. Ce widget est une variante du widget Label, qui
Message permet d’adapter automatiquement le texte affiché à une certaine taille ou à
un certain rapport largeur/hauteur.
Représente (par un point noir dans un petit cercle) une des valeurs d’une
Radiobutton variable qui peut en posséder plusieurs. Cliquer sur un bouton radio donne la
valeur correspondante à la variable, et « vide » tous les autres boutons radio
associés à la même variable.
Vous permet de faire varier de manière très visuelle la valeur d’une variable,
Scale en déplaçant un curseur le long d’une règle
Ascenseur ou barre de défilement que vous pouvez utiliser en association
Scrollbar avec
les autres widgets : Canvas, Entry, Listbox, Text.
Text Affichage de texte formaté. Permet aussi à l’utilisateur d’éditer le texte
affiché. Des images peuvent également être insérées.
Toplevel Une fenêtre affichée séparément, au premier plan.
TS STIC 1 / 2018-2019
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 25 01:39:11 2018
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) # => boucler, 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()
TP 4
2. Modifiez le programme de telle façon que la balle change de couleur à chaque « virage
».
3. Modifiez le programme de telle façon que la balle effectue des mouvements obliques
comme une bille de billard qui rebondit sur les bandes (« en zig-zag »).
5. À partir des scripts précédents, vous pouvez à présent écrire un programme de jeu
fonctionnant de la manière suivante : une balle se déplace au hasard sur un canevas, à
vitesse faible. Le joueur doit essayer de cliquer sur cette balle à l’aide de la souris. S’il y
arrive, il gagne un point, mais la balle se déplace désormais un peu plus vite, et ainsi de
suite. Arrêter le jeu après un certain nombre de clics et afficher le score atteint.
Notre application doit faire apparaître une fenêtre comportant un dessin de la résistance, ainsi
qu’un champ d’entrée dans lequel l’utilisateur peut encoder une valeur numérique. Un bouton
« Montrer » déclenche la modification du dessin de la résistance, de telle façon que les trois
bandes de couleur se mettent en accord avec la valeur numérique introduite. Contrainte : Le
programme doit accepter toute entrée numérique fournie sous forme entière ou réelle, dans
les limites de 10 à 1011 Ω. Par exemple, une valeur telle que 4.78e6 doit être acceptée et
arrondie correctement, c’est-à-dire convertie en 4800000 Ω
TS STIC 1 / 2018-2019
5.2. Mise en œuvre concrète
Nous construisons le corps de cette application simple sous la forme d’une classe. Nous voulons
vous montrer ainsi comment une classe peut servir d’espace de noms commun, dans lequel
vous pouvez encapsuler vos variables et nos fonctions. Le principal intérêt de procéder ainsi
est que cela vous permet de vous passer de variables globales. En effet :
➢ Mettre en route l’application se résumera à instancier un objet de cette classe.
➢ Les fonctions que l’on voudra y mettre en œuvre seront les méthodes de cet objet-
application.
➢ À l’intérieur de ces méthodes, il suffira de rattacher un nom de variable au paramètre
self pour que cette variable soit accessible de partout à l’intérieur de l’objet. Une telle
variable d’instance est donc tout à fait l’équivalent d’une variable globale (mais
seulement à l’inté- rieur de l’objet), puisque toutes les autres méthodes de cet objet
peuvent y accéder par l’intermédiaire de self.
class Application(object):
def __init__(self):
"""Constructeur de la fenêtre principale"""
self.root =Tk()
self.root.title('Code des couleurs')
self.dessineResistance()
Label(self.root, text ="Entrez la valeur de la résistance, en ohms :").\
grid(row =2, column =1, columnspan =3)
Button(self.root, text ='Montrer', command =self.changeCouleurs).\
grid(row =3, column =1)
Button(self.root, text ='Quitter', command =self.root.quit).\
grid(row =3, column =3)
self.entree = Entry(self.root, width =14)
self.entree.grid(row =3, column =2)
# Code des couleurs pour les valeurs de zéro à neuf :
self.cc = ['black','brown','red','orange','yellow',\
'green','blue','purple','grey','white']
self.root.mainloop()
TS STIC 1 / 2018-2019
def dessineResistance(self):
"""Canevas avec un modèle de résistance à trois lignes colorées"""
self.can = Canvas(self.root, width=250, height =100, bg ='ivory')
self.can.grid(row =1, column =1, columnspan =3, pady =5, padx =5)
self.can.create_line(10, 50, 240, 50, width =5) # fils
self.can.create_rectangle(65, 30, 185, 70, fill ='light grey', width =2)
# Dessin des trois lignes colorées (noires au départ) :
self.ligne =[] # on mémorisera les trois lignes dans 1 liste
for x in range(85,150,24):
self.ligne.append(self.can.\
create_rectangle(x,30,x+12,70,fill='black',width=0))
def changeCouleurs(self):
"""Affichage des couleurs correspondant à la valeur entrée"""
self.v1ch = self.entree.get() # cette méthode renvoie une chaîne
try:
v = float(self.v1ch) # conversion en valeur numérique
except:
err =1 # erreur : entrée non numérique
else:
err =0
if err ==1 or v < 10 or v > 1e11 :
self.signaleErreur() # entrée incorrecte ou hors limites
else:
li =[0]*3 # liste des 3 codes à afficher
logv = int(log10(v)) # partie entière du logarithme
ordgr = 10**logv # ordre de grandeur
# extraction du premier chiffre significatif :
li[0] = int(v/ordgr) # partie entière
decim = v/ordgr - li[0] # partie décimale
# extraction du second chiffre significatif :
li[1] = int(decim*10 +.5) # +.5 pour arrondir correctement
# nombre de zéros à accoler aux 2 chiffres significatifs :
li[2] = logv -1
# Coloration des 3 lignes :
for n in range(3):
self.can.itemconfigure(self.ligne[n], fill =self.cc[li[n]])
def signaleErreur(self):
self.entree.configure(bg ='red') # colorer le fond du champ
self.root.after(1000, self.videEntree) # après 1 seconde, effacer
def videEntree(self):
self.entree.configure(bg ='white') # rétablir le fond blanc
self.entree.delete(0, len(self.v1ch)) # enlever les car. présents
# Programme principal :
if __name__ == '__main__':
from tkinter import *
from math import log10 # logarithmes en base 10
f = Application() # instanciation de l'objet application
TS STIC 1 / 2018-2019
5.3. Commentaires
Ligne 1 : La classe est définie comme une nouvelle classe indépendante (elle ne dérive
d’aucune classe parente préexistante, mais seulement de object, « ancêtre » de toutes les
classes).
Lignes 15-17 : Le code des couleurs est mémorisé dans une simple liste.
Lignes 45-46 : Les mathématiques viennent à notre secours pour extraire de la valeur
numérique son ordre de grandeur (c’est-à-dire l’exposant de 10 le plus proche). Veuillez
consulter un ouvrage de mathématiques pour de plus amples explications concernant les
logarithmes.
Lignes 47-48 : Une fois connu l’ordre de grandeur, il devient relativement facile d’extraire
du nombre traité ses deux premiers chiffres significatifs. Exemple : supposons que la valeur
entrée soit 31687. Le logarithme de ce nombre est 4,50088... dont la partie entière (4) nous
donne l’ordre de grandeur de la valeur entrée (soit 104). Pour extraire de celle-ci son
TS STIC 1 / 2018-2019
premier chiffre significatif, il suffit de la diviser par 104, soit 10000, et de conserver
seulement la partie entière du résultat (3).
Ligne 53 : Le nombre de zéros à accoler aux deux chiffres significatifs correspond au calcul
de l’ordre de grandeur. Il suffit de retirer une unité au logarithme.
Ligne 56 : Pour attribuer une nouvelle couleur à un objet déjà dessiné dans un canevas, on
utilise la méthode itemconfigure(). Nous utilisons donc cette méthode pour modifier
l’option fill de chacune des bandes colorées, en utilisant les noms de couleur extraits de la
liste self.cc grâce à aux trois indices li[1], li[2] et li[3] qui contiennent les 3 chiffres
correspondants.
TP 5
1. Modifiez le script ci-dessus de telle manière que le fond d’image devienne bleu clair
(light blue), que le corps de la résistance devienne beige (beige), que le fil de cette
résistance soit plus fin, et que les bandes colorées indiquant la valeur soient plus larges.
2. Modifiez le script ci-dessus de telle manière que l’image dessinée soit deux fois plus
grande.
3. Modifiez le script ci-dessus de telle manière qu’il devienne possible d’entrer aussi des
valeurs de résistances comprises entre 1 et 10 Ω. Pour ces valeurs, le premier anneau
coloré devra rester noir, les deux autres indiqueront la valeur en Ω et dixièmes d’ Ω.
4. Modifiez le script ci-dessus de telle façon que le bouton « Montrer » ne soit plus
nécessaire. Dans votre script modifié, il suffira de frapper <Enter> après avoir entré la
valeur de la résistance, pour que l’affichage s’active.
5. Modifiez le script ci-dessus de telle manière que les trois bandes colorées redeviennent
noires dans les cas où l’utilisateur fournit une entrée inacceptable.
TS STIC 1 / 2018-2019