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

Simulation du clavier avec Python

J’utilise Debian 10 Buster et Python 3.7.3.

Pour simuler l’appui sur des touches du clavier en Python, j’ai utilisé la bibliothèque keyboard.

Pour l’installer, en administrateur (root) :

pip3 install keyboard

Si cela ne fonctionne pas.

Installation des paquets nécessaires à la mise en place des bibliothèques pour Python 3, en administrateur (root pour Debian ou sudo pour Ubuntu, Mint). Pip est un gestionnaire de paquets :

apt-get install python-pip python3-pip

Le lien :

https://pypi.org/project/keyboard/

Je l’ai utilisé dans l’exemple suivant :

#!/usr/bin/env python3.7

#-*- coding: utf-8 -*-

import keyboard

keyboard.press_and_release('alt + tab')

keyboard.press_and_release('ctrl + v')

Dans cet exemple, je simule l’appui simultané sur les touches [Alt] + [Tab] pour basculer vers une autre application où je colle le contenu du presse-papiers [Ctrl] + [v].

Cela fonctionne très bien, le problème que je rencontre est que je ne peux utiliser cette bibliothèque qu’en administrateur (root). Je voulais intégrer cette fonctionnalité à un programme utilisant tkinter pour l’interface graphique et là ça fonctionne avec mon utilisateur, mais pas en root, dommage !

Si vous avez des informations pouvant aider à avancer sur le sujet, n’hésitez pas à laisser un commentaire.

Installation de Visual Studio Code sous Debian 10 Buster

Visual Studio Code est un éditeur de code source développé par Microsoft, avec la particularité d’être open source. Il est disponible pour Windows, Linux et Mac OS X.

Depuis le site : https://code.visualstudio.com/

Cliquez sur .deb Debian, Ubuntu

Cochez Enregistrer le fichier.

Cliquez sur [OK]

Depuis un terminal en administrateur root (su), rendez-vous dans votre dossier Téléchargements (dans mon cas mon dossier utilisateur se nomme dominique) :

cd /home/dominique/Téléchargements/

Si vous voulez voir les fichiers se trouvant dans le dossier utilisez la commande ls (le nom du fichier télécharger peut changer).

Installer le paquet :

dpkg -i code_1.36.1-1562627527_amd64.deb

Si vous rencontrez des problèmes avec la commande dpkg liés à la variable PATH (messages d’erreur), consultez l’article suivant :

Sous Debian 10 dpkg -i problèmes avec la variable PATH

Listes et boucles avec Python

J’utilise Debian 10 Buster et Python 3.7.3.

Pour illustrer l’utilisation d’une boucle for avec une liste, je vous propose la fonction suivante que j’ai réalisée. Au passage, on voit également les instructions conditionnelles avec if et else, mais ce n’est pas le sujet principal pour le moment.

Voilà le code :

def maj_min():

    liste_boutons = [Mon_bouton1,Mon_bouton2,Mon_bouton3,Mon_bouton4,Mon_bouton5,Mon_bouton6,Mon_bouton7]

    if Mon_bouton10["text"] == "Maj":

        Mon_bouton10["text"] = "Min"

        for bouton in liste_boutons:

            bouton["text"] = bouton["text"].upper()

    else:

        Mon_bouton10["text"] = "Maj"

        for bouton in liste_boutons:

            bouton["text"] = bouton["text"].lower()

Dans le programme, j’ai utilisé tkinter pour créer une interface graphique. J’ai donc des boutons. Le but de ma procédure est, lorsque je clique sur un bouton prévu à cet effet (Mon_bouton10), que le texte d’une série de boutons passe de minuscule à majuscule et inversement.

Les fonctions upper() pour majuscules et lower() pour minuscules.

J’ai donc créé une liste nommée liste_boutons où j’ai énuméré les boutons concernés.

Vous remarquerez mes deux boucles for qui traitent tous les boutons de la liste, pour dans un cas mettre leurs textes en majuscules et dans l’autre en minuscule.

Une dernière chose, l’indentation, vous remarquerez que le code est parfois décalé vers la droite (quatre espaces ou une tabulation). Cela permet de déterminer le bloc de code traité par les instructions if, else, ou for. Cette disposition du code est une obligation en Python.

Un dernier conseil, n’oubliez pas les : à la fin de certaines lignes.

Utilisation du presse-papiers depuis Python

J’utilise Debian 10 Buster et Python 3.7.3

L’utilisation du presse-papiers dans un programme Python permet d’effectuer des copier-coller.

J’ai décidé d’utiliser la bibliothèque pyperclip.

Les prérequis :

Installation du paquet pip pour le presse-papiers depuis le terminal en administrateur (root).

pip3 install pyperclip

Si cela ne fonctionne pas.

Installation des paquets nécessaires à la mise en place des bibliothèques pour Python 3, en administrateur (root pour Debian ou sudo pour Ubuntu, Mint). Pip est un gestionnaire de paquets :

apt-get install python-pip python3-pip

Installation du paquet Linux pour l’usage du presse-papiers depuis le terminal en administrateur (root) :

apt-get install xclip

Dans le script Python, on doit importer la bibliothèque pyperclip :

import pyperclip

Exemple d’utilisation :

pyperclip.copy(copie) #Copier dans le presse-papiers le contenu de la variable copie.

Plus d’informations sur le WEB :

https://pypi.org/project/pyperclip/

Créer une interface graphique sous Debian en Python avec Tkinter

J’utilise Debian 10 Buster et Python 3.7.3.

Le but ici est de créer une interface graphique pour une application en Python. Dans mon cas, il s’agit de saisir des données.

Prérequis :

Pour Python 3 , depuis un terminal en administrateur root :

apt-get install python3-tk

Pour importer la bibliothèque dans votre programme :

from tkinter import *


Exemple avec la méthode pack

On a déjà vu comment lire ou enregistrer des variables, depuis ou vers un fichier. Ici, on voit comment créer une interface graphique avec Tkinter pour saisir des valeurs dans des variables.

Mon interface graphique sous Debian

Si votre application est graphique ou que votre code fait une tâche de fond, vous pouvez renommer votre fichier avec l’extension .pyw (plutôt que .py) pour dissimuler le Shell. Si vous nommer mon script Python en .py, vous verrez le résultat de votre saisie dans le Shell.

À noter que l’on peut saisir des valeurs dans des variables sans interface graphique avec la fonction input().

Je débute en Python, si vous avez des idées pour améliorer le code, je suis à votre écoute. Tous les conseils sont les biens venus.

Je pense que l’on pourrait par exemple, améliorer la disposition des widgets.

Voici mon code :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-

from tkinter import * #On importe l'ensemble du module Tkinter

def enregister(): #Ma fonction
    serveursmb = Serveur_Entry.get() # lecture du contenu du widget "Serveur_Entry"
    partagesmb = Partage_Entry.get() # lecture du contenu du widget "Partage_Entry"
    utilisateur = Utilisateur_Entry.get() # lecture du contenu du widget "Utilisateur_Entry"
    mot_de_passe = Mot_de_passe_Entry.get() # lecture du contenu du widget "Mot_de_passe_Entry"
    domaine = Domaine_Entry.get() # lecture du contenu du widget "Domaine_Entry"
    fichier_diaporama = Fichier_du_diaporama_Entry.get() # lecture du contenu du widget "Fichier_du_diaporama_Entry"
    print(serveursmb) #Affichage des données saisies dans le terminal
    print(partagesmb)
    print(utilisateur)
    print(mot_de_passe)
    print(domaine)
    print(fichier_diaporama)
    Fenetre.destroy() #Fermeture de la fenêtre

#Mon programme
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

Serveur_Label= Label(Fenetre, text = 'Votre serveur :') #Un label pour afficher du texte
Serveur_Entry= Entry(Fenetre) #On définit l'objet Entry (zone de saisie) qui porte le nom Serveur_Entry
Partage_Label= Label(Fenetre, text = 'Votre partage réseau :')
Partage_Entry= Entry(Fenetre) 
Utilisateur_Label= Label(Fenetre, text = 'Votre utilisateur :')
Utilisateur_Entry= Entry(Fenetre)
Mot_de_passe_Label= Label(Fenetre, text = 'Votre mot de passe :')
Mot_de_passe_Entry= Entry(Fenetre)
Domaine_Label= Label(Fenetre, text = 'Votre nom de domaine:')
Domaine_Entry= Entry(Fenetre)
Fichier_du_diaporama_Label= Label(Fenetre, text = 'Votre fichier de diaporama :')
Fichier_du_diaporama_Entry= Entry(Fenetre)
Mon_bouton = Button(Fenetre, text =' Enregistrer', command=enregister) #Mon bouton - Un clic et on lance la fonction enregistrer

Serveur_Label.pack() # insère les Widgets dans la fenêtre
Serveur_Entry.pack()
Partage_Label.pack()
Partage_Entry.pack() 
Utilisateur_Label.pack()
Utilisateur_Entry.pack()
Mot_de_passe_Label.pack()
Mot_de_passe_Entry.pack()
Domaine_Label.pack()
Domaine_Entry.pack()
Fichier_du_diaporama_Label.pack()
Fichier_du_diaporama_Entry.pack()
Mon_bouton.pack()

affichage = Label(Fenetre, width=50)
affichage.pack()

Fenetre.mainloop() # lance la boucle principale

Exemple avec la méthode grid

Un nouvel exemple où l’on utilise la méthode grid ce qui permet de mieux disposer les widgets.

Mon interface graphique sous Debian

Voici mon code :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-
from tkinter import *
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
#Création d'un interface graphique avec grid
#Remplacer les méthodes pack() par les méthodes grid() 
Serveur_Label= Label(Fenetre, text = 'Votre serveur :') #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.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.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.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)
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.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.grid(row=5,column=1,ipadx=30)
Mon_bouton = Button(Fenetre, text =' Enregistrer')
Mon_bouton.grid(row=6,column=1,ipadx=40)
Fenetre.mainloop() # lance la boucle principale

Exemple avec la méthode place

La méthode place permet de placer les widgets sur les axes de coordonnées.

En exemple, je me suis inspiré de l’interface du programme Lexibar espagnol très apprécié de nos professeurs de collège.

Mon interface graphique sous Debian

Voici mon code :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-
from tkinter import *

Fenetre = Tk() #Création de la fenêtre, avec un nom de votre choix Fenetre
Fenetre.title('Lexidom') #Titre de la fenêtre
Fenetre.geometry("340x60") #On définit la taille de la fenêtre
#Création et affichage des boutons
Mon_bouton1 = Button(Fenetre, text = 'á', width = 2, height = 2, bg = "red", fg = 'white', font = 'bold')
Mon_bouton1.place (x = 0, y = 3)
Mon_bouton2 = Button(Fenetre, text = 'é', width = 2, height = 2, bg = "red", fg = 'white', font = 'bold')
Mon_bouton2.place (x = 30, y = 3)
Mon_bouton3 = Button(Fenetre, text = 'í', width = 2, height = 2, bg = "red", fg = 'white', font = 'bold')
Mon_bouton3.place (x = 60, y = 3)

Mon_bouton4 = Button(Fenetre, text = 'ó', width = 2, height = 2, bg = 'yellow', font = 'bold')
Mon_bouton4.place (x = 90, y = 3)
Mon_bouton5 = Button(Fenetre, text = 'ú', width = 2, height = 2, bg = 'yellow', font = 'bold')
Mon_bouton5.place (x = 120, y = 3)
Mon_bouton6 = Button(Fenetre, text = 'ü', width = 2, height = 2, bg = 'yellow', font = 'bold')
Mon_bouton6.place (x = 150, y = 3)

Mon_bouton7 = Button(Fenetre, text = 'ñ', width = 2, height = 2, bg = "red", fg = 'white', font = 'bold')
Mon_bouton7.place (x = 180, y = 3)
Mon_bouton8 = Button(Fenetre, text = '¿', width = 2, height = 2, bg = "red", fg = 'white', font = 'bold')
Mon_bouton8.place (x = 210, y = 3)
Mon_bouton9 = Button(Fenetre, text = '¡', width = 2, height = 2, bg = "red", fg = 'white', font = 'bold')
Mon_bouton9.place (x = 240, y = 3)

Mon_bouton10 = Button(Fenetre, text ='Maj/Min', width = 8, height = 3)
Mon_bouton10.place (x = 270, y = 3)

Fenetre.mainloop() # lance la boucle principale

Plus d’informations sur la programmation Python/Tkinter :

https://fr.wikibooks.org/wiki/Programmation_Python/Tkinter

Sauvegarder vos variables dans un fichier avec Python

J’utilise Debian 10 Buster et Python 3.7.3

Pour sauvegarder mes variables dans un fichier, j’utilise ici le module pickle. L’ordre de sauvegarde et de restauration doit être identique.

Le fichier peut être ouvert de différentes façons :

‘r’ Ouvrir le fichier en lecture seule (défaut).

‘w’ Ouvrir en écriture. Écrase le fichier existant.

‘x’ Ouvrir en écriture si et seulement si le fichier n’existe pas déjà.

‘a’ Ouvrir en écriture. Ajoute au fichier existant.

‘b’ Mode binaire.

‘t’ Mode texte (défaut).

Dans mes exemples, j’utilise ‘wb’ et ‘rb’

Exemple de sauvegarde des variables dans un fichier :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-

import pickle
#Enregistrer mes variables sous forme d'une liste dans un fichier
#Initialisation des variables
serveursmb = "PC-DOM"
partagesmb = "Partage-Diaporama"
utilisateur = "dominique"
mot_de_passe = "motdepasse"
domaine = "WORKGROUP"
fichier_diaporama = "Diaporama.odp"

#Enregistrement des variables dans le fichier
variables = [serveursmb, partagesmb, utilisateur, mot_de_passe, domaine, fichier_diaporama]
fichierSauvegarde = open("diaporamaini","wb")
pickle.dump(variables, fichierSauvegarde)
fichierSauvegarde.close()

Exemple de récupération de mes variables depuis un fichier. Au préalable, je teste que le fichier existe bien :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-

import pickle
import os.path

fichierini = "diaporamaini"

#Ouverture du fichier si 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 de la liste
    print(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]

    #Affichage des variables
    print("Serveur : ", serveursmb)
    print("Partage : ", partagesmb) 
    print("Utilisateur : ",utilisateur)
    print("Mot de passe : ", mot_de_passe)
    print("Domaine : ", domaine)
    print("Fichier du diaporama : ", fichier_diaporama)
else:
    #Le fichier n'existe pas
    print("Fichier " + fichierini + " non trouvé")

Plus d’informations sur le WEB :

https://python.antoinepernot.fr/cours.php?course=chap5

Les commandes Shell Linux depuis Python

J’utilise Debian 10 Buster et Python 3.7.3

Mon but ici est d’exécuter des commandes Shell Linux depuis un script Python et si nécessaire de récupérer le résultat d’une commande dans une variable.

Dans mon exemple de programme en Python, je récupère le PID d’un processus Linux (celui de LibreOffice) dans une variable, par la suite, j’utilise ce paramètre dans une commande Shell Linux kill pour tuer l’application.

Si vous avez des suggestions d’améliorations ou une autre façon de procéder, je suis à votre écoute, rien n’est figé dans le marbre.

Mon exemple :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-
# Obtenir le pid de LibreOffice et arrêter l'application
import subprocess
import os
pid = os.popen("pidof soffice.bin").read() #Obtenir le pid de LibreOffice grâce à une commande du Shell Linux
if pid != '': #si le pid n'est pas vide
    print('Mon pid : ', pid) #Afficher le pid
    Commande = 'kill -9 '+ str(pid) #La commande du Shell Linux qui va pemettre d'arrêter l'application
    subprocess.Popen(['/bin/sh', '-c', Commande]) #on arrête l'application
else: #sinon - pas de pid
    print("Oops! Je n'ai pas trouvé LibreOffice")

C’est un exemple intéressant, mais en fait on peut arrêter une application sans disposer de son PID avec la commande pkill. Ce qui donne l’exemple qui suit :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-
import subprocess
subprocess.Popen(['/bin/sh', '-c', "pkill office"]) #on arrête l'application LibreOffice

Ce que je trouve dommage, c’est que l’on ne teste pas au préalable si LibreOffice est effectivement lancé. Vous avez une idée pour améliorer cela ?

Client Samba avec Python

J’utilise Debian 10 Buster et Python 3.7.3

Dans cet exemple, j’installe une bibliothèque pour Python 3 (un client Samba) afin de pouvoir accéder à un partage réseau Windows.

Installation des paquets nécessaires à la mise en place des bibliothèques pour Python 3, en administrateur (root pour Debian ou sudo pour Ubuntu, Mint). Pip est un gestionnaire de paquets :

apt-get install python-pip python3-pip

Installation de la bibliothèque pysmbclient ( client samba) pour Python 3 avec pip :

pip3 install pysmbclient

Grâce à cette installation, je vais pouvoir accéder aux partages réseau depuis Python.

Dans mon script Python j’ajoute la ligne suivant pour utiliser la bibliothèque pysmbclient :

import smbclient

Prérequis :

J’ai installé également les paquets samba et smbclient pour Linux  (en root ou avec sudo) pour pouvoir utiliser le client Samba :

apt-get install samba smbclient

Exemple :

#!/usr/bin/env python3.7
#-*- coding: utf-8 -*-
import smbclient
serveursmb = "PC-DOM"
partagesmb = "Partage-Diaporama"
utilisateur = "dominique"
mot_de_passe = "motdepasse"
domaine = "WORKGROUP"
fichier_diaporama = "Diaporama.odp"
smb = smbclient.SambaClient(server=serveursmb, share=partagesmb, username=utilisateur, password=mot_de_passe, domain=domaine)
#Afficher des informations sur le fichier
informations = smb.info(fichier_diaporama)
print(informations)
#Afficher les fichiers contenus dans le dossier partagé
test = smb.listdir("/")
print(test)
'''Pour télécharger le fichier distant \\PC-DOM\Partage-Diaporama\Diaporama.odp
vers vers le dossier courant - chemin absolu /home/Dominique/Documents/Diaporama.odp'''
local_path = "./" + fichier_diaporama
smb.download(fichier_diaporama, local_path)