Affichage dynamique en Python

Le projet

J’ai travaillé sur un projet d’affichage dynamique, un diaporama sur un écran TV. Recherchant une solution peu onéreuse s’appuyant sur des logiciels libres, j’ai trouvé un script Shell pouvant être exécuté sur un Raspberry Pi sur le site suivant :

http://wiki.dane.ac-versailles.fr/

Un partage sur un réseau local héberge un diaporama réalisé avec LibreOffice Impress (.odp). Lorsque ce fichier est modifié, il est automatiquement téléchargé par le Raspberry Pi qui se trouve sur le même réseau et est affiché. Cela fonctionne très bien et actuellement dans un collège, j’ai deux Raspberry Pi pour deux écrans TV qui affichent le même diaporama. Le script Shell est lancé automatiquement aux démarrages des Raspberry Pi.

Un petit schéma de mon installation

Programme en Python

J’ai décidé de réaliser une version en Python de ce script Shell. J’ai créé deux petits programmes, le premier avec une interface graphique permettant de configurer plus facilement mon logiciel, le second permettant l’affichage du diaporama. Les difficultés étaient d’accéder au partage réseau depuis Python et d’exécuter des commandes Shell Bash.


Programme de configuration

Ce programme permet d’enregistrer dans un fichier les paramètres de configuration de mon logiciel depuis une interface graphique. Si vous êtes en groupe de travail lors des tests, enregistrez son nom en guise de nom de domaine, cela doit fonctionner.

Le programme Diapo-ini.py

!/usr/bin/env python3.7
 -- coding: utf-8 --
 from tkinter import *
 import pickle
 import os.path
 def Lancer_Diaporama():
     exec(open("./Diapo-py.py").read())
 def Enregistrer():
     serveursmb = Serveur_Entry.get()
     partagesmb = Partage_Entry.get()
     utilisateur = Utilisateur_Entry.get()
     mot_de_passe = Mot_de_passe_Entry.get()
     domaine = Domaine_Entry.get()
     fichier_diaporama = Fichier_du_diaporama_Entry.get()
 #Enregistrer mes variables sous forme d'une liste dans un fichier variables = [serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama] fichierSauvegarde = open("diaporamaini","wb") pickle.dump(variables, fichierSauvegarde) fichierSauvegarde.close()
 Lecture du fichier ini
 fichierini = "diaporamaini"
 Ouverture du fichier s'il existe et récupération de la liste
 if os.path.isfile(fichierini):
     fichierSauvegarde = open(fichierini,"rb")
     variables = pickle.load(fichierSauvegarde)
     fichierSauvegarde.close()
 # Affichage d'informations print("Initialisation des variables") # Récupération des données dans les variables serveursmb = variables[0] partagesmb = variables[1] utilisateur = variables[2] mot_de_passe = variables[3] domaine = variables[4] fichier_diaporama = variables[5]
 else:
     # Le fichier n'existe pas
     print("Fichier " + fichierini + " non trouvé")
     serveursmb = partagesmb = utilisateur = mot_de_passe = domaine = fichier_diaporama = "vide"
 Fenetre = Tk() #création de la fenêtre, avec un nom de votre choix Fenetre
 Fenetre.title('Paramètres Diaporama') #Titre de la fenêtre
 Fenetre.geometry("420x170") # On définit la taille de la fenêtre
 Fenetre.resizable(width=False,height=False) #Empêcher de redimentionner la fenêtre
 Création d'un interface graphique avec grid
 Serveur_Label= Label(Fenetre, text = 'Votre serveur - Nom ou IP :') #Un label pour afficher du texte
 Serveur_Label.grid(row=0)
 Serveur_Entry= Entry(Fenetre) #On définit l'objet Entry (zone de saisie) qui porte le nom Serveur_Entry
 Serveur_Entry.insert(0, serveursmb)
 Serveur_Entry.grid(row=0,column=1,ipadx=30) # ipadx=30 pour créer 10 pixels de plus horizontalement
 Partage_Label= Label(Fenetre, text = 'Votre partage réseau :')
 Partage_Label.grid(row=1,column=0)
 Partage_Entry= Entry(Fenetre)
 Partage_Entry.insert(0, partagesmb)
 Partage_Entry.grid(row=1,column=1,ipadx=30)
 Utilisateur_Label= Label(Fenetre, text = 'Votre utilisateur :')
 Utilisateur_Label.grid(row=2,column=0)
 Utilisateur_Entry= Entry(Fenetre)
 Utilisateur_Entry.insert(0, utilisateur)
 Utilisateur_Entry.grid(row=2,column=1,ipadx=30)
 Mot_de_passe_Label= Label(Fenetre, text = 'Votre mot de passe :')
 Mot_de_passe_Label.grid(row=3,column=0)
 Mot_de_passe_Entry= Entry(Fenetre) # Saisie du mot de passe
 Mot_de_passe_Entry.insert(0, mot_de_passe)
 Mot_de_passe_Entry.grid(row=3,column=1,ipadx=30)
 Domaine_Label= Label(Fenetre, text = 'Votre nom de domaine:')
 Domaine_Label.grid(row=4,column=0)
 Domaine_Entry= Entry(Fenetre)
 Domaine_Entry.insert(0, domaine)
 Domaine_Entry.grid(row=4,column=1,ipadx=30)
 Fichier_du_diaporama_Label= Label(Fenetre, text = 'Votre fichier de diaporama :')
 Fichier_du_diaporama_Label.grid(row=5,column=0)
 Fichier_du_diaporama_Entry= Entry(Fenetre)
 Fichier_du_diaporama_Entry.insert(0, fichier_diaporama)
 Fichier_du_diaporama_Entry.grid(row=5,column=1,ipadx=30)
 Mon_bouton_Lancer_Diaporama = Button(Fenetre, text = 'Lancer le Diaporama',command = Lancer_Diaporama)
 Mon_bouton_Lancer_Diaporama.grid(row=6,column=0,ipadx=0)
 Mon_bouton_Enregistrer = Button(Fenetre, text = ' Enregistrer le fichier', command = Enregistrer)
 Mon_bouton_Enregistrer.grid(row=6,column=1,ipadx=0)
 Fenetre.mainloop() # lance la boucle principale
L’interface graphique pour la saisie des paramètres du diaporama

Programme d’affichage du diaporama

Ce programme lit le fichier de configuration pour attribuer aux variables les valeurs qui ont été enregistrées puis il affiche le diaporama. Lorsque le diaporama est modifié sur le partage réseau, il est automatiquement téléchargé et affiché.

Le programme Diapo-py.py

!/usr/bin/env python3.7
 -- coding: utf-8 --
 import pickle
 import os.path
 import smbclient
 import subprocess
 import time
 Lecture du fichier ini
 fichierini = "diaporamaini"
 Ouverture du fichier s'il existe et récupération de la liste
 if os.path.isfile(fichierini):
     fichierSauvegarde = open(fichierini,"rb")
     variables = pickle.load(fichierSauvegarde)
     fichierSauvegarde.close()
 # Affichage d'informations print("Initialisation des variables") # Récupération des données dans les variables serveursmb = variables[0] partagesmb = variables[1] utilisateur = variables[2] mot_de_passe = variables[3] domaine = variables[4] fichier_diaporama = variables[5]
 else:
     # Le fichier n'existe pas
     print("Fichier " + fichierini + " non trouvé")
 initialisation des variables
 Version_Old = "vide"
 local_path = "./" + fichier_diaporama
 smb = smbclient.SambaClient(server=serveursmb, share=partagesmb, username=utilisateur, password=mot_de_passe, domain=domaine)
 Boucle = True
 while Boucle == True:
     try:
         # Afficher des informations sur le fichier
         Version_New = smb.info(fichier_diaporama)
     except:
         Version_New = Version_Old
     if Version_New != Version_Old:
         try:
             ### On arrête l'application LibreOffice ###
             subprocess.Popen(['/bin/sh', '-c', "pkill office"])
             time.sleep(2)
             ### On supprime l'ancien fichier diaporama s'il existe ###
             if os.path.isfile(local_path):
                 os.remove(local_path)
             ### Téléchargement du nouveau fichier ###
             smb.download(fichier_diaporama, local_path)
             time.sleep(2)
             ### Affichage du diaporama ###
             Affichage = subprocess.Popen(["libreoffice", "--norestore", "--show", fichier_diaporama], shell=False)
             Version_Old = Version_New
         except:
             print("Erreur lors du téléchargement et de l'affichage du diaporama")
     else:
         time.sleep(20) # Pas de mise à jour - On attend 20 secondes avant de revérifier

Prérequis pour l’installation du programme en Python sur le Raspberry Pi

Version de Python installée

python3 --version
 Python 3.7.3

Pour l’interface graphique avec Tkinter

Le paquet python3-tk doit être présent sinon on l’installe :

sudo apt-get install python3-tk

Accès au partage Samba

Vous devez disposer d’un partage réseau Windows ou sous Linux (Samba) avec les login/mot de passe pour y avoir accès.

Pour pouvoir accéder au partage réseau depuis le Raspberry Pi vous devez installer le paquet smbclient (client samba) sous Linux :

sudo apt-get install smbclient

En cas de problème, il peut être utile de vérifier la connexion au partage depuis l’explorateur de fichiers du Raspberry Pi :

smb://ip_du_serveur/nom_du_partage

Installer la bibliothèque pysmbclient (client samba) pour l’accès au partage réseau depuis Python :

pip3 install pysmbclient

Plus d’informations :

https://pypi.org/project/PySmbClient/

Les droits sur les fichiers

Les deux programmes doivent être exécutables et je réduis les droits au seul utilisateur pi :

chmod 700 nom_du_fichier

Pour le fichier diaporamaini, droits en lecture et en écriture au seul utilisateur :

chmod 600 diaporamaini

Lancer et arrêter les programmes

Pour lancer les programmes depuis un terminal :

./nom_du_fichier

Pour arrêter la diffusion du diaporama depuis le Raspberry Pi :

[Alt] + [F4] Pour fermer LibreOffice Impress.

[Ctrl] + [C] Pour stopper l’exécution du programme dans le terminal.

Par la suite, on pourra automatiser le lancement du programme qui affiche le diaporama au démarrage du Raspberry Pi.


Et maintenant…

Je ne suis pas programmeur, j’ai une formation de technicien d’assistance informatique et une autre de technicien réseau. Vous avez peut-être des idées pour améliorer ce programme et ajouter de nouvelles fonctionnalités. Si vous êtes intéressé, n’hésitez pas. Vous pouvez laisser des commentaires ou me contacter pour faire évoluer le code.

Programmes mis à jour le 21/12/2020

Dominique Renaudeau

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s