Écris un script Python ci-dessous et clique sur « Lancer » pour l'exécuter. Il a accès à un petit écran tactile, un bouton, un capteur d'inclinaison et une console.
Touche l'écran pour simuler is_touched().
Choisis une notion Python ou une fonction pour voir son explication ci-dessous.
Choisis une notion Python à gauche, ou une fonction de Roberto à droite, pour voir son explication ici.
Un programme Python s'exécute ligne par ligne, du haut vers le bas, dans l'ordre où tu les as écrites. Chaque instruction se termine avant que la suivante ne commence : il n'y a pas de « en même temps ».
clear_display()
display_text("Un", x=10, y=10)
display_text("Deux", x=10, y=30)
display_text("Trois", x=10, y=50)
« Un » est dessiné, puis « Deux » en dessous, puis « Trois » en dessous : toujours dans cet ordre, jamais dans un autre.
y=10), puis l'heure juste en dessous (y=30), puis la date encore en dessous (y=50). Utilise plusieurs instructions display_text les unes après les autres.Défi 1
display_text("Adrien", x=10, y=10)
display_text(get_time(), x=10, y=30)
display_text(get_date(), x=10, y=50)
Défi 2 (pour aller plus loin)
Si tu inverses par exemple les deux premières lignes, le prénom s'affiche à y=30 (à la place de l'heure) et l'heure à y=10 (à la place du prénom) : l'ordre d'exécution détermine quel texte occupe quelle position, pas de surprise ni d'erreur — juste un échange de place.
Un commentaire est une ligne que Python ignore complètement : elle sert uniquement à toi, pour expliquer ton code.
Pour écrire un commentaire, on met un # devant le texte. Tout ce qui suit sur la même ligne n'est pas exécuté.
# Ce programme affiche "Un"
clear_display()
display_text("Un", x=10, y=10) # ceci s'affiche en haut de l'écran
Tout ce qui est inscrit après le symbole # n'a aucun effet sur le programme : ici seuls clear_display() et display_text(...) sont réellement exécutés.
# au tout début d'une ligne de code qui fonctionnait avant — que se passe-t-il ?Défi 1
# Ce programme affiche mon prénom à l'écran
display_text("Adrien", x=10, y=10)
Défi 2 (pour aller plus loin)
En mettant un # au tout début d'une ligne de code (par exemple # display_text("Adrien", x=10, y=10)), toute la ligne devient un commentaire : Python l'ignore complètement, donc le texte ne s'affiche plus du tout. On dit qu'on a « commenté » la ligne — une technique utile pour désactiver temporairement un bout de code sans le supprimer.
# : Python l'ignore complètement, il ne sert qu'à toi.# sur la même ligne n'est pas exécuté.Un programme peut utiliser des fonctions déjà écrites, toutes prêtes à l'emploi — il en existe plein. Par exemple get_time() (elle renvoie l'heure actuelle) ou get_tilt_x() (elle renvoie l'inclinaison de la montre sur un axe, en degrés).
Pourquoi on a besoin de ça : au moment où tu écris ton programme, tu ne sais pas encore quelle heure il sera quand il va s'exécuter — ni quelle heure il sera quand quelqu'un regardera sa montre, plus tard, dans la journée. Tu ne peux donc pas écrire un nombre fixe comme 14:32 directement dans le code : ce serait faux dès la minute suivante. Une fonction comme get_time() permet de dire « va vérifier maintenant », au moment exact où le programme tourne.
C'est là qu'intervient la deuxième idée importante : quand le programme s'exécute, get_time() n'existe plus telle quelle — elle est remplacée par le résultat qu'elle renvoie à cet instant précis.
C'est un peu comme envoyer quelqu'un demander l'heure à ta place : tu écris « demande l'heure », mais ce qui compte à la fin, c'est la réponse qu'on te rapporte — par exemple 14:32 — pas la phrase « demande l'heure » elle-même.
display_text(get_time(), x=10, y=10)
Au moment où cette ligne s'exécute :
get_time() est calculé en premier, et donne par exemple "14:32"display_text("14:32", x=10, y=10)get_time() lui-mêmedisplay_text(get_time(), x=10, y=10).display_text(str(get_tilt_x()), x=10, y=10) — rappelle-toi, cette fonction renvoie l'inclinaison de la montre en degrés. Fais glisser le curseur « Inclinaison X » avant de lancer : est-ce que le résultat change ?display_text(get_time, x=10, y=10), sans les parenthèses à la fin ? Essaie, et observe ce qui se passe (ce n'est pas grave si ça ne marche pas comme prévu).Défis 1 à 3
display_text(get_time(), x=10, y=10)
L'heure actuelle s'affiche (par exemple "14:32") — exactement comme attendu, puisque get_time() est remplacée par sa valeur avant l'affichage.
display_text(str(get_tilt_x()), x=10, y=10)
Le nombre affiché change bien quand tu bouges le curseur « Inclinaison X » : get_tilt_x() est recalculée à chaque exécution du programme, donc elle reflète la position du curseur au moment où tu cliques sur « Lancer ». Le str() est nécessaire : get_tilt_x() renvoie un nombre, et display_text() attend du texte (sur la vraie montre, l'oublier fait planter ton programme — le simulateur est juste plus tolérant).
Défi 4 (pour aller plus loin)
display_text(get_time, x=10, y=10)
Sans les parenthèses, get_time désigne la fonction elle-même (pas son résultat) : display_text reçoit donc la fonction en tant que valeur, pas un texte ou un nombre, et ça provoque une erreur plutôt que d'afficher l'heure. C'est pour ça qu'il ne faut jamais oublier les parenthèses () pour appeler une fonction.
get_time(), get_tilt_x()...).nom_de_fonction()) est remplacé par le résultat qu'elle renvoie, avant que la suite de la ligne ne s'exécute. Ce résultat est parfois appelé la valeur de retour de la fonction.Tu sais maintenant qu'une fonction comme get_time() est remplacée par sa valeur. On peut utiliser cette valeur tout de suite, comme on l'a fait jusqu'ici Mais on peut aussi choisir de la ranger dans une boîte, pour la réutiliser plus facilement ensuite.
Cette boîte s'appelle une variable. On lui donne un nom, et on y range un résultat avec le symbole = :
heure = get_time()
Ici, = ne veut pas dire « égal » comme en maths : il veut dire « range ce qui est calculé à droite dans la boîte nommée à gauche ».
Pour vérifier ce que contient une variable, il suffit d'écrire son nom, tout seul. Exactement comme pour une fonction (fiche A), au moment où le programme s'exécute, ce nom est remplacé par ce qu'il y a dans la boîte :
heure = get_time()
display_text(heure, x=10, y=10)
Attention à ne pas confondre une variable et une fonction : une fonction s'appelle toujours avec des parenthèses (get_time(), ça veut dire « va chercher l'information »), alors qu'une variable s'utilise sans parenthèses (heure, ça veut dire « ce qui est déjà rangé dans la boîte »). Oublier ou ajouter des parenthèses par erreur est une source fréquente de bugs !
Ces deux programmes font exactement la même chose :
Avec une variable :
heure = get_time()
display_text(heure, x=10, y=10)
Sans variable (fonctions imbriquées) :
display_text(get_time(), x=10, y=10)
Les deux affichent la même chose à l'écran. La différence, c'est la lisibilité : avec la variable, on lit le programme comme une recette, étape par étape (« je range l'heure, puis je l'affiche »), et on peut réutiliser heure plusieurs fois sans avoir à rappeler get_time() à chaque fois.
Attention cependant : heure contient l'heure qu'il était au moment précis où la ligne heure = get_time() s'est exécutée — ça ne bougera plus tant qu'on n'écrira pas à nouveau heure = .... get_time(), lui, donne une réponse différente à chaque fois qu'on l'appelle, puisqu'il va revérifier l'heure en direct. Une variable, c'est une photo prise à un instant donné — pas une caméra qui filme en continu.
Une chose à savoir : en Python, une variable n'a pas besoin d'être annoncée à l'avance — écrire heure = get_time() crée la boîte heure au moment même où cette ligne s'exécute. En revanche, si tu essaies d'utiliser une variable avant de l'avoir remplie au moins une fois (par exemple si tu écris display_text(minute, x=10, y=10) sans avoir jamais fait minute = ... avant), le programme ne comprendra pas ce que représente minute et affichera une erreur. Une variable doit toujours avoir été remplie au moins une fois avant d'être lue.
get_tilt_x() dans une variable nommée inclinaison, puis affiche-la.get_time() une seconde fois.= avec ce nom avant). Regarde le message qui apparaît, ce n'est pas grave, c'est normal !Défi 1
inclinaison = get_tilt_x()
display_text(str(inclinaison), x=10, y=10)
Défi 2
heure = get_time()
display_text(heure, x=10, y=10)
display_text(heure, x=10, y=30)
Défi 3
heure = get_time()
heure
Dans la console, taper juste heure affiche la valeur contenue dans la variable (par exemple '14:32') — exactement comme si tu avais écrit print(heure).
Défi 4 (pour aller plus loin)
heure = get_time()
inclinaison = get_tilt_x()
display_text(heure, x=10, y=10)
display_text(str(inclinaison), x=10, y=30)
Défi 5 (pour aller plus loin)
Essayer d'afficher une variable jamais remplie (par exemple display_text(mystere, x=10, y=10) sans avoir jamais écrit mystere = ... avant) provoque une erreur du genre NameError: name 'mystere' is not defined — Python ne connaît pas cette boîte, puisqu'elle n'a jamais été créée.
=.=, pas besoin de l'annoncer avant. Mais on ne peut pas lire une variable qui n'a jamais été remplie.heure = ... à nouveau.Jusqu'ici, tu as manipulé deux sortes de valeurs bien différentes : du texte, comme "14:32" ou "Bonjour" (on dit aussi une chaîne de caractères, ou string), et des nombres, comme 18 ou -3 (on parle d'entier, ou int). Un texte s'écrit toujours entre guillemets ("..."), un nombre jamais.
Cette différence n'est pas qu'une question d'écriture : Python les traite vraiment différemment. Par exemple, + additionne deux nombres (3 + 2 donne 5), mais colle deux textes l'un après l'autre ("a" + "b" donne "ab"). Et on ne peut pas mélanger les deux sans précaution : écrire "score : " + 10 provoque une erreur, parce que Python ne sait pas additionner un texte et un nombre.
C'est aussi pour ça que certaines fonctions attendent un type précis en paramètre, et pas l'autre : display_text(...) attend du texte, alors que time.sleep(...) attend un nombre (une durée en secondes). Sur la vraie montre, donner le mauvais type à l'une de ces fonctions fait planter ton programme. Le simulateur, lui, est plus tolérant avec display_text(...) : il convertit automatiquement ce que tu lui donnes en texte avant de l'afficher, donc ton code peut avoir l'air de marcher même sans str(). Mais comme ce ne sera pas le cas sur la vraie montre, prends dès maintenant l'habitude de toujours convertir un nombre avec str() avant de l'afficher.
Heureusement, on peut transformer une valeur d'un type vers l'autre :
str(valeur) transforme un nombre en texteint(texte) transforme un texte (qui ne contient que des chiffres) en nombre(Il existe d'autres types de valeurs en Python — tu les découvriras plus tard. Pour l'instant, retiens surtout qu'un nombre et un texte ne sont pas interchangeables.)
age = 10
print("J'ai " + str(age) + " ans") # sans str(), ça provoquerait une erreur
texte = "42"
nombre = int(texte)
print(nombre + 1) # affiche 43
Sans str(age), la ligne "J'ai " + age + " ans" provoquerait une erreur : on ne peut pas coller directement un texte et un nombre avec +. Et sans int(texte), on ne pourrait pas faire texte + 1, puisque texte serait toujours du texte, pas un nombre.
"Score : " + 10 directement dans la console, sans str(). Lis le message d'erreur, puis corrige en ajoutant str(10)."7" dans une variable, transforme-la en nombre avec int(), puis additionne-lui 3 et affiche le résultat.get_tilt_x(). Cette fonction renvoie-t-elle un nombre ou un texte ? As-tu besoin de str() ?int("bonjour") ? Pourquoi, à ton avis ?Défi 1
print("Score : " + str(10))
Défi 2
texte = "7"
nombre = int(texte)
print(nombre + 3)
Défi 3
display_text("Inclinaison : " + str(get_tilt_x()), x=10, y=10)
Défi 4
int("bonjour") provoque une erreur (ValueError) : Python ne peut pas transformer "bonjour" en nombre, puisque ce texte ne contient pas uniquement des chiffres.
+ additionne deux nombres, mais colle deux textes : on ne peut pas mélanger les deux directement.display_text(...) et time.sleep(...) attendent chacune un type précis (texte pour l'une, nombre pour l'autre) : sur la vraie montre, le mauvais type fait planter ton programme. Le simulateur est plus tolérant avec display_text(), mais prends quand même l'habitude d'utiliser str().str(valeur) transforme un nombre en texte ; int(texte) transforme un texte en nombre.Ta carte a des « sens », un peu comme les 5 sens du corps humain. Pour ça, elle est reliée à des capteurs par des fils électriques, un peu comme nos yeux sont reliés à notre cerveau par des nerfs. Dans ces fils passent des messages, qu'on appelle des signaux.
Ta montre a plusieurs capteurs :
Pour obtenir une mesure d'un capteur, il faut la demander, grâce à une fonction :
get_time() : demande l'heure actuelle à l'horlogeget_tilt_x() : demande à l'IMU l'inclinaison de gauche à droiteget_tilt_y() : demande à l'IMU l'inclinaison d'avant en arrièreis_touched() : demande l'état du toucher (True si on a touché l'écran depuis la dernière fois qu'on a posé la question, False sinon)Quand tu appelles une de ces fonctions, elle active les systèmes électriques de la carte pour échanger des signaux avec le capteur concerné, et en ramener la mesure. Tu n'as pas besoin de savoir comment le capteur est fabriqué ni comment ces signaux circulent réellement, la fonction s'occupe de tout ça à ta place.
Et comme il s'agit d'une fonction, au moment où le programme s'exécute, elle est remplacée par la valeur mesurée par le capteur à cet instant précis.
Pour afficher un résultat à l'écran, on utilise une autre fonction :
display_text(...) — écrit quelque chose sur l'écran de la montreDeux façons d'afficher l'heure sur ta montre, qui donnent le même résultat :
En une seule ligne (fonctions imbriquées) :
display_text(get_time(), x=10, y=10)
En deux étapes (avec une variable) :
heure = get_time()
display_text(heure, x=10, y=10)
Tu peux aussi tester ces commandes directement dans la console de Thonny. Attention cependant : display_text(...) n'écrit que sur l'écran de la montre, pas dans la console. Pour afficher un résultat dans la console, on utilise une autre fonction, déjà fournie par Python lui-même : print(...).
print(get_time(), x=10, y=10)
get_tilt_x()) à la place de l'heure.is_touched()) — essaie en touchant l'écran juste avant de lire la valeur, puis sans le toucher : est-ce que le résultat change ? (Tu verras True ou False s'afficher — c'est normal, c'est la réponse du capteur.)print() pour afficher l'heure — observe la différence avec display_text(), qui écrit sur l'écran de la montre.Défi 1
display_text(get_time(), x=10, y=10)
Défi 2
display_text(str(get_tilt_x()), x=10, y=10)
Défi 3
display_text(str(is_touched()), x=10, y=10)
True s'affiche si tu as touché l'écran juste avant, False sinon.
Défi 4
print(get_time())
print() écrit dans la console (en bas), pas sur l'écran de la montre, contrairement à display_text().
Défi 5 (pour aller plus loin)
heure = get_time()
inclinaison = get_tilt_x()
display_text(heure, x=10, y=10)
display_text(str(inclinaison), x=10, y=30)
Défi 6 (pour aller plus loin)
display_text("Adrien " + get_time(), x=10, y=10)
Comme get_time() renvoie déjà du texte, on peut le coller directement à un autre texte avec + (voir la fiche « Nombres et texte »).
get_time(), get_tilt_x(), is_touched()...), qui est remplacée par la valeur mesurée au moment où le programme s'exécute. Tu n'as pas besoin de savoir comment le capteur fonctionne à l'intérieur, la fonction s'en occupe pour toi.display_text() écrit sur l'écran de la montre ; print() écrit dans la console — ce ne sont pas les mêmes destinations.display_text() reste figé à l'écran tant qu'on ne relance pas le programme — on ne l'a affiché qu'une seule fois.Si l'écran n'affiche rien ou qu'un message rouge apparaît, ce n'est pas grave : lève la main, ou passe au défi suivant et reviens-y plus tard.
En Python, l'indentation (le nombre d'espaces au début d'une ligne) n'est pas juste une question de présentation : elle fait partie du langage. C'est elle qui indique à Python quelles lignes appartiennent ensemble, à l'intérieur d'un même bloc.
Un bloc commence juste après une ligne qui se termine par : (par exemple après un if, un while, plus tard un for ou une fonction). Toutes les lignes qui suivent, décalées vers la droite du même nombre d'espaces, font partie de ce bloc. Dès qu'une ligne revient au même niveau qu'avant le :, le bloc est terminé.
Dans ce cours, on utilise toujours 4 espaces pour décaler d'un niveau. Thonny (l'éditeur que tu utilises) ajoute généralement ces espaces automatiquement après un :, mais tu peux aussi appuyer sur la touche Tab.
Attention : une indentation incohérente (mélanger des lignes avec des nombres d'espaces différents à l'intérieur du même bloc) provoque une erreur. Python est strict sur ce point, contrairement à d'autres langages où l'indentation n'est qu'une question de style.
while True:
display_text("Salut", x=10, y=10) # indenté : appartient à la boucle
bip() # indenté : appartient aussi à la boucle
print("fin") # pas indenté : ne fait PAS partie de la boucle
Les deux premières lignes sont décalées de 4 espaces : elles font partie du bloc de la boucle while True:, et sont donc rejouées à chaque tour. La ligne print("fin") n'est pas décalée : elle n'appartient pas à la boucle (et ici, elle ne s'exécuterait même jamais, puisque la boucle est infinie).
while True: contenant deux lignes indentées, et ajoute une troisième ligne indentée au même niveau : vérifie qu'elle fait bien partie de la boucle.: à la fin de la ligne précédente. Que se passe-t-il ?Défi 1
while True:
display_text("Salut", x=10, y=10)
bip()
print("tour de boucle")
La troisième ligne (print(...)), indentée au même niveau que les deux autres, fait bien partie du bloc de la boucle : elle s'exécute à chaque tour, comme les deux premières.
Défi 2
En décalant une ligne d'un espace de trop ou de moins par rapport aux autres lignes du même bloc, Thonny affiche une erreur IndentationError (par exemple « unexpected indent » ou « unindent does not match any outer indentation level ») : Python ne sait plus à quel bloc rattacher cette ligne.
Défi 3 (pour aller plus loin)
Écrire une ligne indentée sans qu'il y ait de : à la fin de la ligne précédente provoque aussi une IndentationError (« unexpected indent ») : sans :, Python n'attend pas de bloc, donc une ligne décalée vers la droite n'a pas de sens à ses yeux.
: ; il regroupe toutes les lignes suivantes indentées au même niveau.La dernière fois, ta montre affichait l'heure une seule fois : figée, comme une photo. Pour qu'elle reste juste, il faudrait refaire cette mesure et cet affichage très souvent.
On pourrait se dire : il suffit d'écrire heure = get_time() puis display_text(heure, x=10, y=10) plein de fois de suite dans le programme. Mais est-ce une bonne idée ? Réfléchis : que se passerait-il si on essayait d'écrire ces deux lignes des milliers de fois dans le même programme ?
La solution : écrire les instructions une seule fois, et demander au programme de les exécuter plusieurs fois de suite. C'est ce qu'on appelle une boucle : à chaque fois que le programme arrive à la fin de ces instructions, il revient au début, comme s'il tournait en rond. Et comme on ne lui dit jamais de s'arrêter, on parle de boucle infinie :
while True:
# tout ce qui est ici est rejoué, encore et encore, sans jamais s'arrêter
...
while True:
heure = get_time()
display_text(heure, x=10, y=10)
Cette fois, l'heure affichée se met à jour toute seule, sans qu'on ait besoin de relancer quoi que ce soit.
get_time() / display_text() à l'intérieur d'une boucle infinie (while True:). Vérifie que l'heure avance bien toute seule à l'écran.get_tilt_x()) : la valeur doit changer en direct quand tu penches la montre.is_touched()) : la valeur doit changer dès que tu touches ou relâches l'écran.time.sleep(secondes) dans ta boucle (par exemple time.sleep(5)) : ça ajoute un temps d'attente à chaque tour, en plus du temps que met déjà la puce à exécuter tes instructions. Observe : est-ce que les minutes et les secondes affichées restent correctes, ou est-ce que certaines valeurs semblent « sautées » ?Défi 1
while True:
display_text(get_time(), x=10, y=10)
Défi 2
while True:
display_text(str(get_tilt_x()), x=10, y=10)
Défi 3
while True:
display_text(str(is_touched()), x=10, y=10)
Défi 4
while True:
display_text(get_time(), x=10, y=10)
display_text(str(get_tilt_x()), x=10, y=30)
display_text(str(is_touched()), x=10, y=50)
Défi 5
while True:
display_text(get_time(), x=10, y=10)
time.sleep(5)
Avec time.sleep(5), l'heure affichée avance toujours correctement (l'horloge ne dépend pas de la boucle), mais elle ne se met à jour qu'une fois toutes les 5 secondes environ : certaines minutes/secondes intermédiaires ne sont jamais affichées, elles sont « sautées ».
Défi 6 (pour aller plus loin) C'est une vérification manuelle à faire sur la carte : débranche-la, rebranche-la, et observe si ton programme se relance automatiquement sans repasser par Thonny. Si ce n'est pas le cas, demande de l'aide — il faut généralement que le script soit enregistré directement sur la carte, sous un nom précis.
while True:).Si l'écran n'affiche rien ou qu'un message rouge apparaît, ce n'est pas grave : lève la main, ou passe au défi suivant et reviens-y plus tard.
Une condition, c'est quelque chose qui vaut soit True (vrai), soit False (faux). Rien d'autre.
Par exemple, 10 >= 12 est une condition : elle vaut True si c'est vrai, False sinon.
Attention : pour comparer deux valeurs, on utilise deux signes égal ==, pas un seul. Un seul = sert à autre chose (ranger une valeur dans une variable, fiche B), pas à comparer.
Certaines fonctions, comme is_button_pressed(), renvoient directement True ou False, sans avoir besoin de comparaison.
print(10 >= 12) # est-ce que 10 est plus grand ou égal à 12 ?
print(5 == 5) # est-ce que 5 est égal à 5 ?
print(is_button_pressed()) # est-ce que le bouton est appuyé ?
La console affiche False, puis True, puis True ou False selon que tu appuies sur le bouton ou non. Une condition, c'est toujours l'un ou l'autre : jamais autre chose.
get_time()) est égale à "12:00".5 = 5 (un seul signe égal) au lieu de 5 == 5, et regarde le message d'erreur — ce n'est pas grave, c'est pour comprendre la différence.Défi 1
print(get_time() == "12:00")
Défi 2 (pour aller plus loin)
5 = 5 provoque une erreur de syntaxe : Python comprend = comme « range la valeur de droite dans la boîte nommée à gauche », et 5 n'est pas un nom de variable valide — il ne peut rien recevoir. C'est un bon rappel que = et == ne font pas du tout la même chose.
True ou False, jamais autre chose.== sert à comparer deux valeurs ; = sert à ranger une valeur dans une variable, ce n'est pas le même symbole ni le même rôle.is_button_pressed()) renvoient directement True ou False, sans qu'on ait besoin d'écrire une comparaison.if condition: n'exécute le bloc de code indenté en dessous que si condition vaut True. Sinon, ce bloc est simplement ignoré.
while True:
if is_button_pressed():
print("Bouton pressé !") # cette ligne est indentée (décalée) par rapport au if : elle ne s'exécute que si la condition est True
time.sleep(0.1) # cette ligne est alignée avec le if : elle s'exécute toujours, que la condition soit True ou False
Le programme vérifie sans arrêt si le bouton est pressé grâce à while True:. Le message ne s'affiche dans la console que les fois où c'est le cas : sinon, rien ne se passe.
Apprends à Roberto à répondre uniquement quand tu appuies sur son bouton : affiche "Je t'écoute !" à l'écran (display_text("Je t'écoute !", x=10, y=10)), uniquement pendant que le bouton est enfoncé.
Pour aller plus loin : ajoute une deuxième condition dans la même boucle pour que Roberto réagisse aussi quand on touche l'écran (is_touched()).
Défi 1
while True:
if is_button_pressed():
display_text("Je t'écoute !", x=10, y=10)
Défi 2 (pour aller plus loin)
while True:
if is_button_pressed():
display_text("Je t'écoute !", x=10, y=10)
if is_touched():
display_text("Je t'écoute !", x=10, y=10)
if condition: n'exécute son bloc indenté que si la condition vaut True, sinon, il ne se passe rien.Tu connais déjà if condition: : il exécute un bloc seulement si la condition est vraie, et ne fait rien sinon.
else: permet d'ajouter un deuxième bloc, qui s'exécute uniquement quand la condition est fausse. Ton programme fait alors toujours l'un des deux blocs : jamais aucun, jamais les deux.
while True:
clear_display()
if is_button_pressed():
display_text("Pressé !", x=10, y=10)
else:
display_text("En attente...", x=10, y=10)
time.sleep(0.05)
L'écran affiche toujours quelque chose : soit « Pressé ! » quand tu appuies sur le bouton, soit « En attente... » sinon. Jamais les deux en même temps, jamais rien du tout.
get_time()) est égale à "12:00", et l'heure normale sinon.else: par un deuxième if. Que se passe-t-il de différent si les deux conditions sont vraies en même temps ?Défi 1
while True:
if get_time() == "12:00":
display_text("Midi !", x=10, y=10)
else:
display_text(get_time(), x=10, y=10)
Défi 2 (pour aller plus loin)
Avec deux if séparés (au lieu de if/else), chaque condition est vérifiée indépendamment : si les deux étaient vraies en même temps, les deux blocs s'exécuteraient l'un après l'autre (le deuxième affichage écraserait le premier à l'écran). Avec if/else, c'est impossible : un seul des deux blocs peut s'exécuter, jamais les deux.
else: s'exécute uniquement quand la condition du if qui le précède est fausse.La boucle while True: répète pour toujours. for ... in range(n): répète un nombre de fois précis et connu à l'avance : n fois.
range(n) fournit n valeurs, de 0 à n-1. À chaque tour de boucle, la variable qui suit for (ici i) prend la valeur suivante — pratique pour compter les tours, ou numéroter quelque chose.
for i in range(5):
print("Tour n°", i)
Le bloc indenté sous for i in range(5): est répété 5 fois ; i prend successivement les valeurs 0, 1, 2, 3 puis 4.
Défi 1
import time
for i in range(3):
bip()
time.sleep(0.5)
for i in range(n): répète exactement n fois, contrairement à while True: qui répète pour toujours.range(n) donne les valeurs 0, 1, 2, ..., n-1 ; i en prend une nouvelle à chaque tour.i) est pratique pour compter les tours ou faire varier quelque chose (position, taille...) à chaque passage.Python peut faire des calculs directement, et une variable peut stocker le résultat d'un calcul (pas seulement une valeur fixe) : surface = largeur * hauteur calcule d'abord largeur * hauteur, puis range le résultat dans surface.
Les quatre opérations de base s'écrivent + (addition), - (soustraction), * (multiplication) et / (division). Comme en maths, la multiplication et la division sont calculées avant l'addition et la soustraction — utilise des parenthèses () pour changer l'ordre si besoin.
Pour aller plus loin : from math import sin, cos donne accès au sinus et au cosinus (sin(angle), cos(angle)). Attention, l'angle est en radians, pas en degrés.
from math import sin, cos
a = 3 + 4 * 2
b = (3 + 4) * 2
print(a)
print(b)
print(sin(0))
print(cos(0))
a vaut 11 (le 4 * 2 est calculé avant le +), alors que b vaut 14 (les parenthèses forcent à calculer 3 + 4 d'abord). sin(0) vaut 0.0 et cos(0) vaut 1.0.
largeur * hauteur), stocke le résultat dans une variable, puis affiche-le sur l'écran de la montre.Défi 1
largeur = 12
hauteur = 8
surface = largeur * hauteur
clear_display()
display_text(str(surface), x=10, y=10)
+ - * / suivent la même priorité qu'en maths (*// avant +/-) ; les parenthèses changent l'ordre.from math import sin, cos donne le sinus/cosinus, mais attention : l'angle est en radians, pas en degrés.En combinant une boucle for avec les fonctions de dessin (draw_circle, draw_rect...), tu peux faire bouger ou évoluer une forme à chaque tour : ça donne l'impression d'une animation.
Le principe : à chaque tour, clear_display() efface l'ancienne image, une forme est dessinée à une position (ou une taille) qui dépend de i, puis une courte pause (time.sleep(...)) laisse le temps de voir l'image avant de passer au tour suivant.
import time
for i in range(5):
clear_display()
draw_circle(20 + i * 40, 140, 15, fill=True)
time.sleep(0.3)
À chaque tour, i change (0, 1, 2, 3, 4), donc 20 + i * 40 change aussi : le cercle est redessiné un peu plus à droite à chaque fois. Comme l'écran est effacé avant, ça donne l'impression que le cercle se déplace.
Défi 1
import time
for i in range(8):
clear_display()
draw_circle(120, 140, 5 + i * 5, fill=True)
time.sleep(0.2)
clear_display() avant de redessiner évite que les anciennes formes restent affichées.i) sert à faire varier la position ou la taille de la forme à chaque tour.Dans la fiche précédente, clear_display() efface tout l'écran avant chaque nouveau dessin : l'écran passe un court instant par du noir, ce qui donne un petit scintillement visible.
Un sprite règle ce problème : c'est une mini-image gardée en mémoire, invisible. On dessine dedans avec les fonctions déjà connues (draw_circle, draw_rect...), en ajoutant juste sprite=mon_sprite ; une fois le dessin terminé, draw_sprite l'envoie sur l'écran d'un seul coup. L'écran ne voit donc jamais d'étape intermédiaire : juste l'ancienne image, puis directement la nouvelle.
new_sprite(largeur, hauteur) crée le sprite (une seule fois, avant la boucle) ; clear_sprite l'efface (comme clear_display, mais pour le sprite) à chaque tour, avant de redessiner dedans.
import time
mon_sprite = new_sprite(90, 90)
for i in range(8):
clear_sprite(mon_sprite)
draw_circle(45, 45, 5 + i * 5, fill=True, sprite=mon_sprite)
draw_sprite(mon_sprite, 75, 95)
time.sleep(0.2)
Même cercle qui grossit que dans la fiche précédente, mais cette fois sans aucun scintillement : le cercle est entièrement redessiné dans mon_sprite (invisible) avant d'être envoyé sur l'écran par draw_sprite.
Défi 1
import time
mon_sprite = new_sprite(90, 90)
for i in range(8):
clear_sprite(mon_sprite)
draw_circle(45, 45, 5 + i * 5, fill=True, sprite=mon_sprite)
draw_sprite(mon_sprite, 75, 95)
time.sleep(0.2)
clear_display() + redessin direct peut faire scintiller l'écran (un court instant tout noir).draw_sprite — ça évite ce scintillement.print(texte)Affiche du texte dans la console.
print("bonjour")
compteur = 1
print("la variable compteur vaut :", compteur)
get_time()Renvoie l'heure actuelle, sous forme de texte (par exemple "14:32").
get_time()
get_date()Renvoie la date actuelle, sous forme de texte (par exemple "samedi 12 sept.").
get_date()
get_tilt_x()Renvoie l'inclinaison gauche/droite de la montre, en degrés (nombre entier).
get_tilt_x()
get_tilt_y()Renvoie l'inclinaison avant/arrière de la montre, en degrés (nombre entier).
get_tilt_y()
get_tilt_z()Renvoie l'inclinaison par rapport à la verticale, en degrés. 0° = montre bien à plat, 90° = montre sur la tranche.
get_tilt_z()
is_touched()Renvoie True si l'écran a été touché depuis le dernier appel à cette fonction, False sinon.
if is_touched():
bip()
is_button_pressed()Renvoie True si le bouton est enfoncé en ce moment même, False sinon.
is_button_pressed()
button_pressed_edge()Renvoie True juste au moment où on appuie sur le bouton, puis False tant qu'on ne l'a pas relâché et ré-appuyé. À utiliser dans un if.
if button_pressed_edge():
bip()
display_text(texte, x=4, y=4)Affiche le texte donné sur l'écran de la montre (efface l'écran avant d'écrire). x et y (optionnels) choisissent la position du texte, en pixels, depuis le coin en haut à gauche. Attend du texte : pour afficher un nombre, pense à le convertir d'abord avec str().
display_text("Salut !", x=4, y=4)
bip()Fait biper le buzzer de la montre pendant un court instant.
bip()
set_to_ntp_time(offset_heures=1)Règle automatiquement la date et l'heure de la montre via internet (NTP). Le Wi-Fi doit déjà être connecté. offset_heures : décalage par rapport à l'heure NTP (UTC) — 1 en France l'hiver (valeur par défaut), 2 l'été.
from _rtc import set_to_ntp_time set_to_ntp_time()
set_datetime(annee, mois, jour, heure, minute, seconde, jour_semaine)Règle la date et l'heure de la montre à la main. À appeler une seule fois : la RTC garde ensuite l'heure toute seule, même éteinte. jour_semaine : 0 = dimanche, 1 = lundi, 2 = mardi, 3 = mercredi, 4 = jeudi, 5 = vendredi, 6 = samedi.
from _rtc import set_datetime # samedi 12 septembre 2026 à 14h32:00 set_datetime(2026, 9, 12, 14, 32, 0, 6)
clear_display()Efface l'écran de la montre (le remplit en noir), sans y afficher de texte.
clear_display()
str(valeur)Transforme n'importe quelle valeur (nombre, booléen...) en texte (string).
age = 10 texte = str(age) display_text(texte, x=10, y=10)
int(texte)Transforme un texte qui contient des chiffres en nombre entier (int) — c'est l'inverse de str(). Attention : si le texte ne contient pas uniquement des chiffres, le programme affiche une erreur.
nombre = int("42")
print(nombre + 1)
time.sleep(secondes)Met le programme en pause pendant le nombre de secondes donné (un nombre à virgule est accepté, par exemple 0.5 pour une demi-seconde).
while True:
display_text(get_time(), x=10, y=10)
time.sleep(1)
time.sleep_ms(millisecondes)Comme time.sleep(), mais la pause est donnée en millisecondes (1000 millisecondes = 1 seconde) — pratique pour des pauses courtes ou précises.
bip() time.sleep_ms(200) bip()
time.ticks_ms()Renvoie un compteur de millisecondes qui augmente en continu (son point de départ n'a pas de signification particulière) — ne sert jamais seul, mais à mesurer une durée avec time.ticks_diff().
depart = time.ticks_ms()
time.ticks_diff(ticks1, ticks2)Calcule la différence entre deux valeurs renvoyées par time.ticks_ms() (ticks1 - ticks2), en millisecondes — à utiliser plutôt qu'une simple soustraction -, qui peut donner un résultat faux si le compteur a redémarré entre-temps.
depart = time.ticks_ms()
time.sleep_ms(300)
duree = time.ticks_diff(time.ticks_ms(), depart)
print("Ça a duré", duree, "ms")
draw_pixel(x, y, color=WHITE, sprite=None)Dessine un seul pixel à la position (x, y) de l'écran. color (optionnel) choisit la couleur, parmi RED, GREEN, BLUE, YELLOW, CYAN, MAGENTA, WHITE (par défaut) ou BLACK — à importer avec from st7789py import RED, GREEN, BLUE, YELLOW, CYAN, MAGENTA, WHITE, BLACK. Si on donne un sprite (voir new_sprite), dessine dans ce sprite au lieu de l'écran.
from st7789py import RED draw_pixel(100, 50, RED)
draw_line(x0, y0, x1, y1, color=WHITE, sprite=None)Trace une ligne droite entre le point (x0, y0) et le point (x1, y1). color (optionnel) choisit la couleur (voir draw_pixel). Si on donne un sprite (voir new_sprite), dessine dans ce sprite au lieu de l'écran.
from st7789py import GREEN draw_line(0, 0, 230, 270, GREEN)
draw_rect(x, y, w, h, color=WHITE, fill=False, sprite=None)Trace un rectangle de largeur w et hauteur h, à partir du coin en haut à gauche (x, y). Contour seulement, sauf si fill=True (rectangle plein). color (optionnel) choisit la couleur (voir draw_pixel). Si on donne un sprite (voir new_sprite), dessine dans ce sprite au lieu de l'écran.
from st7789py import BLUE draw_rect(10, 10, 100, 50, BLUE, fill=True)
draw_rounded_rect(x, y, w, h, radius, color=WHITE, fill=False, sprite=None)Comme draw_rect, mais avec des coins arrondis. radius est le rayon des coins, en pixels. color (optionnel) choisit la couleur (voir draw_pixel). Si on donne un sprite (voir new_sprite), dessine dans ce sprite au lieu de l'écran.
from st7789py import CYAN draw_rounded_rect(10, 10, 100, 50, 12, CYAN, fill=True)
draw_circle(x, y, radius, color=WHITE, fill=False, sprite=None)Trace un cercle de rayon radius, centré sur le point (x, y). Contour seulement, sauf si fill=True (cercle plein). color (optionnel) choisit la couleur (voir draw_pixel). Si on donne un sprite (voir new_sprite), dessine dans ce sprite au lieu de l'écran.
from st7789py import YELLOW draw_circle(120, 140, 40, YELLOW, fill=True)
new_sprite(w, h)Crée un sprite vide (une mini-image en mémoire) de largeur w et hauteur h, pour dessiner dedans avant de l'afficher d'un coup avec draw_sprite — utile pour animer sans faire scintiller l'écran. À faire une seule fois, avant la boucle.
mon_sprite = new_sprite(80, 80)
clear_sprite(sprite, color=BLACK)Efface un sprite (le remplit d'une couleur unie) — l'équivalent de clear_display, mais pour un sprite.
clear_sprite(mon_sprite)
draw_sprite(sprite, x, y)Affiche un sprite sur l'écran, d'un seul coup, à la position (x, y) de son coin en haut à gauche.
draw_sprite(mon_sprite, 100, 120)
draw_text(text, x, y, font=MEDIUM, color=WHITE, background=TRANSPARENT, sprite=None)Affiche le texte donné à la position (x, y) (coin en haut à gauche), avec une police au choix : SMALL, MEDIUM (par défaut), BIG ou VERYBIG. color (optionnel) choisit la couleur (voir draw_pixel). Par défaut, le fond reste transparent : seules les lettres sont dessinées ; donne background=<couleur> pour effacer d'abord la zone du texte. Si on donne un sprite (voir new_sprite), dessine dans ce sprite au lieu de l'écran.
from st7789py import GREEN
draw_text("12:34", 10, 10, font=BIG, color=GREEN)
text_width(text, font=MEDIUM)Renvoie la largeur en pixels qu'occuperait ce texte avec cette police (font, optionnel, MEDIUM par défaut) — pratique pour centrer du texte avant de l'afficher avec draw_text.
text_width("Salut !", font=BIG)
text_height(font=MEDIUM)Renvoie la hauteur de ligne de cette police (font, optionnel, MEDIUM par défaut), en pixels — pratique pour empiler plusieurs lignes de texte les unes sous les autres.
text_height(font=BIG)