Timer partie 1

De Wiki_du_Réseau_des_Electroniciens_du_CNRS
Sauter à la navigation Sauter à la recherche
Accueil - Les Groupes ARM - Raspberry Pi - Raspberry Pi2

Distribution_Raspian_personnalisée_Du_réseau - Raspberry un datalogger de A..à..Z - Interface PyGAME

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 :

Fenetre affichée

Revenons à notre Interface_PyGAME