{"id":2875,"date":"2026-02-09T18:40:32","date_gmt":"2026-02-09T17:40:32","guid":{"rendered":"https:\/\/artheodoc.fr\/?page_id=2875"},"modified":"2026-02-17T11:06:04","modified_gmt":"2026-02-17T10:06:04","slug":"affichage-dynamique-en-python-sous-debian-13","status":"publish","type":"page","link":"https:\/\/artheodoc.fr\/index.php\/affichage-dynamique-en-python-sous-debian-13\/","title":{"rendered":"Affichage dynamique en Python sous Debian 13"},"content":{"rendered":"\n<p><strong>Versions des programmes modifi\u00e9es par l\u2019intelligence artificielle Le Chat de la soci\u00e9t\u00e9 Mistral.<\/strong><\/p>\n\n\n\n<p><em>Mis \u00e0 jour le&nbsp;: 09\/02\/2026<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sous Debian 13<\/h2>\n\n\n\n<p><em>Les pr\u00e9s-requis suite \u00e0 l\u2019installation de Debian 13. Vous n\u2019\u00eates pas oblig\u00e9 d\u2019installer le serveur SSH, si des commandes Shell sont inaccessibles, modifiez la variable d\u2019environnement PATH, param\u00e9trez en IP fixe, commentez la ligne concernant le CD d\u2019installation dans le sources.list. J&rsquo;ai choisi l&rsquo;interface graphique Cinnamon.<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/artheodoc.fr\/index.php\/modification-de-la-variable-denvironnement-path-pour-pouvoir-utiliser-les-commandes-du-shell\/\" data-type=\"page\" data-id=\"34\" target=\"_blank\" rel=\"noreferrer noopener\">Modification de la variable d\u2019environnement PATH pour pouvoir utiliser les commandes du Shell<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/artheodoc.fr\/index.php\/modification-du-fichier-sources-list-sous-debian-11\/\" data-type=\"page\" data-id=\"38\" target=\"_blank\" rel=\"noreferrer noopener\">Modification du fichier sources.list sous Debian 11<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/artheodoc.fr\/index.php\/exemple-de-parametrages-en-ip-fixe-sous-debian-11\/\" data-type=\"page\" data-id=\"41\" target=\"_blank\" rel=\"noreferrer noopener\">Exemple de param\u00e9trages en IP fixe sous debian 11<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/artheodoc.fr\/index.php\/changer-le-port-pour-ssh\/\" data-type=\"page\" data-id=\"50\" target=\"_blank\" rel=\"noreferrer noopener\">Changer le port pour SSH<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Principe de fonctionnement<\/h2>\n\n\n\n<p><em>Un partage r\u00e9seau Samba h\u00e9berge un diaporama LibreOffice Impress, quand ce dernier est modifi\u00e9 depuis <strong>Windows<\/strong> 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 <strong>Debian 13<\/strong>. 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.<\/em><\/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 <strong>nom du partage<\/strong>, <strong>l\u2019utilisateur<\/strong> y ayant acc\u00e8s avec son <strong>mot de passe<\/strong>.<\/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<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 <strong>Windows<em> qui h\u00e9berge le <\/em><\/strong><em>partage&rsquo;<\/em>, une machine virtuelle <strong>Debian 13<\/strong> 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 su avec la commande <strong>nautilus<\/strong> ou <strong>nemo<\/strong>.<\/p>\n\n\n\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\n\n\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\u2019ai pas la possibilit\u00e9 de connecter un clavier filaire.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><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\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Affichage Dynamique Python sous Debian 13 - 2026\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/ml4N3zRV8ao?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00e9requis pour l\u2019installation sur la machine sous Debian 13<\/h2>\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\">python3 --version<\/pre>\n\n\n\n<p>Python 3.13.5 dans mon cas.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Adapter l\u2019ent\u00eate des fichiers Python \u00e0 votre version. Par exemple #!\/usr\/bin\/env python3.9 peut devenir #!\/usr\/bin\/env python3.13. On peut modifier les fichiers avec L&rsquo;\u00e9diteur <strong>Nano<\/strong>.<\/p>\n\n\n\n<p>Sous Debian, pour \u00e9diter mon fichier, je peux \u00e9galement utiliser Sublime Text&nbsp;:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.sublimetext.com\/docs\/linux_repositories.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.sublimetext.com\/docs\/linux_repositories.html<\/a><\/p>\n\n\n\n<p>Voir l\u2019installation pour <strong>apt<\/strong> (avec Debian en administrateur root <strong>su<\/strong> pas de commande sudo).<\/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\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Pour l\u2019interface graphique avec Tkinter<\/h2>\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> + <strong>mot de passe<\/strong>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">apt-get install python3-tk<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Acc\u00e8s au partage Samba<\/h2>\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 smbclient (client samba) sous Linux en administrateur root <strong>su<\/strong>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">apt-get install smbclient<\/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&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">smbclient -U utilisateur \/\/ip_du_serveur\/nom_du_partage<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Pour installer les biblioth\u00e8ques externes pour Python 3 et les d\u00e9pendances<\/h2>\n\n\n\n<p>Installer pysmbclient (client samba) pour l\u2019acc\u00e8s au partage r\u00e9seau depuis Python.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Debian 13 \u2013 PySmbClient<\/strong><\/h3>\n\n\n\n<p>On peut t\u00e9l\u00e9charger les fichiers et les copier directement dans le dossier <strong>\/usr\/local\/lib\/python3.13\/dist-packages\/<\/strong>.<\/p>\n\n\n\n<p>Pour t\u00e9l\u00e9charger les fichiers&nbsp;:<\/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; <strong>PySmbClient-x.x.x.tar.gz<\/strong><\/p>\n\n\n\n<p>Dans mon cas j&rsquo;obtient le fichier PySmbClient-0.1.5.tar.gz.<\/p>\n\n\n\n<p>Depuis le dossier T\u00e9l\u00e9chargements&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tar zxvf PySmbClient-0.1.5.tar.gz<\/pre>\n\n\n\n<p>Depuis le dossier PySmbClient-0.1.5&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mv * \/usr\/local\/lib\/python3.13\/dist-packages\/<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Debian 13 \u2013 unidecode<\/h3>\n\n\n\n<p>Installer la biblioth\u00e8que unidecode pour supprimer les caract\u00e8res accentu\u00e9s des noms de fichiers vid\u00e9o&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">apt-get install python3-unidecode<\/pre>\n\n\n\n<p><strong>Pour la lecture des vid\u00e9os sous Debian mplayer doit \u00eatre install\u00e9<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">apt-get install mplayer<\/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\">mplayer Fichier_video -loop 0 -fs<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Les droits sur les fichiers<\/h3>\n\n\n\n<p>Les deux programmes doivent \u00eatre ex\u00e9cutables et je r\u00e9duis les droits \u00e0 l\u2019utilisateur&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">chmod 700 nom_du_fichier<\/pre>\n\n\n\n<p>Pour le fichier diaporamaini, droits en lecture et en \u00e9criture au seul utilisateur&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">chmod 600 diaporamaini<\/pre>\n\n\n\n<p>Pour une installation sous Debian, j\u2019ai \u00e9galement install\u00e9 le paquet libreoffice-java-common&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">apt-get install libreoffice-java-common<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Pour ex\u00e9cuter un programme<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">.\/nom_du_fichier.py<\/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\">rm nom_du_fichier<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Installation de Java JRE<\/h3>\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&nbsp;!<\/p>\n\n\n\n<p>Pour t\u00e9l\u00e9charger Java JRE pour Linux&nbsp;:<\/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&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cd \/usr<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir java<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">cd java<\/pre>\n\n\n\n<p>Lancez le navigateur nautilus ou nemo depuis le terminal en administrateur root su pour copier les fichier de l\u2019archive TAR t\u00e9l\u00e9charg\u00e9e dans \/usr\/java ou utilisez la ligne de commande.<\/p>\n\n\n\n<p>D\u00e9compressez l\u2019archive TAR (jre-8u451-linux-x64.tar.gz dans mon cas) pour installer Java depuis le dossier T\u00e9l\u00e9chargements&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tar zxvf jre-8u481-linux-x64.tar.gz<\/pre>\n\n\n\n<p>Depuis le dossier jre1.8.0_481&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mv * \/usr\/java\/<\/pre>\n\n\n\n<p>On peut \u00e9galement d\u00e9placer les fichiers avec une commande <strong>mv<\/strong> depuis un terminal on en SSH.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">conf-affichage-dynamique.py<\/h2>\n\n\n\n<p><strong>Programme permettant de param\u00e9trer l\u2019application et de t\u00e9l\u00e9charger et lire en boucle les vid\u00e9os.<\/strong><\/p>\n\n\n\n<p><strong>Vous devez saisir les param\u00e8tres de configuration dans le fichier ini.<\/strong><\/p>\n\n\n\n<p>Pour que le programme fonctionne, vous devez cr\u00e9er le fichier diaporamaini en saisissant vos param\u00e8tres puis en cliquant sur <strong>[Enregistre le fichier ini]<\/strong>.<\/p>\n\n\n\n<p>Pour que le programme soit ex\u00e9cutable&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">chmod +x conf-affichage-dynamique.py<\/pre>\n\n\n\n<p>R\u00e9duire les droits \u00e0 l&rsquo;utilisateur&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">chmod 700 conf-affichage-dynamique.py<\/pre>\n\n\n\n<p>Pour lancer le programme depuis le dossier o\u00f9 il se trouve&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.\/conf-affichage-dynamique.py<\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"425\" height=\"751\" src=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2026\/02\/conf-affichage-dynamique.png\" alt=\"\" class=\"wp-image-2876\" srcset=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2026\/02\/conf-affichage-dynamique.png 425w, https:\/\/artheodoc.fr\/wp-content\/uploads\/2026\/02\/conf-affichage-dynamique-170x300.png 170w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/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, <strong>nom du serveur ou IP<\/strong>, <strong>partage r\u00e9seau<\/strong>, <strong>utilisateur<\/strong>, <strong>mot de passe<\/strong>, <strong>nom de domaine<\/strong>, <strong>fichier de diaporama<\/strong> doivent \u00eatre saisis puis enregistr\u00e9s dans le fichier ini.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\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 Samba]<\/strong> Permet de lister les fichiers contenus dans le partage r\u00e9seau \u00e0 partir des param\u00e8tres du fichier ini \u00ab&nbsp;diaporamaini&nbsp;\u00bb.<\/li>\n\n\n\n<li><strong>[Transf\u00e9rer et lire la vid\u00e9o Samba]<\/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\n\n\n<li><strong>[Lister les fichiers locaux]<\/strong> Permet de lister les fichiers contenu dans le dossier de l&rsquo;application.<\/li>\n\n\n\n<li><strong>[Lire vid\u00e9o locale]<\/strong> Permet de lire en boucle la vid\u00e9o s\u00e9lectionn\u00e9e dans les fichiers locaux.<\/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<h2 class=\"wp-block-heading\">conf-affichage-dynamique.py code source<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/usr\/bin\/env python3.13<br># -- coding: utf-8 --<br><br># Version 2026<br><br>import os<br>import pickle<br>import subprocess<br>import unidecode<br>from tkinter import *<br>from tkinter import messagebox<br>import smbclient<br><br># Variables globales<br>serveursmb = \"vide\"<br>partagesmb = \"vide\"<br>utilisateur = \"vide\"<br>mot_de_passe = \"vide\"<br>domaine = \"vide\"<br>fichier_diaporama = \"vide\"<br><br># Chemins relatifs<br>SCRIPT_DIR = os.path.dirname(__file__)<br>INI_FILE = os.path.join(SCRIPT_DIR, \"diaporamaini\")<br><br># Extensions vid\u00e9o autoris\u00e9es<br>EXTENSIONS_VIDEO = {<br>    '.mp4', '.avi', '.mkv', '.ogm', '.wmv', '.mov',<br>    '.flv', '.webm', '.mpeg', '.mpg', '.vob'<br>}<br><br># --- Fonctions utilitaires ---<br>def nom_de_fichier(nom: str) -&gt; str:<br>    \"\"\"Nettoie le nom d'un fichier en supprimant les espaces et les accents.\"\"\"<br>    nom = nom.replace(\" \", \"_\")<br>    return unidecode.unidecode(nom)<br><br># --- Gestion du fichier INI ---<br>def lire_ini() -&gt; None:<br>    \"\"\"Lit le fichier de configuration et initialise les variables globales.\"\"\"<br>    global serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama<br><br>    if os.path.isfile(INI_FILE):<br>        try:<br>            with open(INI_FILE, \"rb\") as fichier:<br>                variables = pickle.load(fichier)<br>                serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama = variables<br>                print(\"Variables initialis\u00e9es depuis le fichier INI.\")<br>        except Exception as e:<br>            print(f\"Erreur lors de la lecture du fichier INI&nbsp;: {e}\")<br>            serveursmb = partagesmb = utilisateur = mot_de_passe = domaine = fichier_diaporama = \"vide\"<br>    else:<br>        print(f\"Fichier {INI_FILE} non trouv\u00e9.\")<br>        serveursmb = partagesmb = utilisateur = mot_de_passe = domaine = fichier_diaporama = \"vide\"<br><br>def enregistrer() -&gt; None:<br>    \"\"\"Enregistre les param\u00e8tres dans le fichier INI.\"\"\"<br>    global serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama<br><br>    serveursmb = Serveur_Entry.get()<br>    partagesmb = Partage_Entry.get()<br>    utilisateur = Utilisateur_Entry.get()<br>    mot_de_passe = Mot_de_passe_Entry.get()<br>    domaine = Domaine_Entry.get()<br>    fichier_diaporama = Fichier_du_diaporama_Entry.get()<br><br>    if all(var&nbsp;!= \"vide\" for var in [serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama]):<br>        variables = [serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama]<br>        try:<br>            with open(INI_FILE, \"wb\") as fichier:<br>                pickle.dump(variables, fichier)<br>            Mon_bouton_Lister_Fichiers['state'] = NORMAL<br>            Mon_bouton_Lancer_Diaporama['state'] = NORMAL<br>            menufichier.entryconfigure(0, state=NORMAL)<br>            menudiaporama.entryconfigure(0, state=NORMAL)<br>        except Exception as e:<br>            messagebox.showerror(\"Erreur\", f\"Impossible d'enregistrer le fichier INI&nbsp;: {e}\")<br>    else:<br>        messagebox.showwarning(\"Attention\", \"Tous les champs doivent \u00eatre remplis.\")<br><br># --- Gestion du diaporama ---<br>def lancer_diaporama() -&gt; None:<br>    \"\"\"Lance le script du diaporama.\"\"\"<br>    try:<br>        subprocess.Popen([\"\/usr\/bin\/env\", \"python3.13\", os.path.join(SCRIPT_DIR, \"affichage-dynamique.py\")])<br>    except Exception as e:<br>        messagebox.showerror(\"Erreur\", f\"Impossible de lancer le diaporama&nbsp;: {e}\")<br><br># --- Gestion des fichiers Samba ---<br>def lister_fichiers() -&gt; None:<br>    \"\"\"Liste les fichiers du partage Samba.\"\"\"<br>    global smb<br><br>    lire_ini()<br>    Liste_Fichiers_Samba.delete(0, END)<br><br>    try:<br>        smb = smbclient.SambaClient(<br>            server=serveursmb,<br>            share=partagesmb,<br>            username=utilisateur,<br>            password=mot_de_passe,<br>            domain=domaine<br>        )<br>        dirs = smb.listdir(\"\/\")<br>        for i, fichier in enumerate(dirs, start=1):<br>            Liste_Fichiers_Samba.insert(i, fichier)<br>        Mon_bouton_Video_Samba['state'] = NORMAL<br>        menuvideo.entryconfigure(0, state=NORMAL)<br>    except Exception as e:<br>        messagebox.showerror(\"Erreur\", f\"Impossible de lister les fichiers&nbsp;: {e}\")<br><br># --- Gestion des vid\u00e9os Samba ---<br>def transferer_et_lancer_video_samba() -&gt; None:<br>    \"\"\"T\u00e9l\u00e9charge et lance une vid\u00e9o depuis le partage Samba.\"\"\"<br>    try:<br>        selection = Liste_Fichiers_Samba.curselection()<br>        if not selection:<br>            raise ValueError(\"Aucun fichier s\u00e9lectionn\u00e9.\")<br><br>        fichier_video = Liste_Fichiers_Samba.get(selection[0])<br>        _, ext = os.path.splitext(fichier_video)<br>        ext = ext.lower()<br><br>        if ext not in EXTENSIONS_VIDEO:<br>            raise ValueError(\"Le fichier s\u00e9lectionn\u00e9 n'est pas une vid\u00e9o valide.\")<br><br>        local_path = os.path.join(SCRIPT_DIR, fichier_video)<br>        smb.download(fichier_video, local_path)<br><br>        # Nettoyage du nom de fichier<br>        nouveau_nom = nom_de_fichier(fichier_video)<br>        if nouveau_nom&nbsp;!= fichier_video:<br>            os.rename(local_path, os.path.join(SCRIPT_DIR, nouveau_nom))<br>            local_path = os.path.join(SCRIPT_DIR, nouveau_nom)<br><br>        # Lancement de la vid\u00e9o<br>        subprocess.Popen(['mplayer', local_path, '-loop', '0', '-fs'])<br>    except Exception as e:<br>        messagebox.showerror(\"Erreur\", f\"Impossible de transf\u00e9rer ou lancer la vid\u00e9o&nbsp;: {e}\")<br><br># --- Gestion des fichiers locaux ---<br>def lister_fichiers_locaux() -&gt; None:<br>    \"\"\"Liste les fichiers locaux dans le dossier de l'application.\"\"\"<br>    Liste_Fichiers_Locaux.delete(0, END)<br>    try:<br>        fichiers = os.listdir(SCRIPT_DIR)<br>        for i, fichier in enumerate(fichiers, start=1):<br>            Liste_Fichiers_Locaux.insert(i, fichier)<br>        # Activation du bouton et du menu apr\u00e8s le listing<br>        Mon_bouton_Lire_Video_Locale['state'] = NORMAL<br>        menuvideo.entryconfigure(1, state=NORMAL)<br>    except Exception as e:<br>        messagebox.showerror(\"Erreur\", f\"Impossible de lister les fichiers locaux&nbsp;: {e}\")<br><br># --- Gestion des vid\u00e9os locales ---<br>def lire_video_locale() -&gt; None:<br>    \"\"\"Lit une vid\u00e9o locale en boucle avec mplayer.\"\"\"<br>    try:<br>        selection = Liste_Fichiers_Locaux.curselection()<br>        if not selection:<br>            raise ValueError(\"Aucun fichier s\u00e9lectionn\u00e9.\")<br><br>        fichier_video = Liste_Fichiers_Locaux.get(selection[0])<br>        _, ext = os.path.splitext(fichier_video)<br>        ext = ext.lower()<br><br>        if ext not in EXTENSIONS_VIDEO:<br>            raise ValueError(\"Le fichier s\u00e9lectionn\u00e9 n'est pas une vid\u00e9o valide.\")<br><br>        local_path = os.path.join(SCRIPT_DIR, fichier_video)<br>        subprocess.Popen(['mplayer', local_path, '-loop', '0', '-fs'])<br>    except Exception as e:<br>        messagebox.showerror(\"Erreur\", f\"Impossible de lire la vid\u00e9o locale&nbsp;: {e}\")<br><br># --- Interface graphique ---<br>def creer_interface() -&gt; Tk:<br>    \"\"\"Cr\u00e9e et configure l'interface graphique.\"\"\"<br>    global Serveur_Entry, Partage_Entry, Utilisateur_Entry, Mot_de_passe_Entry, Domaine_Entry<br>    global Fichier_du_diaporama_Entry, Liste_Fichiers_Samba, Liste_Fichiers_Locaux<br>    global Mon_bouton_Lancer_Diaporama, Mon_bouton_Enregistrer, Mon_bouton_Video_Samba<br>    global Mon_bouton_Lister_Fichiers, Mon_bouton_Lister_Fichiers_Locaux, Mon_bouton_Lire_Video_Locale<br>    global menufichier, menudiaporama, menuvideo<br><br>    Fenetre = Tk()<br>    Fenetre.title('Param\u00e8tres Diaporama et Vid\u00e9o - Programme&nbsp;: D Renaudeau')<br>    Fenetre.geometry(\"425x680\")<br>    Fenetre.resizable(width=False, height=False)<br><br>    # Menus<br>    menubar = Menu(Fenetre)<br>    menufichier = Menu(menubar, tearoff=0)<br>    menufichier.add_command(label=\"Lister Samba\", state=DISABLED, command=lister_fichiers)<br>    menufichier.add_command(label=\"Lister Locaux\", command=lister_fichiers_locaux)<br>    menufichier.add_command(label=\"Enregistrer\", command=enregistrer)<br>    menufichier.add_separator()<br>    menufichier.add_command(label=\"Quitter\", command=Fenetre.destroy)<br>    menubar.add_cascade(label=\"Fichier\", menu=menufichier)<br><br>    menudiaporama = Menu(menubar, tearoff=0)<br>    menudiaporama.add_command(label=\"Lancer\", state=DISABLED, command=lancer_diaporama)<br>    menubar.add_cascade(label=\"Diaporama\", menu=menudiaporama)<br><br>    menuvideo = Menu(menubar, tearoff=0)<br>    menuvideo.add_command(label=\"Transf\u00e9rer et lire la vid\u00e9o Samba\", state=DISABLED, command=transferer_et_lancer_video_samba)<br>    menuvideo.add_command(label=\"Lire vid\u00e9o locale\", state=DISABLED, command=lire_video_locale)  # D\u00e9sactiv\u00e9 au lancement<br>    menubar.add_cascade(label=\"Vid\u00e9o\", menu=menuvideo)<br><br>    menuaide = Menu(menubar, tearoff=0)<br>    menuaide.add_command(label=\"\u00c0 propos\", command=lambda: messagebox.showinfo(\"\u00c0 propos\", \"Programme Dominique Renaudeau - Coll\u00e8ge Celles et Melle 2026.\"))<br>    menubar.add_cascade(label=\"Aide\", menu=menuaide)<br><br>    Fenetre.config(menu=menubar)<br><br>    # Champs de saisie<br>    labels = [<br>        (\"Votre serveur - Nom ou IP&nbsp;:\", 0),<br>        (\"Votre partage r\u00e9seau&nbsp;:\", 1),<br>        (\"Votre utilisateur&nbsp;:\", 2),<br>        (\"Votre mot de passe&nbsp;:\", 3),<br>        (\"Votre nom de domaine&nbsp;:\", 4),<br>        (\"Votre fichier de diaporama&nbsp;:\", 5)<br>    ]<br><br>    entries = []<br>    for label_text, row in labels:<br>        Label(Fenetre, text=label_text).grid(row=row, column=0, sticky=W)<br>        entry = Entry(Fenetre, show=\"*\" if \"mot de passe\" in label_text.lower() else None)<br>        entry.grid(row=row, column=1, ipadx=30, sticky=W)<br>        entries.append(entry)<br><br>    Serveur_Entry, Partage_Entry, Utilisateur_Entry, Mot_de_passe_Entry, Domaine_Entry, Fichier_du_diaporama_Entry = entries<br><br>    # Boutons<br>    Mon_bouton_Lancer_Diaporama = Button(Fenetre, text='Lancer le Diaporama', state=DISABLED, command=lancer_diaporama)<br>    Mon_bouton_Lancer_Diaporama.grid(row=6, column=0, ipadx=0, pady=5)<br><br>    Mon_bouton_Enregistrer = Button(Fenetre, text='Enregistrer le fichier ini', command=enregistrer)<br>    Mon_bouton_Enregistrer.grid(row=6, column=1, ipadx=0, pady=5)<br><br>    # Listbox pour les fichiers Samba<br>    Label(Fenetre, text=\"Fichiers Samba&nbsp;:\").grid(row=7, column=0, sticky=W)<br>    Liste_Fichiers_Samba = Listbox(Fenetre, width=50, height=8)<br>    Liste_Fichiers_Samba.grid(row=8, column=0, columnspan=2, padx=10, pady=5, sticky=W+E)<br><br>    Mon_bouton_Lister_Fichiers = Button(Fenetre, text='Lister les fichiers Samba', state=DISABLED, command=lister_fichiers)<br>    Mon_bouton_Lister_Fichiers.grid(row=9, column=0, ipadx=0, pady=5)<br><br>    Mon_bouton_Video_Samba = Button(Fenetre, text='Transf\u00e9rer et lire la vid\u00e9o Samba', state=DISABLED, command=transferer_et_lancer_video_samba)<br>    Mon_bouton_Video_Samba.grid(row=9, column=1, ipadx=0, pady=5)<br><br>    # Listbox pour les fichiers locaux<br>    Label(Fenetre, text=\"Fichiers locaux&nbsp;:\").grid(row=10, column=0, sticky=W)<br>    Liste_Fichiers_Locaux = Listbox(Fenetre, width=50, height=8)<br>    Liste_Fichiers_Locaux.grid(row=11, column=0, columnspan=2, padx=10, pady=5, sticky=W+E)<br><br>    Mon_bouton_Lister_Fichiers_Locaux = Button(Fenetre, text='Lister les fichiers locaux', command=lister_fichiers_locaux)<br>    Mon_bouton_Lister_Fichiers_Locaux.grid(row=12, column=0, ipadx=0, pady=5)<br><br>    Mon_bouton_Lire_Video_Locale = Button(Fenetre, text='Lire vid\u00e9o locale', state=DISABLED, command=lire_video_locale)  # D\u00e9sactiv\u00e9 au lancement<br>    Mon_bouton_Lire_Video_Locale.grid(row=12, column=1, ipadx=0, pady=5)<br><br>    # Initialisation des champs<br>    Serveur_Entry.insert(0, serveursmb)<br>    Partage_Entry.insert(0, partagesmb)<br>    Utilisateur_Entry.insert(0, utilisateur)<br>    Mot_de_passe_Entry.insert(0, mot_de_passe)<br>    Domaine_Entry.insert(0, domaine)<br>    Fichier_du_diaporama_Entry.insert(0, fichier_diaporama)<br><br>    # Activation des boutons si les param\u00e8tres sont d\u00e9j\u00e0 d\u00e9finis<br>    if serveursmb&nbsp;!= \"vide\":<br>        Mon_bouton_Lister_Fichiers['state'] = NORMAL<br>        Mon_bouton_Lancer_Diaporama['state'] = NORMAL<br>        menufichier.entryconfigure(0, state=NORMAL)<br>        menudiaporama.entryconfigure(0, state=NORMAL)<br><br>    return Fenetre<br><br># --- Point d'entr\u00e9e ---<br>if __name__ == \"__main__\":<br>    os.chdir(SCRIPT_DIR)<br>    lire_ini()<br>    Fenetre = creer_interface()<br>    Fenetre.mainloop()<\/pre>\n\n\n\n<p>Vous pouvez cr\u00e9er le fichier avec <a href=\"https:\/\/artheodoc.fr\/index.php\/lediteur-de-texte-nano\/\" data-type=\"page\" data-id=\"972\">na<\/a><a href=\"https:\/\/artheodoc.fr\/index.php\/lediteur-de-texte-nano\/\" data-type=\"page\" data-id=\"972\" target=\"_blank\" rel=\"noreferrer noopener\">no<\/a>, votre utilisateur doit \u00eatre le propri\u00e9taire pas root.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">affichage-dynamique.py<\/h2>\n\n\n\n<p><strong>Programme qui g\u00e8re le diaporama<\/strong><\/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>Pour que le programme soit ex\u00e9cutable&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">chmod +x affichage-dynamique.py<\/pre>\n\n\n\n<p>R\u00e9duire les droits \u00e0 l&rsquo;utilisateur&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">chmod 700 affichage-dynamique.py<\/pre>\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&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.\/affichage-dynamique.py<\/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<h2 class=\"wp-block-heading\">affichage-dynamique.py code source<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/usr\/bin\/env python3.13\n# -- coding: utf-8 --\n\n# Version 2026\n\nimport pickle\nimport os\nimport smbclient\nimport subprocess\nimport time\nimport ast\nfrom typing import Optional, Tuple\n\n# Constantes\nINI_FILE = \"diaporamaini\"\nLOCAL_DIAPORAMA_PATH = \".\/\"\n\ndef charger_variables_ini(nom_fichier: str) -&gt; Optional[Tuple[str, str, str, str, str, str]]:\n    \"\"\"Charge les variables depuis le fichier ini.\"\"\"\n    if not os.path.isfile(nom_fichier):\n        print(f\"Fichier {nom_fichier} non trouv\u00e9.\")\n        return None\n\n    try:\n        with open(nom_fichier, \"rb\") as fichier:\n            variables = pickle.load(fichier)\n        return variables\n    except Exception as e:\n        print(f\"Erreur lors de la lecture du fichier {nom_fichier}: {e}\")\n        return None\n\ndef arreter_libreoffice() -&gt; None:\n    \"\"\"Arr\u00eate les processus LibreOffice en cours.\"\"\"\n    try:\n        pid = subprocess.run([\"pidof\", \"soffice.bin\"], capture_output=True, text=True).stdout.strip()\n        if pid:\n            print(\"Arr\u00eat de l'application LibreOffice...\")\n            subprocess.run([\"pkill\", \"office\"], check=True)\n            time.sleep(2)\n    except subprocess.CalledProcessError:\n        print(\"LibreOffice n'est pas en cours d'ex\u00e9cution.\")\n\ndef telecharger_fichier_smb(\n    smb_client: smbclient.SambaClient,\n    fichier_source: str,\n    chemin_destination: str\n) -&gt; bool:\n    \"\"\"T\u00e9l\u00e9charge un fichier depuis un partage SMB.\"\"\"\n    try:\n        if os.path.isfile(chemin_destination):\n            os.remove(chemin_destination)\n        smb_client.download(fichier_source, chemin_destination)\n        print(\"T\u00e9l\u00e9chargement du fichier\")\n        return True\n    except Exception as e:\n        print(f\"Erreur lors du t\u00e9l\u00e9chargement du fichier {fichier_source}: {e}\")\n        return False\n\ndef lancer_diaporama(fichier_diaporama: str) -&gt; subprocess.Popen:\n    \"\"\"Lance le diaporama avec LibreOffice.\"\"\"\n    print('Lancement du diaporama&nbsp;: ',fichier_diaporama)\n    try:\n        return subprocess.Popen(\n            [\"libreoffice\", \"--norestore\", \"--show\", fichier_diaporama],\n            shell=False\n        )\n    except Exception as e:\n        print(f\"Erreur lors du lancement de LibreOffice: {e}\")\n        raise\n\ndef main() -&gt; None:\n    # Chargement des variables\n    variables = charger_variables_ini(INI_FILE)\n    if not variables:\n        exit(1)\n\n    serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama = variables\n    local_path = os.path.join(LOCAL_DIAPORAMA_PATH, fichier_diaporama)\n\n    # Connexion au partage SMB\n    try:\n        smb = smbclient.SambaClient(\n            server=serveursmb,\n            share=partagesmb,\n            username=utilisateur,\n            password=mot_de_passe,\n            domain=domaine\n        )\n    except Exception as e:\n        print(f\"Erreur de connexion au partage SMB: {e}\")\n        exit(1)\n\n    version_old = None\n    while True:\n        try:\n            version_new = smb.info(fichier_diaporama)\n            # Convertir la cha\u00eene en dictionnaire\n            dictionnaire = ast.literal_eval(str(version_new))\n            # Extraire la valeur de 'write_time'\n            write_time = dictionnaire['write_time']\n            version_new = write_time\n        except Exception:\n            version_new = version_old\n            print(\"version_new = version_old \")\n        if version_new&nbsp;!= version_old:\n            print(\"Nouvelle version d\u00e9tect\u00e9e, mise \u00e0 jour en cours...\")\n            arreter_libreoffice()\n            if telecharger_fichier_smb(smb, fichier_diaporama, local_path):\n                try:\n                    processus = lancer_diaporama(local_path)\n                    version_old = version_new\n                    print(\"version_old = version_new\")\n                    print('Modifi\u00e9 le&nbsp;: ',version_new)\n                    time.sleep(60)\n                except:\n                    print(\"Erreur lors de l'affichage du diaporama.\")\n            else:\n                print(\"\u00c9chec du t\u00e9l\u00e9chargement, r\u00e9essayez plus tard.\")\n        else:\n            time.sleep(5)  # Pas de mise \u00e0 jour, on attend 20 secondes\n\n        # V\u00e9rification de l'\u00e9tat de LibreOffice\n        pid = subprocess.run([\"pidof\", \"soffice.bin\"], capture_output=True, text=True).stdout.strip()\n        if not pid:\n            print(\"LibreOffice n'est pas lanc\u00e9. V\u00e9rifiez les param\u00e8tres et l'acc\u00e8s au partage r\u00e9seau.\")\n            exit(1)\n\nif __name__ == \"__main__\":\n    print(\"***** Programme de Dominique Renaudeau en langage Python *****\")\n    print(\"Initialisation des variables...\")\n    main()<\/pre>\n\n\n\n<p>Vous pouvez cr\u00e9er le fichier avec <a href=\"https:\/\/artheodoc.fr\/index.php\/lediteur-de-texte-nano\/\" data-type=\"page\" data-id=\"972\">na<\/a><a href=\"https:\/\/artheodoc.fr\/index.php\/lediteur-de-texte-nano\/\" data-type=\"page\" data-id=\"972\" target=\"_blank\" rel=\"noreferrer noopener\">n<\/a><a href=\"https:\/\/artheodoc.fr\/index.php\/lediteur-de-texte-nano\/\" data-type=\"page\" data-id=\"972\">o<\/a>, votre utilisateur doit \u00eatre le propri\u00e9taire pas root.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Si cela ne fonctionne pas sous Debian<\/h2>\n\n\n\n<p>Avec Samba sous Debian 13<\/p>\n\n\n\n<p>Pour tester la connexion au partage Samba depuis le terminal sous Linux&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">smbclient -U utilisateur \/\/ip_du_serveur\/nom_du_partage<\/pre>\n\n\n\n<p>Si vous avez le message suivant&nbsp;:<\/p>\n\n\n\n<p>protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED<\/p>\n\n\n\n<p>Solution<\/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&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">smbclient --version<\/pre>\n\n\n\n<p>Dans le fichier <strong>\/etc\/samba\/smb.conf<\/strong> sous la section <strong>[global]<\/strong> j\u2019ai ajout\u00e9&nbsp;:<\/p>\n\n\n\n<p>client min protocol = NT1<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Pour d\u00e9sactiver la bo\u00eete de dialogue \u00ab&nbsp;Astuce du jour&nbsp;\u00bb dans LibreOffice<\/h2>\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&nbsp;<strong>Astuces du jour<\/strong>&nbsp;\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<h2 class=\"wp-block-heading\">Acc\u00e9der \u00e0 un partage Samba depuis Linux<\/h2>\n\n\n\n<p><a href=\"https:\/\/artheodoc.fr\/index.php\/2025\/03\/05\/acceder-a-un-partage-samba-depuis-linux-mint\/\" data-type=\"post\" data-id=\"1875\" target=\"_blank\" rel=\"noreferrer noopener\">Acc\u00e9der \u00e0 un partage Samba depuis Linux Mint<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">La suite\u2026<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"547\" height=\"305\" src=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2026\/02\/Affichage_Dynamique_VPN.png\" alt=\"\" class=\"wp-image-2927\" srcset=\"https:\/\/artheodoc.fr\/wp-content\/uploads\/2026\/02\/Affichage_Dynamique_VPN.png 547w, https:\/\/artheodoc.fr\/wp-content\/uploads\/2026\/02\/Affichage_Dynamique_VPN-300x167.png 300w\" sizes=\"auto, (max-width: 547px) 100vw, 547px\" \/><\/figure>\n\n\n\n<p>J\u2019ai test\u00e9 mon programme pour acc\u00e9der via un VPN \u00e0 un diaporama se trouvant sur un site distant (partage Samba sur un NAS OpenMediaVault).<\/p>\n\n\n\n<p>Le prochain projet est un diaporama et un serveur VPN WireGuard sous Alpine Linux sur un site et mes programmes en Python et un client VPN sur une machine se trouvant un site distant.<\/p>\n\n\n\n<p><a href=\"https:\/\/artheodoc.fr\/index.php\/alpine-linux\/\" data-type=\"page\" data-id=\"1365\" target=\"_blank\" rel=\"noreferrer noopener\">Alpine Linux<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/artheodoc.fr\/index.php\/installation-sous-alpine-linux-du-serveur-vpn-wireguard\/\" data-type=\"page\" data-id=\"1392\" target=\"_blank\" rel=\"noreferrer noopener\">Installation sous Alpine Linux du serveur VPN WireGuard<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/artheodoc.fr\/index.php\/creation-dun-partage-samba-sous-alpine-linux\/\" data-type=\"page\" data-id=\"2918\" target=\"_blank\" rel=\"noreferrer noopener\">Cr\u00e9ation d\u2019un partage Samba sous Alpine Linux<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Versions des programmes modifi\u00e9es par l\u2019intelligence artificielle Le Chat de la soci\u00e9t\u00e9 Mistral. Mis \u00e0 jour le&nbsp;: 09\/02\/2026 Sous Debian 13 Les pr\u00e9s-requis suite \u00e0 l\u2019installation de Debian 13. Vous n\u2019\u00eates pas oblig\u00e9 d\u2019installer le serveur SSH, si des commandes Shell sont inaccessibles, modifiez la variable d\u2019environnement PATH, param\u00e9trez en IP fixe, commentez la ligne [&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-2875","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages\/2875","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=2875"}],"version-history":[{"count":9,"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages\/2875\/revisions"}],"predecessor-version":[{"id":2928,"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/pages\/2875\/revisions\/2928"}],"wp:attachment":[{"href":"https:\/\/artheodoc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=2875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}