Difference between revisions of "FR/Documentation/Python/Python as a macro language"

From Apache OpenOffice Wiki
Jump to: navigation, search
 
(14 intermediate revisions by the same user not shown)
Line 1: Line 1:
Pyuno prend en charge le framework de script OpenOffice livré avec OpenOffice 4.1.3. Le support actuel est limité au cadre principal ('' core framework ''), ce qui signifie que l'exécution et l'affectation des macros via la boîte de dialogue standard Tools / Macro fonctionne correctement, mais l'édition et le débogage des macros ne sont pas intégrés dans l'interface utilisateur OpenOffice.org (Simplemenr en raison du manque de ressources pour le développement). Utilisez votre éditeur de texte favori pour créer et modifier des scripts python.
+
Pyuno prend en charge le cadre de script OpenOffice livré avec OpenOffice 4.1.3. Le support actuel est limité au cadre principal ('' core framework ''), ce qui signifie que l'exécution et l'affectation des macros via la boîte de dialogue standard Tools / Macro fonctionne correctement, mais l'édition et le débogage des macros ne sont pas intégrés dans l'interface utilisateur OpenOffice.org (Simplemenr en raison du manque de ressources pour le développement). Utilisez votre éditeur de texte favori pour créer et modifier des scripts python.
  
== Script Location ==
+
== Emplacement des scripts ==
Scripts to be excuted in OpenOffice.org can be stored within the following locations:
+
Les scripts à excuter dans OpenOffice.org peuvent être stockés dans les emplacements suivants:
[[Image:Macro_run_dlg.PNG]]
+
  
===OpenOffice.org's user directory===
+
[[Image:LocalisationScriptsPython.jpg]]
  
This is the standard place for self written python scripts. The script files are simply stored within the file system. The directory location depends on the used OpenOffice.org version and the operating system. Some examples are:
+
=== Répertoire utilisateur de OpenOffice ===
 +
C'est l'endroit standard pour les scripts personnels en python. Les fichiers de script sont simplement stockés dans le système de fichiers. L'emplacement du répertoire dépend de la version utilisée d'OpenOffice et du système d'exploitation. Certains exemples sont:
 
====OpenOffice 2.x====
 
====OpenOffice 2.x====
 
* windows - '''C:\Documents and Settings\<current-user\>Application Data\OpenOffice.org 2.0\user\Scripts\python'''
 
* windows - '''C:\Documents and Settings\<current-user\>Application Data\OpenOffice.org 2.0\user\Scripts\python'''
Line 16: Line 16:
 
* unix - '''~/.openoffice.org/3/user/Scripts/python'''
 
* unix - '''~/.openoffice.org/3/user/Scripts/python'''
  
Note, that the last python subdirectory may need to be created initially. Make sure, the python is completely written lowercase. You can add arbitrary deeply nested subdirectories, the names of these directories are reflected in the UI.  
+
====OpenOffice 4.x====
 +
* windows 7 - 11 '''C:\Users\<current-user>\AppData\Roaming\OpenOffice.org\4\user\Scripts\python'''
 +
* Linux- '''~/.openoffice.org/4/user/Scripts/python'''
 +
Notez que le dernier sous-répertoire python peut avoir besoin d'être créé initialement. Assurez-vous que "python" est entièrement écrit en minuscules. Vous pouvez ajouter des sous-répertoires arbitrairement imbriqués, les noms de ces répertoires sont reflétés dans l'interface utilisateur.
  
Example: The [http://udk.openoffice.org/python/scriptingframework/dynamicDialog.py dynamicDialog.py] file can simply be placed in the above directory. Afterwards, open the ''Tools/Macros/Run macro dialog'' and navigate to the position shown in the above picture. Click on Run to execute the python script, which opens another dialog with a push button and a label field. Clicking the button will increase the number within the label field. The dialog can be closed by pressing ESC.
+
Exemple: le ficher [http://udk.openoffice.org/python/scriptingframework/dynamicDialog.py dynamicDialog.py] peut simplement être placé dans le répertoire ci-dessus. Ensuite, ouvrez la boîte de dialogue '' Outils / Macros / Exécuter macro '' et naviguez jusqu'à la position affichée dans l'image ci-dessus. Cliquez sur Exécuter pour exécuter le script python, qui ouvre une autre boîte de dialogue avec un bouton poussoir et un champ d'étiquette. Cliquez sur le bouton pour augmenter le nombre dans le champ de l'étiquette. La boîte de dialogue peut être fermée en appuyant sur ESC.
  
===OpenOffice.org's share directory===
+
===Dossier partagé de OpenOffice===
 
+
Scripts that shall be shared throughout all users of a concrete OpenOffice.org installation can be stored with the share directory. All default scripts coming with OpenOffice.org are located here. In general, this directory should not be used for script deployment (see later uno-packages).
+
 
+
The script files are simply stored within the file system. The directory location is (like the user directories) depending on the used OpenOffice.org version and the operating system. Some examplaes are:
+
  
 +
Les scripts qui seront partagés entre tous les utilisateurs d'une installation concrète d'OpenOffice.org peuvent être stockés dans ce répertoire de partage. Tous les scripts par défaut venant avec OpenOffice.org sont situés ici. En général, ce répertoire ne doit pas être utilisé pour le déploiement de scripts (voir plus loin les uno-packages).
 +
Les fichiers de script sont simplement stockés dans le système de fichiers. L'emplacement du répertoire (comme les répertoires d'utilisateurs) dépend de la version d'OpenOffice.org utilisée et du système d'exploitation. Quelques exemples :
 
====OpenOffice 2.x====
 
====OpenOffice 2.x====
 
* windows '''C:\Program Files\OpenOffice.org 2.0\share\Scripts\python'''
 
* windows '''C:\Program Files\OpenOffice.org 2.0\share\Scripts\python'''
Line 31: Line 32:
  
 
====OpenOffice 3.x====
 
====OpenOffice 3.x====
* windows 7/64Bit ''C:\Program Files (x86)\OpenOffice.org 3\Basis\share\Scripts\python'''
+
* windows 7/32Bit ''C:\Program Files (x86)\OpenOffice.org 3\Basis\share\Scripts\python'''
 
* ubuntu 10.04 '''/usr/lib/openoffice/basis3.2/share/Scripts/python'''
 
* ubuntu 10.04 '''/usr/lib/openoffice/basis3.2/share/Scripts/python'''
  
===Embedded within an OpenOffice.org's document===
+
====OpenOffice 4.x====
 +
* windows 7-11/64Bit ''C:\Program Files (x86)\OpenOffice.org 4\share\Scripts\python'''
 +
* ubuntu 22.04 /opt/openoffice4/share/Scripts/python/
  
An OpenOffice.org document is a zip-File, which contains different files. Python scripts within documents are stored in Scripts/python subdirectory.
+
===Inclus dans un document OpenOffice===
  
If you want to ship your self written python scripts within a document, you should first develop your scripts in the (above mentioned) user directory and then finally move the scripts into the document with your favorite zip tool. However, note that you must reassign every binding you did before to the script instances in the document. Ideally, you move away the scripts from the user directory and do a regression test on the document's functionality.
+
Un document OpenOffice.org est un fichier zip, qui contient différents fichiers. Les scripts Python dans les documents sont stockés dans le sous-répertoire Scripts / python.
  
After moving the script files into the document, you have to add some lines (boldly printed) to the ''META-INF/manifest.xml'' file:
+
Si vous souhaitez expédier vos scripts personnels en python dans un document, vous devez d'abord développer vos scripts dans le répertoire utilisateur (mentionné ci-dessus), puis enfin déplacer les scripts dans le document avec votre outil préféré zip. Toutefois, notez que vous devez réaffecter toutes les liaisons que vous avez déjà effectuées aux instances de script dans le document. Idéalement, vous écartez les scripts du répertoire utilisateur et effectuez un test de régression sur la fonctionnalité du document.
<source lang=xml>
+
Vous pouvez aussi utiliser l'extension [https://forum.openoffice.org/fr/forum/viewtopic.php?f=18&t=52834 An Other Script Organizer].
 +
 
 +
Après avoir déplacé les fichiers de script dans le document, vous devez ajouter quelques lignes (mises en évidence) au fichier '' META-INF / manifest.xml '':<source lang=xml>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
 
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
Line 57: Line 62:
 
  <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/"/>
 
  <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/"/>
 
  <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/>
 
  <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/>
</manifest:manifest>
+
</manifest:manifest>
 
</source>
 
</source>
When you open the document afterwards, the OpenOffice.org's UI should warn you about script content within the document (when this is not the case, you either have switched off the warning in the options or you did something wrong).
+
Lorsque vous ouvrez le document par la suite, l'interface utilisateur de OpenOffice devrait vous avertir du script contenu dans le document (si ce n'est pas le cas, vous avez désactivé l'avertissement dans les options ou vous avez fait quelque chose de pas bien....).
  
Example:To see how it works, download [[File:Push_me_python4.odt]]. The document contains a push button and a multi line edit control. Pressing the button adds a new line with the current time stamp to the multi line edit control.
+
Exemple: Pour voir comment cela fonctionne, téléchargez [[File: Push_me_python4.odt]]. Le document contient un bouton poussoir et un contrôle d'édition multi lignes. Une pression sur le bouton ajoute une nouvelle ligne avec l'horodatage actuel au contrôle d'édition multi-lignes. Ce fichier ne fonctionne que s'il est enregistré...
  
===Embedded within a uno-package in OpenOffice.org's user directory (read only)===
+
===Incorporé dans un un package, dans le répertoire utilisateur d'OpenOffice (lecture seule)===
  
Often, distributing scripts in documents is not what you want (for instance when you want to modify the application itself or you want to use the same scripts with multiple documents ). Therefor you can place your scripts simply within uno-packages.  
+
Souvent, distribuer des scripts dans des documents n'est pas ce que vous voulez (par exemple lorsque vous souhaitez modifier l'application elle-même ou que vous souhaitez utiliser les mêmes scripts avec plusieurs documents). Pour cela, vous pouvez placer vos scripts simplement dans un package uno.
  
A uno-package is a zip-file. Its name must end with .pkg, otherwise it does not work. file, where you must define the subdirectory (required!) that shall contain scripts. For instance the sample [http://udk.openoffice.org/python/scriptingframework/pyhello2.uno.pkg pyhello2.uno.pkg] has the following file structure:
+
Un package est un fichier zip. Son nom doit se terminer par .pkg (sinon il ne fonctionne pas), Vous devez définir le sous-répertoire (obligatoire!) qui contiendra des scripts. Par exemple, l'exemple [http://udk.openoffice.org/python/scriptingframework/pyhello2.uno.pkg pyhello2.uno.pkg] possède la structure de fichier suivante::
 
<source lang=bash>
 
<source lang=bash>
 
META-INF/
 
META-INF/
Line 74: Line 79:
 
package/hallo.py
 
package/hallo.py
 
</source>
 
</source>
The hallo.py contains the scripts. How to write scripts is explained below. However, in order to make a script work within a uno package, you must add some dummy code.
+
Le fichier hallo.py contient les scripts. Comment écrire des scripts est expliqué ci-dessous. Toutefois, afin de rendre opérationnel un script dans un package uno, vous devez ajouter un code fictif.
 
<source lang=python>
 
<source lang=python>
# ... here is the python script code
+
# ... Voici le code de script python
  
# this must be added to every script file (the
+
# Ceci doit être ajouté à chaque fichier de script (le
# name org.openoffice.script.DummyImplementationForPythonScripts should be changed to something
+
# nom org.openoffice.script.DummyImplementationForPythonScripts doit être changé en quelque chose
# different (must be unique within an office installation !)
+
# de différent (doit être unique dans une installation de bureau!)
# --- faked component, dummy to allow registration with unopkg, no functionality expected
+
# --- composant factice, dummy pour permettre l'enregistrement avec unopkg, aucune fonctionnalité attendue
 
import unohelper
 
import unohelper
 
g_ImplementationHelper = unohelper.ImplementationHelper()
 
g_ImplementationHelper = unohelper.ImplementationHelper()
Line 88: Line 93:
 
     ("org.openoffice.script.DummyServiceForPythonScripts",),)
 
     ("org.openoffice.script.DummyServiceForPythonScripts",),)
 
</source>
 
</source>
By default, every .py-file is interpreted as a UNO component. Not having the above lines within the .py file would raise errors during deployment.  
+
Par défaut, chaque fichier .py est interprété comme un composant UNO. Ne pas placer les lignes ci-dessus dans le fichier .py provoquerait des erreurs lors du déploiement.  
  
The directory name (here package) can be choosen freely. A uno-package with a python script must contain a META-INF/manifest.xml, which needs to point to the freely chosen directory name.
+
Le nom du répertoire (ici le paquet) peut être choisi librement. Un package uno avec un script python doit contenir un META-INF / manifest.xml, qui doit pointer vers le nom du répertoire librement choisi.
 
<source lang=xml>
 
<source lang=xml>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
Line 98: Line 103:
 
</manifest:manifest>
 
</manifest:manifest>
 
</source>
 
</source>
Every user can add packages via the package manager (Tools/Package manager). Note, that content within the package is by design readonly, it is really a pure deployment, not a development mechanism. This might be the reason, why scripts in packages cannot be viewed via Tools/Macros/Organize macros/Python dialog.  
+
Chaque utilisateur peut ajouter des paquets via le gestionnaire de paquetages (Outils/ Gestionnaire des extensions). Notez que le contenu du package est conçu en lecture seule, c'est vraiment un déploiement pur, pas un mécanisme de développement. C'est peut-être la raison pour laquelle les scripts dans les packages ne peuvent pas être consultés via la boîte de dialogue Outils / Macros / Organiser les macros / Python.  
Embedded within a uno-package in OpenOffice.org's share directory (read only)
+
Les packages peuvent être ajoutés par un administrateur à une installation complète de OpenOffice.org, de sorte que chaque utilisateur puisse utiliser les macros situées dans le package. Cela peut être fait avec l'outil unopkg.
 
+
Packages can be added by an administrator to a complete OpenOffice.org installation, so that every user can use run the macros located within the package. This can be done with the unopkg tool.
+
  
 
==Script coding==
 
==Script coding==
A python script within the OpenOffice.org's scripting framework is a function (introduced by the def keyword) within a .py file. For execution via the ''Tools/Macros/Run macro dialog'', the script must have an empty argument list. For typical event listeners, the function must have exactly one argument (the event). In general, the number of arguments depend on the context where the function shall be used. Currently, the .py file must use unix line feeds, this will be changed in future.  
+
Un script python dans la structure de script OpenOffice.org est une fonction (introduite par le mot-clé def) dans un fichier .py. Pour l'exécution via la boîte de dialogue '' Outils / Macros / Exécuter macro '', le script doit avoir une liste d'arguments vide. Pour les Listeners d'événements typiques, la fonction doit avoir exactement un argument (l'événement). En général, le nombre d'arguments dépend du contexte dans lequel la fonction doit être utilisée. Actuellement, le fichier .py doit utiliser des flux de ligne unix, ce qui sera modifié à l'avenir. Le mieux est d'implanter une liste d'arguments variables (*args), qui convient à toutes les situations.
  
A single .py file may contain an arbitrary number of function definitions. By default, all function definitions are exported ( = shown in the macro selection dialog). As this may become tedious, exports can be limited to a smaller set of functions by having a global variable named g_exportedScripts, which is a tuple of function definitions.  
+
Un fichier .py simple peut contenir un nombre arbitraire de définitions de fonction. Par défaut, toutes les définitions de fonctions sont exportées (= affiché dans la boîte de dialogue de sélection des macros). Comme cela peut devenir fastidieux, les exportations peuvent être limitées à un plus petit ensemble de fonctions en ayant une variable globale nommée g_exportedScripts, qui est un tuple de définitions de fonction.
  
At the current integration level, .py files can only import python modules which are within the python PYTHONPATH. By default this is just the python runtime with its standard libraries and the uno bridge files. This means that python macros cannot reference other python macro files. This limitation may be changed in future but exists currently. Python macros can, of course, import from any module you place in the PYTHONPATH; but you must do that yourself and the results will not be portable.
+
Au niveau d'intégration actuel, les fichiers .py ne peuvent importer que des modules python qui se trouvent dans le PYTHONPATH python. Par défaut, ce n'est que le runtime python avec ses bibliothèques standard et les fichiers passerelle uno. Cela signifie que les macros python ne peuvent pas référencer d'autres fichiers de macro python. Cette limitation peut être modifiée à l'avenir mais existe actuellement. Les macros Python peuvent, bien sûr, importer à partir de n'importe quel module que vous placez dans PYTHONPATH; Mais vous devez le faire vous-même et les résultats ne seront pas portables
 +
''(Un lecteur se demande: le pythonloader ne pouvait pas ajouter automatiquement les scripts OOo à PYTHONPATH?)''
  
''(a reader wonders: couldn't the pythonloader automatically append the OOo scripting dirs to PYTHONPATH?)''
+
Avant d'exécuter le code source dans le module, la variable globale XSCRIPTCONTEXT est insérée comme variable globale dans le module (cette variable existe également pour javascript et beanshell, elle est proposée ici pour des raisons de cohérence). Elle a trois membres (Document, Desktop et ComponentContext).
  
Before executing the source code within the module, the global variable XSCRIPTCONTEXT is inserted as global variable within the module (this variable also exists e.g. for javascript and beanshell, it is offered here for consistency reasons). It has three members (Document,Desktop and ComponentContext).  
+
Le commentaire d'une fonction (introduit et terminé par trois ") est présenté comme une description dans la boîte de dialogue de sélection des macros.  
  
The comment of a function (introduced and ended by three ") is shown as description in the macros' selection dialog.
+
Les fichiers de script python compilés ne sont pas ajoutés à sys.modules. Il peut exister plusieurs instances du même module en même temps
 
+
Exemple:
The compiled python script files are not added to sys.modules. There may exist multiple instances of the same module at the same time.
+
Example:
+
 
<source lang=python>  
 
<source lang=python>  
# HelloWorld python script for the scripting framework
+
# Hello World script python pour le cadre de script
  
 
def HelloWorldPython( ):
 
def HelloWorldPython( ):
     """Prints the string 'Hello World(in Python)' into the current document"""
+
     """Ecrit la chaîne 'Hello World (en Python)' dans le document actuel"""
     #get the doc from the scripting context which is made available to all scripts
+
     # Obtient le document à partir du contexte de script qui est mis à la disposition de tous les scripts
 
     model = XSCRIPTCONTEXT.getDocument()
 
     model = XSCRIPTCONTEXT.getDocument()
 
     text = model.Text
 
     text = model.Text
 
     cursor = text.createTextCursor()
 
     cursor = text.createTextCursor()
     text.insertString( cursor, "Hello World(in Python)", 0 )
+
     text.insertString( cursor, "Hello World(en Python)", 0 )
 
</source>
 
</source>
==Error handling and debugging==
 
Errors during compilation or execution of the scripts are passed as exceptions to the scripting framework where possible. The scripting framework in general opens a popup box and displays the message of the thrown exception.
 
  
However, sometimes this is not possible and an error gets silently ignored. The user realizes these errors, when
+
==Gestion des erreurs et débogage==
* his python script file does not appear where it is expected to be
+
Les erreurs lors de la compilation ou de l'exécution des scripts sont transmises en tant qu'exceptions au cadre de script lorsque cela est possible. Le cadre de script en général ouvre une boîte contextuelle et affiche le message de l'exception projetée.  
* the name of the script file appears, but it does not contain any scripts
+
* only part of the script gets executed.
+
  
You can get to know these problems by changing some flags in the '''OpenOffice.org 3/Basis/program/pythonscript.py''' file :
+
Cependant, parfois cela n'est pas possible et une erreur est ignorée. L'utilisateur réalise ces erreurs, lorsque
 +
* Son fichier script python n'apparaît pas là où il devrait être
 +
* Le nom du fichier de script apparaît, mais il ne contient aucun script
 +
* Seule une partie du script est exécutée
 +
 
 +
Vous pouvez connaître ces problèmes en modifiant certains drapeaux dans le fichier '''OpenOffice.org 4/program/pythonscript.py''':
  
 
<source lang=python>
 
<source lang=python>
 
# Configuration ----------------------------------------------------
 
# Configuration ----------------------------------------------------
LogLevel.use = LogLevel.NONE                # alternavly use LogLevel.ERROR or LogLevel.DEBUG
+
LogLevel.use = LogLevel.NONE                # Utilisez alternativement LogLevel.ERROR ou LogLevel.DEBUG
LOG_STDOUT = False                          # True, writes to stdout
+
LOG_STDOUT = False                          # True, écrit sur stdout
                                             # False, writes to user/Scripts/python/log.txt
+
                                             # False, écrit dans user/Scripts/python/log.txt
ENABLE_EDIT_DIALOG=False                    # offers a minimal editor for editing.
+
ENABLE_EDIT_DIALOG=False                    # Offre un éditeur minimal pour l'édition.
 
</source>
 
</source>
Attaching a python debugger is currently not supported.
+
La connexion d'un débogueur python n'est actuellement pas prise en charge.
  
 
==Credits==
 
==Credits==
The python binding of the scripting framework is developed and maintained by Joerg Budischewski in his spare time. Many, many thanks to Tomas O'Connor from Sun for his great support and his code additions to the framework which made this binding possible. Please put low level questions about the binding to api@openoffice.apache.org.
+
La liaison python du cadre de script est développée et maintenue par Joerg Budischewski dans son temps libre. Beaucoup, beaucoup de mercis à Tomas O'Connor de Sun pour son grand appui et ses ajouts de code au cadre qui a rendu cette liaison possible. Veuillez poser des questions de bas niveau sur la liaison à api@openoffice.apache.org.
 
+
 
[[Category:Python]]
 
[[Category:Python]]
 
[[Category:Uno]]
 
[[Category:Uno]]

Latest revision as of 12:39, 9 April 2023

Pyuno prend en charge le cadre de script OpenOffice livré avec OpenOffice 4.1.3. Le support actuel est limité au cadre principal ( core framework ), ce qui signifie que l'exécution et l'affectation des macros via la boîte de dialogue standard Tools / Macro fonctionne correctement, mais l'édition et le débogage des macros ne sont pas intégrés dans l'interface utilisateur OpenOffice.org (Simplemenr en raison du manque de ressources pour le développement). Utilisez votre éditeur de texte favori pour créer et modifier des scripts python.

Emplacement des scripts

Les scripts à excuter dans OpenOffice.org peuvent être stockés dans les emplacements suivants:

LocalisationScriptsPython.jpg

Répertoire utilisateur de OpenOffice

C'est l'endroit standard pour les scripts personnels en python. Les fichiers de script sont simplement stockés dans le système de fichiers. L'emplacement du répertoire dépend de la version utilisée d'OpenOffice et du système d'exploitation. Certains exemples sont:

OpenOffice 2.x

  • windows - C:\Documents and Settings\<current-user\>Application Data\OpenOffice.org 2.0\user\Scripts\python
  • unix - ~/.openoffice.org.2.0/user/Scripts/python, ~/.openoffice.org.2.0/user/Scripts/python

OpenOffice 3.x

  • windows 7 - C:\Users\<current-user>\AppData\Roaming\OpenOffice.org\3\user\Scripts\python
  • unix - ~/.openoffice.org/3/user/Scripts/python

OpenOffice 4.x

  • windows 7 - 11 C:\Users\<current-user>\AppData\Roaming\OpenOffice.org\4\user\Scripts\python
  • Linux- ~/.openoffice.org/4/user/Scripts/python

Notez que le dernier sous-répertoire python peut avoir besoin d'être créé initialement. Assurez-vous que "python" est entièrement écrit en minuscules. Vous pouvez ajouter des sous-répertoires arbitrairement imbriqués, les noms de ces répertoires sont reflétés dans l'interface utilisateur.

Exemple: le ficher dynamicDialog.py peut simplement être placé dans le répertoire ci-dessus. Ensuite, ouvrez la boîte de dialogue Outils / Macros / Exécuter macro et naviguez jusqu'à la position affichée dans l'image ci-dessus. Cliquez sur Exécuter pour exécuter le script python, qui ouvre une autre boîte de dialogue avec un bouton poussoir et un champ d'étiquette. Cliquez sur le bouton pour augmenter le nombre dans le champ de l'étiquette. La boîte de dialogue peut être fermée en appuyant sur ESC.

Dossier partagé de OpenOffice

Les scripts qui seront partagés entre tous les utilisateurs d'une installation concrète d'OpenOffice.org peuvent être stockés dans ce répertoire de partage. Tous les scripts par défaut venant avec OpenOffice.org sont situés ici. En général, ce répertoire ne doit pas être utilisé pour le déploiement de scripts (voir plus loin les uno-packages). Les fichiers de script sont simplement stockés dans le système de fichiers. L'emplacement du répertoire (comme les répertoires d'utilisateurs) dépend de la version d'OpenOffice.org utilisée et du système d'exploitation. Quelques exemples :

OpenOffice 2.x

  • windows C:\Program Files\OpenOffice.org 2.0\share\Scripts\python
  • unix /usr/lib/openoffice/share/Scripts/python

OpenOffice 3.x

  • windows 7/32Bit C:\Program Files (x86)\OpenOffice.org 3\Basis\share\Scripts\python'
  • ubuntu 10.04 /usr/lib/openoffice/basis3.2/share/Scripts/python

OpenOffice 4.x

  • windows 7-11/64Bit C:\Program Files (x86)\OpenOffice.org 4\share\Scripts\python'
  • ubuntu 22.04 /opt/openoffice4/share/Scripts/python/

Inclus dans un document OpenOffice

Un document OpenOffice.org est un fichier zip, qui contient différents fichiers. Les scripts Python dans les documents sont stockés dans le sous-répertoire Scripts / python.

Si vous souhaitez expédier vos scripts personnels en python dans un document, vous devez d'abord développer vos scripts dans le répertoire utilisateur (mentionné ci-dessus), puis enfin déplacer les scripts dans le document avec votre outil préféré zip. Toutefois, notez que vous devez réaffecter toutes les liaisons que vous avez déjà effectuées aux instances de script dans le document. Idéalement, vous écartez les scripts du répertoire utilisateur et effectuez un test de régression sur la fonctionnalité du document. Vous pouvez aussi utiliser l'extension An Other Script Organizer.

Après avoir déplacé les fichiers de script dans le document, vous devez ajouter quelques lignes (mises en évidence) au fichier META-INF / manifest.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
 <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.text" manifest:full-path="/"/>
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Pictures/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/>
 <manifest:file-entry :media-type="text/xml" manifest:full-path="styles.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/thumbnail.png"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/python/push_me.py"/>
 <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/"/>
 <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/>
 </manifest:manifest>

Lorsque vous ouvrez le document par la suite, l'interface utilisateur de OpenOffice devrait vous avertir du script contenu dans le document (si ce n'est pas le cas, vous avez désactivé l'avertissement dans les options ou vous avez fait quelque chose de pas bien....).

Exemple: Pour voir comment cela fonctionne, téléchargez File:Push me python4.odt. Le document contient un bouton poussoir et un contrôle d'édition multi lignes. Une pression sur le bouton ajoute une nouvelle ligne avec l'horodatage actuel au contrôle d'édition multi-lignes. Ce fichier ne fonctionne que s'il est enregistré...

Incorporé dans un un package, dans le répertoire utilisateur d'OpenOffice (lecture seule)

Souvent, distribuer des scripts dans des documents n'est pas ce que vous voulez (par exemple lorsque vous souhaitez modifier l'application elle-même ou que vous souhaitez utiliser les mêmes scripts avec plusieurs documents). Pour cela, vous pouvez placer vos scripts simplement dans un package uno.

Un package est un fichier zip. Son nom doit se terminer par .pkg (sinon il ne fonctionne pas), Vous devez définir le sous-répertoire (obligatoire!) qui contiendra des scripts. Par exemple, l'exemple pyhello2.uno.pkg possède la structure de fichier suivante::

META-INF/
META-INF/manifest.xml
package/
package/hallo.py

Le fichier hallo.py contient les scripts. Comment écrire des scripts est expliqué ci-dessous. Toutefois, afin de rendre opérationnel un script dans un package uno, vous devez ajouter un code fictif.

# ... Voici le code de script python
 
# Ceci doit être ajouté à chaque fichier de script (le
# nom org.openoffice.script.DummyImplementationForPythonScripts doit être changé en quelque chose
# de différent (doit être unique dans une installation de bureau!)
# --- composant factice, dummy pour permettre l'enregistrement avec unopkg, aucune fonctionnalité attendue
import unohelper
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
	None,"org.openoffice.script.DummyImplementationForPythonScripts", \
    ("org.openoffice.script.DummyServiceForPythonScripts",),)

Par défaut, chaque fichier .py est interprété comme un composant UNO. Ne pas placer les lignes ci-dessus dans le fichier .py provoquerait des erreurs lors du déploiement.

Le nom du répertoire (ici le paquet) peut être choisi librement. Un package uno avec un script python doit contenir un META-INF / manifest.xml, qui doit pointer vers le nom du répertoire librement choisi.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
<manifest:file-entry manifest:media-type="application/vnd.sun.star.framework-script" manifest:full-path="package"/>
</manifest:manifest>

Chaque utilisateur peut ajouter des paquets via le gestionnaire de paquetages (Outils/ Gestionnaire des extensions). Notez que le contenu du package est conçu en lecture seule, c'est vraiment un déploiement pur, pas un mécanisme de développement. C'est peut-être la raison pour laquelle les scripts dans les packages ne peuvent pas être consultés via la boîte de dialogue Outils / Macros / Organiser les macros / Python. Les packages peuvent être ajoutés par un administrateur à une installation complète de OpenOffice.org, de sorte que chaque utilisateur puisse utiliser les macros situées dans le package. Cela peut être fait avec l'outil unopkg.

Script coding

Un script python dans la structure de script OpenOffice.org est une fonction (introduite par le mot-clé def) dans un fichier .py. Pour l'exécution via la boîte de dialogue Outils / Macros / Exécuter macro , le script doit avoir une liste d'arguments vide. Pour les Listeners d'événements typiques, la fonction doit avoir exactement un argument (l'événement). En général, le nombre d'arguments dépend du contexte dans lequel la fonction doit être utilisée. Actuellement, le fichier .py doit utiliser des flux de ligne unix, ce qui sera modifié à l'avenir. Le mieux est d'implanter une liste d'arguments variables (*args), qui convient à toutes les situations.

Un fichier .py simple peut contenir un nombre arbitraire de définitions de fonction. Par défaut, toutes les définitions de fonctions sont exportées (= affiché dans la boîte de dialogue de sélection des macros). Comme cela peut devenir fastidieux, les exportations peuvent être limitées à un plus petit ensemble de fonctions en ayant une variable globale nommée g_exportedScripts, qui est un tuple de définitions de fonction.

Au niveau d'intégration actuel, les fichiers .py ne peuvent importer que des modules python qui se trouvent dans le PYTHONPATH python. Par défaut, ce n'est que le runtime python avec ses bibliothèques standard et les fichiers passerelle uno. Cela signifie que les macros python ne peuvent pas référencer d'autres fichiers de macro python. Cette limitation peut être modifiée à l'avenir mais existe actuellement. Les macros Python peuvent, bien sûr, importer à partir de n'importe quel module que vous placez dans PYTHONPATH; Mais vous devez le faire vous-même et les résultats ne seront pas portables (Un lecteur se demande: le pythonloader ne pouvait pas ajouter automatiquement les scripts OOo à PYTHONPATH?)

Avant d'exécuter le code source dans le module, la variable globale XSCRIPTCONTEXT est insérée comme variable globale dans le module (cette variable existe également pour javascript et beanshell, elle est proposée ici pour des raisons de cohérence). Elle a trois membres (Document, Desktop et ComponentContext).

Le commentaire d'une fonction (introduit et terminé par trois ") est présenté comme une description dans la boîte de dialogue de sélection des macros.

Les fichiers de script python compilés ne sont pas ajoutés à sys.modules. Il peut exister plusieurs instances du même module en même temps Exemple:

 
# Hello World script python pour le cadre de script
 
def HelloWorldPython( ):
    """Ecrit la chaîne 'Hello World (en Python)' dans le document actuel"""
    # Obtient le document à partir du contexte de script qui est mis à la disposition de tous les scripts
    model = XSCRIPTCONTEXT.getDocument()
    text = model.Text
    cursor = text.createTextCursor()
    text.insertString( cursor, "Hello World(en Python)", 0 )

Gestion des erreurs et débogage

Les erreurs lors de la compilation ou de l'exécution des scripts sont transmises en tant qu'exceptions au cadre de script lorsque cela est possible. Le cadre de script en général ouvre une boîte contextuelle et affiche le message de l'exception projetée.

Cependant, parfois cela n'est pas possible et une erreur est ignorée. L'utilisateur réalise ces erreurs, lorsque

  • Son fichier script python n'apparaît pas là où il devrait être
  • Le nom du fichier de script apparaît, mais il ne contient aucun script
  • Seule une partie du script est exécutée

Vous pouvez connaître ces problèmes en modifiant certains drapeaux dans le fichier OpenOffice.org 4/program/pythonscript.py:

# Configuration ----------------------------------------------------
LogLevel.use = LogLevel.NONE                # Utilisez alternativement LogLevel.ERROR ou LogLevel.DEBUG
LOG_STDOUT = False                          # True, écrit sur stdout
                                            # False, écrit dans user/Scripts/python/log.txt
ENABLE_EDIT_DIALOG=False                    # Offre un éditeur minimal pour l'édition.

La connexion d'un débogueur python n'est actuellement pas prise en charge.

Credits

La liaison python du cadre de script est développée et maintenue par Joerg Budischewski dans son temps libre. Beaucoup, beaucoup de mercis à Tomas O'Connor de Sun pour son grand appui et ses ajouts de code au cadre qui a rendu cette liaison possible. Veuillez poser des questions de bas niveau sur la liaison à api@openoffice.apache.org.

Personal tools