{"id":320,"date":"2024-01-01T11:11:50","date_gmt":"2024-01-01T10:11:50","guid":{"rendered":"https:\/\/artheodoc.fr\/?page_id=320"},"modified":"2026-01-23T14:17:37","modified_gmt":"2026-01-23T13:17:37","slug":"affichage-dynamique-en-python-sous-debian","status":"publish","type":"page","link":"https:\/\/artheodoc.fr\/index.php\/affichage-dynamique-en-python-sous-debian\/","title":{"rendered":"Affichage dynamique en Python sous Debian"},"content":{"rendered":"\n<p class=\"has-medium-font-size\"><strong>Avec Debian 11 puis Debian 12<\/strong><\/p>\n\n\n\n<p><strong>Principe de fonctionnement<\/strong><\/p>\n\n\n\n<p class=\"has-background\" style=\"background:linear-gradient(135deg,rgb(227,242,202) 0%,rgb(146,231,157) 100%)\">Un partage r\u00e9seau Samba h\u00e9berge un diaporama LibreOffice Impress, quand ce dernier est modifi\u00e9 il est automatiquement t\u00e9l\u00e9charg\u00e9 par un programme en Python et affich\u00e9 sur la t\u00e9l\u00e9vision qui est connect\u00e9e en HDMI \u00e0 un PC sous la distribution GNU Linux Debian 11 ou Debian 12. Les derni\u00e8res versions de mes programmes int\u00e8grent \u00e9galement la possibilit\u00e9 de t\u00e9l\u00e9charger et de lire en boucle une vid\u00e9o. Les param\u00e9trages son enregistr\u00e9s dans un fichier ini \u00ab&nbsp;diaporamaini&nbsp;\u00bb. Les fichiers en Python doivent se trouver dans le m\u00eame dossier.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"748\" height=\"418\" src=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2024\/01\/Affichage_dynamique_schema.png\" alt=\"\" class=\"wp-image-324\" srcset=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2024\/01\/Affichage_dynamique_schema.png 748w, https:\/\/artheodoc.fr\/wp-content\/uploads\/2024\/01\/Affichage_dynamique_schema-300x168.png 300w\" sizes=\"auto, (max-width: 748px) 100vw, 748px\" \/><\/figure>\n\n\n\n<p><strong>Le partage R\u00e9seau<\/strong><\/p>\n\n\n\n<p>Le partage Samba sur le r\u00e9seau \u00e0 \u00e9t\u00e9 cr\u00e9\u00e9. Les param\u00e8tres sont le nom du partage, l\u2019utilisateur y ayant acc\u00e8s avec son mot de passe.<\/p>\n\n\n\n<p><strong>Adressage IP du PC sous Debian<\/strong><\/p>\n\n\n\n<p>Le PC sous Debian qui h\u00e9berge les scripts en Python doit se trouver sur le m\u00eame r\u00e9seau IP que le partage h\u00e9bergeant le diaporama.<\/p>\n\n\n\n<div class=\"wp-block-group has-pale-ocean-gradient-background has-background is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>Environnement pour la programmation et les tests<\/strong><\/p>\n\n\n\n<p>Pour travailler sur les programmes j\u2019utilise un PC ou une machine virtuelle sous Windows qui h\u00e9berge le partage, une machine virtuelle Debian 11 ou Debian 12 sous VirtualBox permet de programmer et de tester les r\u00e9sultats. La machine virtuelle est sur le m\u00eame r\u00e9seau IP que la machine h\u00f4te gr\u00e2ce \u00e0 un pont sur la carte r\u00e9seau. J\u2019utilise l\u2019\u00e9diteur Sublime Text. Un dossier est accessible par les deux machines pour pouvoir r\u00e9cup\u00e9rer les fichiers cr\u00e9\u00e9s, l\u2019explorateur de fichiers de Debian doit \u00eatre lanc\u00e9 en administrateur root <strong>su<\/strong> avec la commande <strong>nautilus<\/strong> ou <strong>nemo<\/strong>.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-background is-layout-constrained wp-block-group-is-layout-constrained\" style=\"background-color:#deeaf3\">\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>\u00c9diteur de code Sublime Text<\/strong><\/p>\n\n\n\n<p>Installation de Sublime Text sous Debian&nbsp;:<\/p>\n\n\n\n<p><a href=\"https:\/\/wiki.debian.org\/SublimeText\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/wiki.debian.org\/SublimeText<\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-pale-ocean-gradient-background has-background is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>Connexion \u00e0 la machine sous Debian<\/strong><\/p>\n\n\n\n<p>J\u2019utilise un petit clavier Bluetooth quand je n&rsquo;ai pas la possibilit\u00e9 de connecter un clavier filaire.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"336\" height=\"208\" src=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2025\/05\/Mini_clavier_Rii_i8.png\" alt=\"\" class=\"wp-image-2230\" srcset=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2025\/05\/Mini_clavier_Rii_i8.png 336w, https:\/\/artheodoc.fr\/wp-content\/uploads\/2025\/05\/Mini_clavier_Rii_i8-300x186.png 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Mini Clavier Rii i8 disponible chez Kubii<\/em><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-large-font-size\">Programme permettant de param\u00e9trer l\u2019application et de t\u00e9l\u00e9charger et lire en boucle les vid\u00e9os<\/p>\n\n\n\n<p>Pour lancer le programme&nbsp;depuis le dossier o\u00f9 il se trouve :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>.\/Gestion-Affichage-Dynamique.py<\/strong><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"471\" src=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2024\/01\/Gestion-Affichage-Dynamique.png\" alt=\"\" class=\"wp-image-330\" srcset=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2024\/01\/Gestion-Affichage-Dynamique.png 502w, https:\/\/artheodoc.fr\/wp-content\/uploads\/2024\/01\/Gestion-Affichage-Dynamique-300x281.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>Le programme avec les param\u00e8tres de mon environnement de tests.<\/em><\/p>\n\n\n\n<p>Les param\u00e8tres, nom du serveur ou IP, partage r\u00e9seau, utilisateur, mot de passe, nom de domaine, fichier de diaporama doivent \u00eatre saisis puis enregistr\u00e9s dans le fichier ini.<\/p>\n\n\n\n<ul style=\"background-color:#dceef9\" class=\"wp-block-list has-background\">\n<li><strong>[Lancer le Diaporama]<\/strong> Permet de lancer le diaporama en utilisant le param\u00e8tres du fichier ini.<\/li>\n\n\n\n<li><strong>[Enregistrer le fichier ini]<\/strong> Permet d\u2019enregistrer les param\u00e8tres saisis dans les champs dans le fichier .ini \u00ab&nbsp;diaporamaini&nbsp;\u00bb.<\/li>\n\n\n\n<li><strong>[Lister les fichiers du partage depuis ini]<\/strong> Permet de lister les fichiers contenus dans le partage r\u00e9seau \u00e0 partir des param\u00e8tres du fichier ini \u00ab&nbsp;<strong>diaporamaini<\/strong>&nbsp;\u00bb.<\/li>\n\n\n\n<li><strong>[Transf\u00e9rer et lancer la vid\u00e9o]<\/strong> Permet de t\u00e9l\u00e9charger depuis le partage et de lire en boucle un fichier vid\u00e9o s\u00e9lectionn\u00e9 dans la liste. Le nom du fichier est modifi\u00e9 automatiquement si n\u00e9cessaire, les espaces remplac\u00e9s par des _ et les accents supprim\u00e9s.<\/li>\n<\/ul>\n\n\n\n<p>Pour arr\u00eater l\u2019ex\u00e9cution du programme en Python depuis le terminal <strong>[Ctrl]<\/strong> + <strong>[C]<\/strong>.<\/p>\n\n\n\n<p>Depuis le menu <strong>Fichier<\/strong> ==&gt; <strong>Quitter<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-large-font-size\">Programme qui g\u00e8re le diaporama<\/p>\n\n\n\n<p>Le programme qui g\u00e8re le diaporama n\u2019a pas d\u2019interface graphique, il lit les donn\u00e9es du fichier ini puis t\u00e9l\u00e9charge le diaporama et lance LibreOffice Impress pour l\u2019afficher. Quand le diaporama est modifi\u00e9 dans le partage du r\u00e9seau LibreOffice est arr\u00eat\u00e9, le nouveau fichier est t\u00e9l\u00e9charg\u00e9 automatiquement, Impress est ensuite relanc\u00e9 avec le fichier mis \u00e0 jour.<\/p>\n\n\n\n<p>Le mieux est de lancer le programme en lignes de commande depuis un terminal avec votre utilisateur.<\/p>\n\n\n\n<p>Pour lancer le programme depuis le dossier o\u00f9 il se trouve :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>.\/Diapo-py.py<\/strong><\/pre>\n\n\n\n<p>Pour arr\u00eater l\u2019affichage du diaporama <strong>[Alt]<\/strong> +<strong> [F4]<\/strong>.<\/p>\n\n\n\n<p>Pour arr\u00eater l\u2019ex\u00e9cution du programme en Python depuis le terminal <strong>[Ctrl]<\/strong> + <strong>[C]<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p class=\"has-large-font-size\">Pr\u00e9requis pour l\u2019installation sur la machine sous Debian 11 et Debian 12<\/p>\n\n\n\n<p><strong>Version de Python install\u00e9e<\/strong><\/p>\n\n\n\n<p>Pour savoir quelle est la version de Python install\u00e9e&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>python3 --version<\/strong><\/pre>\n\n\n\n<div class=\"wp-block-group has-pale-ocean-gradient-background has-background is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>Adapter l\u2019ent\u00eate des fichiers Python \u00e0 votre version. Par exemple <code><strong>#!\/usr\/bin\/env python3.9<\/strong> peut devenir <strong>#!\/usr\/bin\/env python3.11<\/strong>. <\/code>On peut modifier les fichiers avec <a href=\"https:\/\/artheodoc.fr\/index.php\/lediteur-de-texte-nano\/\" data-type=\"page\" data-id=\"972\" target=\"_blank\" rel=\"noreferrer noopener\">Nano<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Sous Debian, pour \u00e9diter mon fichier, je peux \u00e9galement utiliser Sublime Text :<\/p>\n\n\n\n<p><a href=\"https:\/\/www.sublimetext.com\/docs\/linux_repositories.html\">https:\/\/www.sublimetext.com\/docs\/linux_repositories.html<\/a><\/p>\n\n\n\n<p>Voir l\u2019installation pour apt (<em>avec debian en administrateur root pas de commande sudo<\/em>).<\/p>\n\n\n\n<p>Configuration de Sublime Text pour Python.<\/p>\n\n\n\n<p>Depuis le menu<strong> View<\/strong> ==&gt; <strong>Syntax<\/strong>, s\u00e9lectionnez <strong>Python<\/strong>.<\/p>\n<\/div>\n\n\n\n<p><strong>Pour l\u2019interface graphique avec Tkinter<\/strong><\/p>\n\n\n\n<p>Le paquet python3-tk doit \u00eatre pr\u00e9sent sinon on l\u2019installe.<\/p>\n\n\n\n<p>En administrateur root, <strong>su<\/strong> + <em>mot de passe<\/em> :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>apt-get install python3-tk<\/strong><\/pre>\n\n\n\n<p><strong>Acc\u00e8s au partage Samba<\/strong><\/p>\n\n\n\n<p>Vous devez disposer d\u2019un partage r\u00e9seau Windows ou sous Linux (Samba) avec les login\/mot de passe pour y avoir acc\u00e8s. Pour pouvoir acc\u00e9der au partage r\u00e9seau vous devez installer le paquet <strong>smbclient<\/strong> (client samba) sous Linux en administrateur :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>apt-get install smbclient<\/strong><\/pre>\n\n\n\n<p>En cas de probl\u00e8me, il peut \u00eatre utile de v\u00e9rifier la connexion au partage depuis le terminal :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>smbclient -U <em>utilisateur<\/em> \/\/<em>ip_du_serveur<\/em>\/<em>nom_du_partage<\/em><\/strong><\/pre>\n\n\n\n<p><strong>Pour installer une biblioth\u00e8que externe pour Python 3<\/strong><\/p>\n\n\n\n<p>Installation des paquets n\u00e9cessaire \u00e0 la mise en place des biblioth\u00e8ques pour Python 3. Pip est un gestionnaire de paquets :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>apt-get install python3-pip<\/strong><\/pre>\n\n\n\n<p>Installer la biblioth\u00e8que pysmbclient (client samba) pour l\u2019acc\u00e8s au partage r\u00e9seau depuis Python :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>pip3 install pysmbclient<\/strong><\/pre>\n\n\n\n<div class=\"wp-block-group has-pale-ocean-gradient-background has-background is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-medium-font-size\">Debian 12 &#8211; PySmbClient<\/p>\n\n\n\n<p>Si l\u2019installation avec pip3 ne fonctionne plus, on peut <strong>t\u00e9l\u00e9charger les fichiers<\/strong> et les copier directement dans le dossier<strong> \/usr\/local\/lib\/python3.11\/dist-packages\/<\/strong> (<em>exemple pour Python 3.11 sous Debian 12<\/em>).<\/p>\n\n\n\n<p>Pour t\u00e9l\u00e9charger les fichiers :<\/p>\n\n\n\n<p><a href=\"https:\/\/pypi.org\/project\/PySmbClient\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/PySmbClient\/<\/a><\/p>\n\n\n\n<p><strong>T\u00e9l\u00e9chargement des fichiers<\/strong> ==&gt; <code><strong>PySmbClient-<em>x<\/em>.<em>x<\/em>.<em>x<\/em>.tar.gz<\/strong><\/code><\/p>\n<\/div>\n\n\n\n<p>Installer la biblioth\u00e8que unidecode pour supprimer les caract\u00e8res accentu\u00e9s des noms de fichiers vid\u00e9o :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>pip3 install unidecode<\/strong><\/pre>\n\n\n\n<div class=\"wp-block-group has-pale-ocean-gradient-background has-background is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-medium-font-size\">Debian 12 &#8211; unidecode<\/p>\n\n\n\n<p>Si l&rsquo;installation avec pip3 ne fonctionne plus (<em>exemple pour Python 3.11 sous Debian 12<\/em>) :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>apt-get install python3-unidecode<\/strong><\/pre>\n<\/div>\n\n\n\n<p>Pour la lecture des vid\u00e9os sous Debian mplayer doit \u00eatre install\u00e9&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>apt-get install mplayer<\/strong><\/pre>\n\n\n\n<p>La commande utilis\u00e9e pour lire un fichier vid\u00e9o en boucle et en plein \u00e9cran est&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>mplayer <em>Fichier_video<\/em> -loop 0 -fs<\/strong><\/pre>\n\n\n\n<p><em>Si on adapte le programme \u00e0 un Raspberry Pi sous Pi OS on utilisera OMXPlayer.<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>omxplayer --loop <em>fichier_video<\/em><\/strong><\/pre>\n\n\n\n<p><strong>Les droits sur les fichiers<\/strong><\/p>\n\n\n\n<p>Les deux programmes doivent \u00eatre ex\u00e9cutables et je r\u00e9duis les droits \u00e0 l\u2019utilisateur :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>chmod 700 <em>nom_du_fichier<\/em><\/strong><\/pre>\n\n\n\n<p>Pour le fichier <strong>diaporamaini<\/strong>, droits en lecture et en \u00e9criture au seul utilisateur :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>chmod 600 diaporamaini<\/strong><\/pre>\n\n\n\n<p>Pour une installation sous Debian, j\u2019ai \u00e9galement install\u00e9 le paquet libreoffice-java-common :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>apt-get install libreoffice-java-common<\/strong><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p><strong>Pour ex\u00e9cuter un programme<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>.\/<em>nom_du_fichier.py<\/em><\/strong><\/pre>\n\n\n\n<p>Pour supprimer un fichier vid\u00e9o t\u00e9l\u00e9charg\u00e9 pr\u00e9c\u00e9demment&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>rm <em>nom_du_fichier<\/em><\/strong><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p class=\"has-large-font-size\">Installation de Java JRE<\/p>\n\n\n\n<p>J\u2019ai \u00e9galement install\u00e9 Java JRE, attention le nom du fichier t\u00e9l\u00e9charg\u00e9 peut \u00eatre diff\u00e9rent !<\/p>\n\n\n\n<p>Pour t\u00e9l\u00e9charger Java JRE pour Linux :<\/p>\n\n\n\n<p><a href=\"https:\/\/www.java.com\/fr\/download\/linux_manual.jsp\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.java.com\/fr\/download\/linux_manual.jsp<\/a><\/p>\n\n\n\n<p>J\u2019ai s\u00e9lectionn\u00e9 <strong>Linux x64<\/strong>.<\/p>\n\n\n\n<p>En administrateur root dans un terminal :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>cd \/usr<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>mkdir java<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>cd java<\/strong><\/pre>\n\n\n\n<p>Lancez le navigateur <strong>nautilus<\/strong> ou <strong>nemo<\/strong> depuis le terminal en administrateur root su pour copier l\u2019archive TAR t\u00e9l\u00e9charg\u00e9e dans<strong> \/usr\/java<\/strong><\/p>\n\n\n\n<p>D\u00e9compressez l\u2019archive TAR (jre-8u451-linux-x64.tar.gz dans mon cas) pour installer Java :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>tar zxvf jre-8u451-linux-x64.tar.gz<\/strong><\/pre>\n\n\n\n<p>Plus d&rsquo;informations, installation de Java JRE sous Debian 11 (sur mon autre  site WEB)&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-artheodoc wp-block-embed-artheodoc\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"3Y8H1Nauny\"><a href=\"https:\/\/artheodoc.wordpress.com\/2022\/02\/24\/installation-de-java-jre-sous-debian-11\/\">Installation de Java JRE sous Debian&nbsp;11<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&laquo;&nbsp;Installation de Java JRE sous Debian&nbsp;11&nbsp;&raquo; &#8212; Artheodoc\" src=\"https:\/\/artheodoc.wordpress.com\/2022\/02\/24\/installation-de-java-jre-sous-debian-11\/embed\/#?secret=hz5ttwmukP#?secret=3Y8H1Nauny\" data-secret=\"3Y8H1Nauny\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p class=\"has-large-font-size\">Si cela ne fonctionne pas sous Debian<\/p>\n\n\n\n<p><strong>Avec Samba sous Debian 11<\/strong><\/p>\n\n\n\n<p>Pour tester la connexion au partage Samba depuis le terminal sous Linux :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>smbclient -U <em>utilisateur<\/em> \/\/<em>ip_du_serveur<\/em>\/<em>nom_du_partage<\/em><\/strong><\/pre>\n\n\n\n<p>Si vous avez le message suivant :<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-f52603a5d8c1314f14f22ca78197d00e\">protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED<\/p>\n\n\n\n<p><strong>Solution<\/strong><\/p>\n\n\n\n<p>Depuis la version 4.11 Samba ne prend plus en charge le vieux protocole SMBv1, seuls SMB2 et SMB3 sont g\u00e9r\u00e9s. Certains partages ne sont plus accessibles. Pour voir la version du client Samba :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>smbclient --version<\/strong><\/pre>\n\n\n\n<p>Version 4.13.13-Debian Dans mon cas.<\/p>\n\n\n\n<p>Dans le fichier <strong>\/etc\/samba\/smb.conf<\/strong> sous la section <strong>[global]<\/strong> j\u2019ai ajout\u00e9 :<\/p>\n\n\n\n<p><strong>client min protocol = NT1<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p class=\"has-large-font-size\">Pour d\u00e9sactiver la bo\u00eete de dialogue \u00ab Astuce du jour \u00bb dans LibreOffice<\/p>\n\n\n\n<p><strong>Outils<\/strong> &gt; <strong>Options<\/strong> &gt; <strong>LibreOffice<\/strong> &gt; <strong>G\u00e9n\u00e9ral<\/strong> &gt; d\u00e9cocher Afficher la bo\u00eete de dialogue \u00ab <strong>Astuces du jour<\/strong> \u00bb au d\u00e9marrage.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p class=\"has-text-align-center has-large-font-size\">Codes sources des programmes en Python<\/p>\n\n\n\n<p><strong>Programme Diapo-py.py<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3.11\n# -- coding: utf-8 --\nimport pickle\nimport os\nimport smbclient\nimport subprocess\nimport time\n# ****************************************************************************************************\n# 17\/05\/2025\n# ****************************************************************************************************\n# Lecture du fichier ini\nfichierini = \"diaporamaini\"\npid = ''\n# Ouverture du fichier s'il existe et r\u00e9cup\u00e9ration de la liste\nif os.path.isfile(fichierini):\n    fichierSauvegarde = open(fichierini,\"rb\")\n    variables = pickle.load(fichierSauvegarde)\n    fichierSauvegarde.close()\n# Affichage d'informations\n    print(\"***** Programme de Dominique Renaudeau en langage Python *****\")\n    print(\"Initialisation des variables\")\n# R\u00e9cup\u00e9ration des donn\u00e9es dans les variables\n    serveursmb = variables&#91;0]\n    partagesmb = variables&#91;1]\n    utilisateur = variables&#91;2]\n    mot_de_passe = variables&#91;3]\n    domaine = variables&#91;4]\n    fichier_diaporama = variables&#91;5]\nelse:\n    # Le fichier n'existe pas\n    print(\"Fichier \" + fichierini + \" non trouv\u00e9\")\n# initialisation des variables\nVersion_Old = \"vide\"\nlocal_path = \".\/\" + fichier_diaporama\nsmb = smbclient.SambaClient(server=serveursmb, share=partagesmb, username=utilisateur, password=mot_de_passe, domain=domaine)\nBoucle = True\nwhile Boucle == True:\n    try:\n        # Afficher des informations sur le fichier\n        Version_New = smb.info(fichier_diaporama)\n    except:\n        Version_New = Version_Old\n    if Version_New != Version_Old:\n        try:\n            ### On arr\u00eate l'application LibreOffice ###\n            pid = os.popen(\"pidof soffice.bin\").read()\n            if pid != '':\n                print(\"Arr\u00eat de l'application LibreOffice\")\n            try:\n                subprocess.Popen(&#91;'\/bin\/sh', '-c', \"pkill office\"])\n            except:\n                print(\"LibreOffice n'est pas lanc\u00e9\")\n            time.sleep(2)\n            print(\"LibreOffice n'est pas lanc\u00e9\")\n            ### On supprime l'ancien fichier diaporama s'il existe ###\n            if os.path.isfile(local_path):\n                os.remove(local_path)\n            ### T\u00e9l\u00e9chargement du nouveau fichier ###\n            print(\"T\u00e9l\u00e9chargement du nouveau fichier et lancement de LibreOffice\")\n            smb.download(fichier_diaporama, local_path)\n            time.sleep(2)\n            ### Affichage du diaporama ###\n            Affichage = subprocess.Popen(&#91;\"libreoffice\", \"--norestore\", \"--show\", fichier_diaporama], shell=False)\n            Version_Old = Version_New\n            time.sleep(60)\n            pid = os.popen(\"pidof soffice.bin\").read()\n            print(\"PID LibreOffice = \" + pid)\n        except:\n            print(\"Erreur lors du t\u00e9l\u00e9chargement et de l'affichage du diaporama\")\n    else:\n        time.sleep(20) # Pas de mise \u00e0 jour - On attend 20 secondes avant de rev\u00e9rifier\n    if pid == '':\n        print(\"LibreOffice n'est pas lanc\u00e9, v\u00e9rifiez les param\u00e8tres du fichier ini et l'acc\u00e8s au partage r\u00e9seau.\")\n        exit()\n<\/code><\/pre>\n\n\n\n<p><strong>Programme Gestion-Affichage-Dynamique.py<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3.11\n# -- coding: utf-8 --\nfrom tkinter import *\nfrom tkinter import messagebox\nimport pickle\nimport os.path\nimport smbclient\nimport subprocess\nimport unidecode # Doit \u00eatre import\u00e9e\n# ****************************************************************************************************\n# 17\/05\/2025\n# ****************************************************************************************************\n# Lancer le diaporama avec le second programme en Python\ndef Lancer_Diaporama():\n    try:\n        exec(open(\".\/Diapo-py.py\").read())\n    except:\n        print(\"Impossible de lancer le diaporama.\")\n# ****************************************************************************************************\n# Enregistrer la configuration dans le fichier diaporamaini\ndef Enregistrer():\n    global serveursmb\n    global partagesmb\n    global utilisateur\n    global mot_de_passe\n    global domaine\n    global fichier_diaporama\n    serveursmb = Serveur_Entry.get()\n    partagesmb = Partage_Entry.get()\n    utilisateur = Utilisateur_Entry.get()\n    mot_de_passe = Mot_de_passe_Entry.get()\n    domaine = Domaine_Entry.get()\n    fichier_diaporama = Fichier_du_diaporama_Entry.get()\n    # Enregistrer mes variables sous forme d'une liste dans un fichier\n    if serveursmb != \"vide\" and partagesmb != \"vide\" and utilisateur != \"vide\" and mot_de_passe != \"vide\" and domaine != \"vide\" and fichier_diaporama != \"vide\":\n        variables = &#91;serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama]\n        fichierSauvegarde = open(\"diaporamaini\",\"wb\")\n        pickle.dump(variables, fichierSauvegarde)\n        fichierSauvegarde.close()\n        Mon_bouton_Lister_Fichiers&#91;'state'] = NORMAL\n        Mon_bouton_Lancer_Diaporama&#91;'state'] = NORMAL\n        menufichier.entryconfigure(0,state=NORMAL)\n        menudiaporama.entryconfigure(0,state=NORMAL)\n# ****************************************************************************************************\n# Lister les fichiers pr\u00e9sents dans le partage r\u00e9seau en utilisant les param\u00e8tres enregistr\u00e9s dans le fichier diaporamaini\ndef Lister():\n    Lire_Ini()\n    global smb\n    # Vider la liste de fichiers si elle n'est pas vide\n    if Liste_Fichiers.size() != 0:\n        Liste_Fichiers.delete(0,END)\n    print(\"Lister les fichiers du partage Samba\")\n    smb = smbclient.SambaClient(server=serveursmb, share=partagesmb, username=utilisateur, password=mot_de_passe, domain=domaine)\n    dirs = smb.listdir(\"\/\")\n    i = 0\n    while i &lt; len(dirs):\n       print (dirs&#91;i])\n       Liste_Fichiers.insert(i+1, dirs&#91;i])\n       i += 1\n    Mon_bouton_Video&#91;'state'] = NORMAL\n    menuvideo.entryconfigure(0,state=NORMAL)\n# ****************************************************************************************************\n# Lire les informations contenues dans le fichier diaporamaini\ndef Lire_Ini():\n    global serveursmb\n    global partagesmb\n    global utilisateur\n    global mot_de_passe\n    global domaine\n    global fichier_diaporama\n    # Lecture du fichier ini\n    fichierini = \"diaporamaini\"\n    # Ouverture du fichier s'il existe et r\u00e9cup\u00e9ration de la liste\n    if os.path.isfile(fichierini):\n        fichierSauvegarde = open(fichierini,\"rb\")\n        variables = pickle.load(fichierSauvegarde)\n        fichierSauvegarde.close()\n        # Affichage d'informations\n        print(\"Initialisation des variables depuis le fichier ini\")\n        # R\u00e9cup\u00e9ration des donn\u00e9es dans les variables\n        serveursmb = variables&#91;0]\n        partagesmb = variables&#91;1]\n        utilisateur = variables&#91;2]\n        mot_de_passe = variables&#91;3]\n        domaine = variables&#91;4]\n        fichier_diaporama = variables&#91;5]\n    else:\n        # Le fichier n'existe pas\n        print(\"Fichier \" + fichierini + \" non trouv\u00e9\")\n        serveursmb = partagesmb = utilisateur = mot_de_passe = domaine = fichier_diaporama = \"vide\"\n# ****************************************************************************************************\n# Transf\u00e9rer et Lire le fichier vid\u00e9o\ndef Video():\n    Fichier_video = \"vide\"\n    i=Liste_Fichiers.curselection()  ## R\u00e9cup\u00e9ration de l'index de l'\u00e9l\u00e9ment s\u00e9lectionn\u00e9\n    try:\n        Fichier_video = Liste_Fichiers.get(i)\n    except:\n        print(\"S\u00e9lectionnez un fichier vid\u00e9o\")\n        messagebox.showinfo(\"Attention !\", \"S\u00e9lectionnez un fichier vid\u00e9o .mp4 .avi .mkv .ogm .wmv .mov .flv .webm .mpeg .mpg .vob.\")\n    # Extention du fichier dans la variable ext\n    _, ext = os.path.splitext(Fichier_video)\n    Extentions_Liste = &#91;'.mp4', '.avi', '.mkv', '.ogm', '.wmv', '.mov', '.flv', '.webm', '.mpeg', '.mpg', '.vob']\n    #if Fichier_video != \"vide\" and ext == \".mp4\" or ext == \".avi\":\n    ext = ext.lower() # Mettre le contenu de la variable cha\u00eene en minuscules\n    if Fichier_video != \"vide\" and ext in Extentions_Liste:\n        print(\"Fichier vid\u00e9o : \"+Fichier_video)\n        print(\"Extention du fichier : \"+ext)\n        local_path = \".\/\" + Fichier_video\n        smb.download(Fichier_video, local_path)\n        print(\"Fichier vid\u00e9o t\u00e9l\u00e9charg\u00e9\")\n        # ajout domnique\n        nom_de_fichier_avant = Fichier_video\n        print (\"Nom de fichier avant : \" + nom_de_fichier_avant)\n        nom_de_fichier_apres = nom_de_fichier(nom_de_fichier_avant)\n        print(\"Nom de fichier apr\u00e8s : \" + nom_de_fichier_apres)\n        if nom_de_fichier_avant != nom_de_fichier_apres:\n            print(\"Le nom de fichier a \u00e9t\u00e9 modifi\u00e9\")\n            print(\"Le fichier doit \u00eatre renomm\u00e9\")\n            os.rename(nom_de_fichier_avant, nom_de_fichier_apres)\n            Fichier_video = nom_de_fichier_apres\n        else:\n            print(\"Le nom de fichier n'a pas \u00e9t\u00e9 modifi\u00e9\")\n            print(Fichier_video)\n        # ajout dominique\n        subprocess.Popen(&#91;'\/bin\/sh', '-c', \"mplayer \" + Fichier_video + \" -loop 0 -fs\"])\n    else:\n        print(\"S\u00e9lectionnez un fichier vid\u00e9o\")\n# ****************************************************************************************************\ndef Aide():\n    messagebox.showinfo(\"\u00c0 propos\", \"Programme Dominique Renaudeau - Coll\u00e8ge Celles et Melle 2025.\")\n# ****************************************************************************************************\ndef nom_de_fichier(nom):\n    # Supprimer les espaces et les caract\u00e8res accentu\u00e9s du nom du fichier\n    # Remplacement des espaces\n    nom = nom.replace(\" \",\"_\")\n    # suppression les caract\u00e8res accentu\u00e9s\n    nom = unidecode.unidecode(nom)\n    return nom\n# ****************************************************************************************************\nos.chdir(os.path.dirname(__file__)) # Changer le r\u00e9pertoire courant par celui du programme\nLire_Ini() # lire le fichier ini\nFenetre = Tk() # Cr\u00e9ation de la fen\u00eatre, avec un nom de mon choix Fenetre\n# Cr\u00e9ation des menus\nmenubar = Menu(Fenetre)\nmenufichier = Menu(menubar,tearoff=0)\nmenubar.add_cascade(label=\"Fichier\", menu=menufichier)\nmenufichier.add_command(label=\"Lister\",state = DISABLED,command=Lister)\nmenufichier.add_command(label=\"Enregistrer\", command=Enregistrer)\nmenufichier.add_separator()\nmenufichier.add_command(label=\"Quitter\", command=Fenetre.destroy)\nmenudiaporama = Menu(menubar,tearoff=0)\nmenubar.add_cascade(label=\"Diaporama\", menu=menudiaporama)\nmenudiaporama.add_command(label=\"Lancer\",state = DISABLED,command=Lancer_Diaporama)\nmenuvideo = Menu(menubar,tearoff=0)\nmenubar.add_cascade(label=\"Vid\u00e9o\", menu=menuvideo)\nmenuvideo.add_command(label=\"Transf\u00e9rer et lancer la vid\u00e9o\",state = DISABLED,command=Video)\nmenuaide = Menu(menubar,tearoff=0)\nmenubar.add_cascade(label=\"Aide\", menu=menuaide)\nmenuaide.add_command(label=\"\u00c0 propos\",command=Aide)\nFenetre.config(menu=menubar)\n# Param\u00e8tres de la fen\u00eatre\nFenetre.title('Param\u00e8tres Diaporama et vid\u00e9o - Programme : D Renaudeau') #Titre de la fen\u00eatre\nFenetre.geometry(\"500x425\") # On d\u00e9finit la taille de la fen\u00eatre\nFenetre.resizable(width=False,height=False) #Emp\u00eacher de redimentionner la fen\u00eatre\n# Cr\u00e9ation d'un interface graphique avec grid\nServeur_Label= Label(Fenetre, text = 'Votre serveur - Nom ou IP :') #Un label pour afficher du texte\nServeur_Label.grid(row=0)\nServeur_Entry= Entry(Fenetre) # On d\u00e9finit l'objet Entry (zone de saisie) qui porte le nom Serveur_Entry\nServeur_Entry.insert(0, serveursmb)\nServeur_Entry.grid(row=0,column=1,ipadx=30) # ipadx=30 pour cr\u00e9er 10 pixels de plus horizontalement\nPartage_Label= Label(Fenetre, text = 'Votre partage r\u00e9seau :')\nPartage_Label.grid(row=1,column=0)\nPartage_Entry= Entry(Fenetre)\nPartage_Entry.insert(0, partagesmb)\nPartage_Entry.grid(row=1,column=1,ipadx=30)\nUtilisateur_Label= Label(Fenetre, text = 'Votre utilisateur :')\nUtilisateur_Label.grid(row=2,column=0)\nUtilisateur_Entry= Entry(Fenetre)\nUtilisateur_Entry.insert(0, utilisateur)\nUtilisateur_Entry.grid(row=2,column=1,ipadx=30)\nMot_de_passe_Label= Label(Fenetre, text = 'Votre mot de passe :')\nMot_de_passe_Label.grid(row=3,column=0)\nMot_de_passe_Entry= Entry(Fenetre,show=\"*\") # Saisie masqu\u00e9e du mot de passe\nMot_de_passe_Entry.insert(0, mot_de_passe)\nMot_de_passe_Entry.grid(row=3,column=1,ipadx=30)\nDomaine_Label= Label(Fenetre, text = 'Votre nom de domaine:')\nDomaine_Label.grid(row=4,column=0)\nDomaine_Entry= Entry(Fenetre)\nDomaine_Entry.insert(0, domaine)\nDomaine_Entry.grid(row=4,column=1,ipadx=30)\nFichier_du_diaporama_Label= Label(Fenetre, text = 'Votre fichier de diaporama :')\nFichier_du_diaporama_Label.grid(row=5,column=0)\nFichier_du_diaporama_Entry= Entry(Fenetre)\nFichier_du_diaporama_Entry.insert(0, fichier_diaporama)\nFichier_du_diaporama_Entry.grid(row=5,column=1,ipadx=30)\nMon_bouton_Lancer_Diaporama = Button(Fenetre, text = 'Lancer le Diaporama', state = DISABLED, command = Lancer_Diaporama)\nMon_bouton_Lancer_Diaporama.grid(row=6,column=0,ipadx=0)\nMon_bouton_Enregistrer = Button(Fenetre, text = ' Enregistrer le fichier ini', command = Enregistrer)\nMon_bouton_Enregistrer.grid(row=6,column=1,ipadx=0)\nMon_bouton_Video = Button(Fenetre, text = ' Transf\u00e9rer et lancer la vid\u00e9o', state = DISABLED, command = Video)\nMon_bouton_Video.grid(row=8,column=0,ipadx=0)\nListe_Fichiers = Listbox(Fenetre)\nListe_Fichiers.grid(row=7,column=1,ipadx=30)\nMon_bouton_Lister_Fichiers = Button(Fenetre, text = ' Lister les fichiers du partage depuis ini', state = DISABLED, command = Lister)\nMon_bouton_Lister_Fichiers.grid(row=8,column=1,ipadx=0)\nif serveursmb != \"vide\":\n    Mon_bouton_Lister_Fichiers&#91;'state'] = NORMAL\n    Mon_bouton_Lancer_Diaporama&#91;'state'] = NORMAL\n    menufichier.entryconfigure(0,state=NORMAL)\n    menudiaporama.entryconfigure(0,state=NORMAL)\nFenetre.mainloop() # lance la boucle principale<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p class=\"has-large-font-size\">T\u00e9l\u00e9chargements des fichiers au format ZIP<\/p>\n\n\n\n<p>Dans cette archive zip \u00e0 t\u00e9l\u00e9charger, vous pourrez retrouver les deux fichiers en Python :<\/p>\n\n\n\n<p>Fichiers Python pour l&rsquo;affichage dynamique<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avec Debian 11 puis Debian 12 Principe de fonctionnement Un partage r\u00e9seau Samba h\u00e9berge un diaporama LibreOffice Impress, quand ce dernier est modifi\u00e9 il est automatiquement t\u00e9l\u00e9charg\u00e9 par un programme en Python et affich\u00e9 sur la t\u00e9l\u00e9vision qui est connect\u00e9e en HDMI \u00e0 un PC sous la distribution GNU Linux Debian 11 ou Debian 12. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-320","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages\/320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=320"}],"version-history":[{"count":47,"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages\/320\/revisions"}],"predecessor-version":[{"id":2873,"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages\/320\/revisions\/2873"}],"wp:attachment":[{"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}