Macros
TDF LibreOffice Document Liberation Project Blogs communautaires Weblate Nextcloud Redmine Ask LibreOffice Donner
⇐ Principes généraux |Table des matières| Boites de dialogue ⇒
Identifier son système
Les informations utiles de l'environnement
Toute programmation nécessite à un moment ou un autre de récupérer des informations sur le système informatique. Comment récupérer des informations sur le matériel, le système d'exploitation, python, la suite bureautique ou sur la macro elle même ?
Les briques de base de la macro
Nous allons profiter de cette macro pour introduire la création de fonctions. Une fonction évite de reproduire mécaniquement des portions de code en l'appelant avec un nom de fonction. Une fonction nous permet aussi d'adapter les spécificités de valeurs ou d'éléments en lui passant des paramètres.
Pour commencer vous devez créer un fichier info.py. Soit avec l'extension APOS, soit en l'éditant «aux emplacements des fichiers macro », soit en l'éditant dans un de vos répertoire et après en l'intégrant dans un document LibreOffice avec un script.
D'abord nous récupérons en début de macro les bibliothèques et les paramètres utiles pour la fonction :
import uno
from com.sun.star.awt.MessageBoxType import \
MESSAGEBOX as BOÎTEDIALOGUE, \
INFOBOX as BOÎTEINFORMATION, \
ERRORBOX as BOÎTEERREUR, \
WARNINGBOX as BOÎTEAVERTISSEMENT, \
QUERYBOX as BOÎTEQUESTION
from com.sun.star.awt.MessageBoxButtons import \
BUTTONS_OK as BOUTON_OK, \
BUTTONS_OK_CANCEL as BOUTONS_OK_ANNULER, \
BUTTONS_YES_NO as BOUTONS_OUI_NON, \
BUTTONS_YES_NO_CANCEL as BOUTONS_OUI_NON_ANNULER, \
BUTTONS_RETRY_CANCEL as BOUTONS_RÉESSAYER_ANNULER, \
BUTTONS_ABORT_IGNORE_RETRY as BOUTONS_INTERROMPRE_RÉESSAYER_IGNORER, \
DEFAULT_BUTTON_OK as OK_PAR_DEFAUT, \
DEFAULT_BUTTON_CANCEL as ANNULER_PAR_DEFAUT, \
DEFAULT_BUTTON_RETRY as RÉESSAYER_PAR_DEFAUT, \
DEFAULT_BUTTON_YES as OUI_PAR_DEFAUT, \
DEFAULT_BUTTON_NO as NON_PAR_DEFAUT, \
DEFAULT_BUTTON_IGNORE as IGNORER_PAR_DEFAUT
from com.sun.star.awt.MessabeBoxResults import CANCEL as ANNULER, OK, YES as OUI, NO as NON, RETRY as RÉESSAYER, IGNORE as IGNORER
Nous allons donc transformer notre code d'affichage d'une boite de dialogue en une fonction de nom «boitemsg». Cette fonction aura comme paramètres :
- le message à afficher avec le paramètre «messageboîte»,
- le titre de la boîte de message avec le paramètre «titreboîteàmessage»,
- la variété de boutons avec le paramètre «typedebouton» avec par défaut le bouton OK à afficher
- et le modèle de boîte de dialogue avec le paramètre «typedeboite» avec comme modèle par défaut de paramètre BOÎTEDIALOGUE.
def boitemsg(messageboîte, titreboîteàmessage, typedebouton=BOUTON_OK, typedeboite=BOÎTEDIALOGUE):
#typedeboite :
# Boite de message : BOÎTEDIALOGUE
# Boite d'information : BOÎTEINFORMATION
# Boite d'erreur : BOÎTEERREUR
# Boite d'alerte : BOÎTEAVERTISSEMENT
# Boite d'interrogation : BOÎTEQUESTION
#
#typedebouton :
# OK : BOUTON_OK
# OK/ANNULER : BOUTONS_OK_ANNULER
# OUI/NON : BOUTONS_OUI_NON
# OUI/NON/ANNULER : BOUTONS_OUI_NON_ANNULER
# RÉESSAYER/ANNULER : BOUTONS_RÉESSAYER_ANNULER
# ANNULER/RÉESSAYER/IGNORER : BOUTONS_INTERROMPRE_REESSAYER_IGNORER
bureau = XSCRIPTCONTEXT.getDesktop()
cadre = bureau.getCurrentFrame()
fenêtre = cadre.getContainerWindow()
boîteàoutils = fenêtre.getToolkit()
boîtemessage = boîteàoutils.createMessageBox(fenêtre, typedeboite, typedebouton, titreboîteàmessage, messageboîte)
return boîtemessage.execute()
Pour utiliser cette fonction nous écrivons le nom de la fonction en substituant les paramètres.
La détection du matériel informatique
Comme pour la boite de message nous allons créer une fonction pour détecter le processeur de l'ordinateur.
D'abord modifions les bibliothèques utiles pour la fonction
import uno, platform, subprocess
«platform» nous permet de récupérer des informations sur le système. «subprocess» permet de traiter le résultat d'une commande shell.
Puis écrivons la fonction de détection du processeur de l'ordinateur :
#Création de la fonction de détection du processeur
def info_processeur():
#Si le système d'exploitation est un MS Windows
if platform.system() == "Windows":
#platform retourne le type de processeur de l'ordinateur
return platform.processor()
#Si le système d'exploitation est un macOS
elif platform.system() == "Darwin":
#la commande shell sysctl retourne le type de processeur de l'ordinateur
return subprocess.check_output(['/usr/sbin/sysctl', "-n", "machdep.cpu.brand_string"]).strip()
#Si le système d'exploitation est un Linux
elif platform.system() == "Linux":
#le contenu du système de fichier virtuel /proc/cpuinfo retourne le type de processeur de l'ordinateur
#dans le paramètre ''model name''
for ligne in subprocess.check_output(["cat", "/proc/cpuinfo"], universal_newlines=True).split("\n"):
if "model name" in ligne:
return ligne.replace("model name", "").replace(":", "").strip()
return platform.processor()
Nous pouvons maintenant afficher avec la fonction boitemsg toutes sortes d'informations sur le matériel de l'ordinateur :
def info():
message = "[Matériel]"
message += "\nMachine : %s" % platform.architecture()[0]
message += "\nProcesseur : %s" % platform.machine()
message += "\nModèle : %s" % info_processeur()
resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
Le système d'exploitation
Ajoutons le code suivant :
message += "\n\n[Système d'exploitation]"
message += "\nSystème : %s" % platform.system()
message += "\nNom machine du système : %s" % platform.node()
message += "\nVersion du noyeau : %s" % platform.release()
message += "\nRéalisation du système : %s" % platform.version()
avant la ligne de code de notre macro :
resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
Les informations sur Python
Nous devons d'abord ajouter la bibliothèque «sys»
import uno, platform, subprocess, sys
Puis le code suivant :
message += "\n\n[Python]"
message += "\nVersion de Python : %s.%s.%s" % sys.version_info[:3]
message += "\nVersion du compilateur : %s" % platform.python_compiler()
message += "\nVersion de compilation : %s" % platform.python_build()[1]
message += "\nChemin de l\'exécutable : %s" % sys.executable
avant la ligne de code de notre macro :
resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
Les informations sur la suite bureautique
Nous devons d'abord ajouter la bibliothèque «PropertyValue» en début de programme
…
from com.sun.star.awt.MessageBoxResults import CANCEL, OK, YES, NO, RETRY, IGNORE
from com.sun.star.beans import PropertyValue
Puis le code suivant :
message += "\n\n[Bureautique]"
#Teste l'exécution de la séquence de code python
try:
#Définition des paramètres de récupération de la configuration de la suite bureautique
prop = PropertyValue()
prop.Name = 'nodepath'
prop.Value = '/org.openoffice.Setup/Product'
properties = (prop,)
#Récupération du contexte d'exécution de la suite bureautique
ctx = XSCRIPTCONTEXT.getComponentContext()
#Récupération de la configuration de la suite bureautique
configuration = ctx.ServiceManager.createInstanceWithContext(
'com.sun.star.configuration.ConfigurationProvider', ctx)
#Récupération des informations sur la configuration
informations = configuration.createInstanceWithArguments(
'com.sun.star.configuration.ConfigurationAccess', properties)
#Récupération du nom de la suite bureautique
bureautique = informations.getByName('ooName')
#Récupération du fournisseur de la suite bureautique
vendeur = informations.getByName('ooVendor')
#Récupération de la version de la suite
version = informations.getByName('ooSetupVersion')
#Récupération de la révision
révision = informations.getByName('ooSetupVersionAboutBox')
#Récupération de la version des documents produit par la suite
versionfichiers = informations.getByName('ooXMLFileFormatVersion')
except:
bureautique = 'Pas d\'information disponible'
vendeur = 'Pas d\'information disponible'
version = 'Pas d\'information disponible'
révision = 'Pas d\'information disponible'
versionfichiers = 'Pas d\'information disponible'
message += "\nSuite bureautique : %s" % bureautique
message += "\nFournisseur : %s" % vendeur
message += "\nVersion : %s" % version
message += "\nRévision : %s" % révision
message += "\nVersion fichiers : %s" % versionfichiers
try:
#Récupération du document courant ouvert (enregistré sur un support) de la suite
oDoc = XSCRIPTCONTEXT.getDocument()
#Récupération de son emplacement sur le support
oLocal = oDoc.getLocation()
message += "\nChemin : %s" % str(oLocal)
except:
message += "\nChemin document : %s" % 'Pas d\'emplacement de document'
avant la ligne de code de notre macro :
resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
Les informations sur la macro info.py
Nous devons d'abord ajouter la bibliothèque «os»
import uno, platform, subprocess, sys, os
Puis le code suivant :
message += "\n\n[Macro]"
message += "\nScript python : %s" % os.path.basename(__file__)
message += "\nChemin macro : %s" % os.path.dirname(__file__)
message += "\nChemin courant : %s" % os.getcwd()
avant la ligne de code de notre macro :
resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
Code complet d'affichage d'informations du système
#!
#coding: utf8
#Macro: info.py
#Objectif: Affiche une boîte de dialogue avec des informations systèmes
#Auteur: Franc SERRES
#Licence: https://www.gnu.org/licenses/gpl-3.0.fr.html
import uno, platform, subprocess, sys, os
from com.sun.star.awt.MessageBoxType import \
MESSAGEBOX as BOÎTEDIALOGUE, \
INFOBOX as BOÎTEINFORMATION, \
ERRORBOX as BOÎTEERREUR, \
WARNINGBOX as BOÎTEAVERTISSEMENT, \
QUERYBOX as BOÎTEQUESTION
from com.sun.star.awt.MessageBoxButtons import \
BUTTONS_OK as BOUTON_OK, \
BUTTONS_OK_CANCEL as BOUTONS_OK_ANNULER, \
BUTTONS_YES_NO as BOUTONS_OUI_NON, \
BUTTONS_YES_NO_CANCEL as BOUTONS_OUI_NON_ANNULER, \
BUTTONS_RETRY_CANCEL as BOUTONS_RÉESSAYER_ANNULER, \
BUTTONS_ABORT_IGNORE_RETRY as BOUTONS_INTERROMPRE_REESSAYER_IGNORER, \
DEFAULT_BUTTON_OK as OK_PAR_DEFAUT, \
DEFAULT_BUTTON_CANCEL as ANNULER_PAR_DEFAUT, \
DEFAULT_BUTTON_RETRY as RÉESSAYER_PAR_DEFAUT, \
DEFAULT_BUTTON_YES as OUI_PAR_DEFAUT, \
DEFAULT_BUTTON_NO as NON_PAR_DEFAUT, \
DEFAULT_BUTTON_IGNORE as IGNORER_PAR_DEFAUT
from com.sun.star.awt.MessageBoxResults import CANCEL, OK, YES, NO, RETRY, IGNORE
from com.sun.star.beans import PropertyValue
def boitemsg(messageboîte, titreboîteàmessage, typedebouton=BOUTON_OK, typedeboite=BOÎTEDIALOGUE):
#typedeboite :
# Boite de message : BOÎTEDIALOGUE
# Boite d'information : BOÎTEINFORMATION
# Boite d'erreur : BOÎTEERREUR
# Boite d'alerte : BOÎTEAVERTISSEMENT
# Boite d'interrogation : BOÎTEQUESTION
#
#typedebouton :
# OK : BOUTON_OK
# OK/ANNULER : BOUTONS_OK_ANNULER
# OUI/NON : BOUTONS_OUI_NON
# OUI/NON/ANNULER : BOUTONS_OUI_NON_ANNULER
# RÉESSAYER/ANNULER : BOUTONS_RÉESSAYER_ANNULER
# ANNULER/RÉESSAYER/IGNORER : BOUTONS_INTERROMPRE_REESSAYER_IGNORER
bureau = XSCRIPTCONTEXT.getDesktop()
cadre = bureau.getCurrentFrame()
fenêtre = cadre.getContainerWindow()
boîteàoutils = fenêtre.getToolkit()
boîtemessage = boîteàoutils.createMessageBox(fenêtre, typedeboite, typedebouton, titreboîteàmessage, messageboîte)
return boîtemessage.execute()
def get_processor_info():
if platform.system() == "Windows":
return platform.processor()
elif platform.system() == "Darwin":
return subprocess.check_output(['/usr/sbin/sysctl', "-n", "machdep.cpu.brand_string"]).strip()
elif platform.system() == "Linux":
for line in subprocess.check_output(["cat", "/proc/cpuinfo"], universal_newlines=True).split("\n"):
if "model name" in line:
return line.replace("model name", "").replace(":", "").strip()
return platform.processor()
def info():
message = "[Matériel]"
message += "\nMachine : %s" % platform.architecture()[0]
message += "\nProcesseur : %s" % platform.machine()
message += "\nModèle : %s" % get_processor_info()
message += "\n\n[Système d'exploitation]"
message += "\nSystème : %s" % platform.system()
message += "\nNom machine du système : %s" % platform.node()
message += "\nVersion du noyeau : %s" % platform.release()
message += "\nRéalisation du système : %s" % platform.version()
message += "\n\n[Python]"
message += "\nVersion de Python : %s.%s.%s" % sys.version_info[:3]
message += "\nVersion du compilateur : %s" % platform.python_compiler()
message += "\nVersion de compilation : %s" % platform.python_build()[1]
message += "\nChemin de l\'exécutable : %s" % sys.executable
message += "\n\n[Bureautique]"
try:
prop = PropertyValue()
prop.Name = 'nodepath'
prop.Value = '/org.openoffice.Setup/Product'
properties = (prop,)
ctx = XSCRIPTCONTEXT.getComponentContext()
configuration = ctx.ServiceManager.createInstanceWithContext(
'com.sun.star.configuration.ConfigurationProvider', ctx)
informations = configuration.createInstanceWithArguments(
'com.sun.star.configuration.ConfigurationAccess', properties)
bureautique = informations.getByName('ooName')
vendeur = informations.getByName('ooVendor')
version = informations.getByName('ooSetupVersion')
révision = informations.getByName('ooSetupVersionAboutBox')
versionfichiers = informations.getByName('ooXMLFileFormatVersion')
except:
bureautique = 'Pas d\'information disponible'
vendeur = 'Pas d\'information disponible'
version = 'Pas d\'information disponible'
révision = 'Pas d\'information disponible'
versionfichiers = 'Pas d\'information disponible'
message += "\nSuite bureautique : %s" % bureautique
message += "\nFournisseur : %s" % vendeur
message += "\nVersion : %s" % version
message += "\nRévision : %s" % révision
message += "\nVersion fichiers : %s" % versionfichiers
try:
document = XSCRIPTCONTEXT.getDocument()
location = document.getLocation()
message += "\nChemin : %s" % location
except:
message += "\nChemin document : %s" % 'Pas d\'emplacement de document'
message += "\n\n[Macro]"
message += "\nScript python : %s" % os.path.basename(__file__)
message += "\nChemin macro : %s" % os.path.dirname(__file__).replace('file://', '')
message += "\nChemin courant : %s" % os.getcwd()
resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
g_exportedScripts = info,