Timer partie 1
Pour apprendre notre Interface_PyGAME, nous allons créer notre premier "Timer":
Une horloge :-)
Si vous ne l'aviez pas déjà fait, créons l'arborescence des dossiers :
Pour Raspbian/Debian/Linux
~$ mkdir helloworld # Création du dossier racine pour notre premier programme helloworld
~$ mkdir helloworld/fonts # Création du sous-dossier pour les fonts
~$ mkdir helloworld/img # Création du sous-dossier pour les images
~$ mkdir helloworld/src # Création du sous-dossier pour les fichiers .svg sources
~$ cd helloworld/fonts # on se place dans le dossier font pour télécharger une police
# on télécharge une font 100% gratuit que l'on nomme lcd.zip avec l'utilitaire wget
~$ wget -O lcd.zip https://dl.dafont.com/dl/?f=lcd_lcd_mono
~$ unzip lcd.zip # décompressons l'archive
Maintenant que la police LCDWinTT/LCD-BOLD.TTF est présente, replaçons nous à la racine du dossier.
~$ cd ..
Éditons avec l'éditeur "nano" le code ci-dessous et voyons comment il se comporte :
~$ nano timer.py # on crée/édite le fichier python timer.py
(abusez du CTL+C / CTRL+V ou plus explicitement copié/collé) Nous utiliserons volontairement des noms de variables explicites pour vous donner des repères. vous trouverez les sources sur le serveur svn : https://outils.electroniciens.cnrs.fr/electronique/Groupe_ARM/RasberryPi/PyGAME/
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import datetime
import pygame
from pygame.locals import *
# VARIABLES ############################################################
Titre = 'RDE - Timer PyGAME' # Titre de la fenetre
LargeurEcran = 800 #
HauteurEcran = 480 #
Couleurs = 32 # 32 bits 16.7 millions de couleurs
# Initialisation ----------------------------------------------------- #
pygame.init() # Appel de la fonction d'initialisation
# Limitation dela vitesse de rafraichissement de l'écran - 30 fps suffisent
pygame.time.Clock().tick(30)
fpsClock = pygame.time.Clock()
# Taille de fenetre et Titre ----------------------------------------- #
# pour un mode fenetré, nous déclarons notre affichage "fenetre" avec les
# configurations de la largeur/hauteur et nombre de couleurs
fenetre = pygame.display.set_mode((LargeurEcran, HauteurEcran), 0, Couleurs)
# pour un mode plein écran, on utilisera les paramètres ci-dessous :
# fenetre = pygame.display.set_mode((LargeurEcran, HauteurEcran), pygame.FULLSCREEN)
# initialisation de la police utilisé :
# A chaque fois que nous voudrons utiliser la police LCD-BOLD avec la taille de 40, nous ferons appel à "TXT_GENERIC_FONT_40"
TXT_GENERIC_FONT_40 = pygame.font.Font('fonts/LCDWinTT/LCD-BOLD.TTF', 40)
# Nous pouvons en créer une autre d'une taille de 80 que nous nommerons "TXT_GENERIC_FONT_80"
taille = 80 # voyons avec cette variable, la déclaration de la taille de notre texte.
# La seule limite est votre imagination... enfin sans exagérer non plus !
TXT_GENERIC_FONT_80 = pygame.font.Font('fonts/LCDWinTT/LCD-BOLD.TTF', taille)
# Créons une fonction permettant de convertir les Secondes en HH:MM:SS
def FormatSecondsToHHMMSS(seconds):
""" retourne les secondes en format HH:MM:SS """
hours = seconds // (60*60)
seconds %= (60*60)
minutes = seconds // 60
seconds %= 60
return "%02i:%02i:%02i" % (hours, minutes, seconds)
# Nous avions vu dans l'exemple précedant comment afficher un texte. Pour éviter les taches répétitives, nous fabriquons une fonction :
def show_generic_text(fontUse, msg, couleur, pos):
""" affiche le texte avec la police et la couleur a la position.
format : show_generic_text(fontUse,msg,couleur,pos)
fonUse = declaration de la police (ex: TXT_GENERIC_FONT_40)
msg = message (ex: "Mon Texte")
color = couleur du texte (ex: [255,255,255])
pos = position (ex: (X,Y))
"""
TXT_GENERIC_OBJ = fontUse.render(msg, True, couleur)
TXT_GENERIC_RECT = TXT_GENERIC_OBJ.get_rect()
TXT_GENERIC_RECT.center = pos
fenetre.blit(TXT_GENERIC_OBJ, TXT_GENERIC_RECT)
# -------------------------------------------- #
# Nous en avons fini des déclarations et allons entrer dans une boucle infini pour surveiller les actions de l'utilisateur
# Initialisation d'une variable de boucle
continuer = 1
while continuer:
# on rempli le fond de l'écran "fenetre" avec une couleur unie (R,V,B)
fenetre.fill([100,100,100])
date = datetime.datetime.now() # on récupère la date actuelle au format datetime
# on va convertir dans un format plus sympa notre texte
TXT_TIME = (str(date.hour).zfill(2) + ':' + str(date.minute).zfill(2) + ':' + str(date.second).zfill(2))
# zfill permet d'avoir "07" affiché au lieu de "7" il complete sur le nombre de caractères souhaité "zéro fill"
# notre texte viens se placer sur le fond d'écran uni, on fait appel a notre fonction d'affichage
show_generic_text(TXT_GENERIC_FONT_80, TXT_TIME, [255,255,255], (400,240))
# on detecte si un evenement (touche ESC) est passé
for event in pygame.event.get(): # Pour chaque évenement dans Pygame, nous analysons l'action
if (
event.type == pygame.QUIT or # si nous cliquons la croix de la fenetre ou
(event.type == pygame.KEYUP and # si une touche du clavier est relachée
event.key == K_ESCAPE) # et que c'est la touche ESC
):
continuer = 0 # alors, on arrête la boucle while et on quitte
pygame.quit() # On quitte pygame
sys.exit() # On quitte proprement notre programme
# sinon on rafraichi l'affichage avec un framerate de 30 FPS
pygame.display.update()
fpsClock.tick(30)
on enregistre CTRL+X puis on valide le nom du fichier Y(es) ou O(ui)
ensuite on lance le code Pygame :
~$ python timer.py
La Touche ESC ( échap ) du clavier permet de sortir ou la croix en haut de la fenetre
Ce qui nous donne :
Revenons à notre Interface_PyGAME