Macros

From The Document Foundation Wiki
< Macros‎ | Python Guide‎ | fr‎ | Guide
Jump to: navigation, search

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 MAC OS X
     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)
Résultat de l'exécution de la macro info.py

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)
Résultat de l'exécution de la macro info.py

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)
Résultat de l'exécution de la macro info.py

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)
Résultat de l'exécution de la macro info.py

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)
Résultat de l'exécution de la macro info.py

Code complet d'affichage d'informations du système

Résultat de l'exécution de la macro info.py
 #!
 #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,

Principes généraux | Boites de dialogue