3. Notes sur le code

Voici un résumé de ce que fait le code. La plupart des commentaires sont déjà présents dans les fichiers, n’hésitez pas à les consulter au besoin.

3.1. Main.py

En premier lieu, le programme essaie de détecter s’il y a des problèmes d’initialisation. D’abord, il détecte si Python peut bel et bien initialiser la fenêtre et, ensuite, si il peut initialiser l’objet PiCamera. S’il ne peut pas, il lèves deux types d’erreurs et propose des solutions exposées Modules d’exception. ` L’instance app de la classe PiCameraGUI.py est crée avec win comme root et camera comme objet PiCamera. Le programme exécute ensuite la ligne:

win.mainloop()

Essentiellement, il s’agit d’une boucle infinie dans laquelle la fenêtre réagit aux divers événements (cliques, touches, déplacements de la souris, etc.). Pour mieux comprendre la fonction mainloop() de Tkinter, consulter le sujet suivant sur Stack Overflow. Techniquement, le programme n’est pas supposé quitter la boucle mainloop, mais si c’est le cas, il se doit d’effacer l’instance camera pour éviter les problèmes de mémoire.

3.2. PiCameraGUI.py

Ce fichier contient la classe PiCameraGUI qui s’occupe de la création de l’interface ainsi que des fonctionnalités du programme.

class PiCameraGUI.PiCameraGUI(root, camera, title)[source]

Classe pour l’interface graphique de la PiCamera

Fonctionnalités

  • Aperçu en temps réel
  • Aperçu de la photo prise
  • Prise de photo, vidéo et de photos en séquence
  • Zoom et déplacement à l’intérieur de l’image en temps réel
  • Ajout de texte et du temps présent sur la photo
  • Différents formats de photo supportés
  • Rotation et revirement horizontal et vertical de l’image
Parameters:
  • root (Tk() ou Toplevel()) – Fenêtre principal issue de la librairie tkinter
  • camera (PiCamera()) – Objet caméra issu du module picamera
  • title (String) – Titre de la fenêtre

Voir le fichier main.py pour un exemple d’utilisation

capture()[source]

Prends une photo

captureSeq()[source]

Prends une séquence de photos

captureSpace(event)[source]

Prends une photo avec la barre espace

centrerAide()[source]

Place la fenêtre d’aide au centre de l’écran

changerRepertoirePhoto()[source]

Change le répertoire d’enregistrement d’un fichier photo

  • Ouvre une nouvelle fenêtre
  • self.photo_dir: str
changerRepertoireVideo()[source]

Change le répertoire d’enregistrement d’un fichier vidéo

  • Ouvre une nouvelle fenêtre
  • self.video_dir: str
createAide()[source]

Crée une fenêtre indiquant les informations relatives au logiciel

createBindings()[source]

Crée les liaisons entre les widgets et les événements

createFrames()[source]

Crée les sous-fenêtres

createImage()[source]

Crée la sous-fenêtre Image et initialise les widgets de celle-ci

createLabelFrames()[source]

Crée les sous-fenêtres des options

createMenu()[source]

Crée la barre de menu

createRes()[source]

Crée la sous-fenêtre Résolution et initialise les widgets de celle-ci

createSave()[source]

Crée la sous-fenêtre Sauvegarder et initialise les widgets de celle-ci

createText()[source]

Crée la sous-fenêtre Texte et initialise les widgets de celle-ci

createWidgets()[source]

Crée les boutons de l’interface des commandes et la barre de menu

get_cmdsize()[source]

Retourne la taille des sections Séquence et État

hflip()[source]

Effectue le revirement horizontal de l’image

posPreview()[source]

Trouve la position de l’aperçu en temps réel dans l’interface

quit()[source]

Quitte le programme

recVideo()[source]

Prends un enregistrement vidéo Appelé chaque fois que le bouton vidéo est appuyé

reset_all()[source]

Réinitialise tous les paramètres

reset_size()[source]

Effectue la réinitialisation de la taille de l’aperçu

rotate()[source]

Effectue la rotation de l’image

set_expmode()[source]

Fixe le mode d'exposition de l’image

set_iso(event)[source]

Fixe l’ISO de l’image

set_overlayText()[source]

Fixe le texte à afficher sur l’image

set_previewPos(event)[source]

Ajuste la position de l’aperçu à la fenêtre

set_previewScale(event)[source]

Fixe l’échelle de l’aperçu

set_res()[source]

Vérifie et fixe la résolution personnalisée

set_resdef()[source]

Fixe la résolution parmi les modes par défaut

set_sequence()[source]

Fixe le nombre de photos à prendre en séquence

set_shutter(event)[source]

Fixe le shutter speed de l’image

update_capture()[source]

Actualise l’image de la dernière capture

update_etatVid()[source]

Actualise l’état de l’enregistrement vidéo

update_nomFichier()[source]

Actualise le nom du fichier

update_resactuelle()[source]

Actualise l’affichage de la résolution et du champ de vision actuel

update_temps(file=True)[source]

Actualise l’affichage du temps

verify_resH()[source]

Vérifie si la résolution en hauteur entrée par l’utilisateur est d’un format adéquat int

verify_resW()[source]

Vérifie si la résolution en largeur entrée par l’utilisateur est d’un format adéquat int

verify_text()[source]

Vérifie et formatte les caractères invalides du texte personnalisé

  • La fonction PiCamera.annotate_text() ne prend que les 128 premiers caractères du code ASCII
  • Remplace les caractères invalides par %
vflip()[source]

Effectue le revirement vertical de l’image

3.3. Disposition de l’interface

Si vous devez ajouter, modifier ou supprimer des fonctionnalités, vous devrez connaitre la disposition des objets dans la fenêtre. Voici l’architecture du logiciel. Les Frames agissent comme des fenêtres qui contiennent les boutons et autres widgets. Les canvas servent à contenir les images. Elles servent donc à l’organisation et à la disposition. Les buttons, scales, entry, listbox, spinbox servent à utiliser ou changer une fonctionnalité.

_images/layout.png
  • 1: self.seqButton
  • 2: self.photoButton
  • 3: self.videoButton
  • 4: self.hflipButton
  • 5: self.rotateButton
  • 6: self.vflipButton
  • 7: self.etatCanvas