Python

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

Boites de dialogue |Table des matières| Traitement de texte

Gestion de l'interface

La fenêtre d'affichage

Afficher une fenêtre vide

Nous abordons ici le code de base pour créer une simple fenêtre d'affichage pour une interface graphique.

Exécution de la macro fenêtre_vide.py

Le code complet de la macro fenetre_vide.py :

#!
#coding: utf8
#Macro: fenetre_vide.py
#Objectif: Affiche une fenêtre vide active avec comme titre la suite bureautique
#Auteur: Franc SERRES
#Licence: https://www.gnu.org/licenses/gpl-3.0.fr.html

import os, sys, traceback
import uno
from com.sun.star.beans import PropertyValue

def affiche():
    #Définition des paramètres pour la récupération de la configuration de la suite bureautique
    prop = PropertyValue()
    prop.Name = 'nodepath'
    prop.Value = '/org.openoffice.Setup/Product'
    paramètres = (prop,)
    #Récupération du contexte de la suite bureautique
    ctx = uno.getComponentContext()
    #Création d'une instance de gestion de la configuration
    configuration = ctx.ServiceManager.createInstanceWithContext(
        'com.sun.star.configuration.ConfigurationProvider', ctx)
    #Création d'une instance de gestion des informations de configuration
    informations = configuration.createInstanceWithArguments( 
        'com.sun.star.configuration.ConfigurationAccess', paramètres)
    #Récupération du nom de la suite bureautique
    bureautique = informations.getByName('ooName')
    #Récupération de la version de la suite
    révision = informations.getByName('ooSetupVersionAboutBox')
    
    #Création d'une instance de modèle de fenêtre
    modèlefenêtre = ctx.ServiceManager.createInstance('com.sun.star.awt.UnoControlDialogModel')
    #Définition de ses dimentions
    #Largeur
    modèlefenêtre.Width = 300
    #Hauteur
    modèlefenêtre.Height = 175
    # Titre de la fenêtre
    modèlefenêtre.Title = bureautique + ' ' + révision
    #
    #Création d'une instance de fenêtre
    fenêtredialogue = ctx.ServiceManager.createInstance('com.sun.star.awt.UnoControlDialog')
    #Affectation du modèle de fenêtre
    fenêtredialogue.setModel(modèlefenêtre)
    #
    #Création de l'instance des éléments de base de gestion d'une fenêtre
    interface = ctx.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
    #Affectation des éléments de base à la fenêtre
    fenêtredialogue.createPeer(interface,None)
    # Création de la fenêtre
    fenêtredialogue.execute()

g_exportedScripts = affiche,

Afficher une fenêtre modale

Une fenêtre modale est, dans une interface graphique, une fenêtre qui prend le contrôle total du clavier et de l'écran.

À quoi cela sert-il ?

Dans une macro nous voulons qu'une interface graphique (une fenêtre ou une boite de dialogue) prenne le contrôle du clavier et de la souris. Le programme parent intérompt son exécution et attend la fin de la fenêtre modale ou le retour d'un résultat de fin de son exécution.

C'est à dire, par exemple comme dans une boite d'information où le programme attent une réponse impérative (oui/non).

Il est alors impossible d'avoir le focus sur la fenêtre ou la boite de dialogue du père.

Dans notre code python ceci est possible au moment de la création de notre fenêtre lorsque nous créons l'object avec la méthode .execute() Celle-ci exécute l'objet comme un enfant qui prend le contrôle du clavier et de la souris.

fenêtredialogue.execute()
Exécution de la macro fenêtre_modale.py
Fermeture de la fenêtre
Fermeture de la boite de dialogue

Le code complet de la macro fenetre_modale.py :

#!
#coding: utf8
#Macro: fenetre_modale.py
#Objectif: Affiche une fenêtre vide avec comme titre la suite bureautique et une boite de dialogue avec le titre «Terminer»
#Auteur: Franc SERRES
#Licence: https://www.gnu.org/licenses/gpl-3.0.fr.html

import os, sys, traceback
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_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 afficheFenêtre(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'intérogation : 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()
    fenêtremessage = boîteàoutils.createMessageBox(fenêtre, typedeboite, typedebouton, titreboîteàmessage, messageboîte)
    return fenêtremessage.execute()

def affiche():
    try:
        prop = PropertyValue()
        prop.Name = 'nodepath'
        prop.Value = '/org.openoffice.Setup/Product'
        properties = (prop,)
        ctx = uno.getComponentContext()
        configuration = ctx.ServiceManager.createInstanceWithContext(
            'com.sun.star.configuration.ConfigurationProvider', ctx)
        informations = configuration.createInstanceWithArguments( 
            'com.sun.star.configuration.ConfigurationAccess', properties)
        bureautique = informations.getByName('ooName')
        révision = informations.getByName('ooSetupVersionAboutBox')
        modèlefenêtre = ctx.ServiceManager.createInstance('com.sun.star.awt.UnoControlDialogModel')
        # Size of Dialog
        modèlefenêtre.Width = 300
        modèlefenêtre.Height = 175
        # Title of Dialog
        modèlefenêtre.Title = bureautique + ' ' + révision
        #
        # Create the dialog and set the model
        fenêtredialogue = ctx.ServiceManager.createInstance('com.sun.star.awt.UnoControlDialog')
        fenêtredialogue.setModel(modèlefenêtre)
        #
        # Create a fenêtre and then tell the dialog to use the created fenêtre.
        affichage = ctx.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
        fenêtredialogue.createPeer(affichage,None)             # None : OK / none : NG
        # Dialog
        fenêtredialogue.execute()
        texte = 'Vous venez de créer la fenêtre vide modale'

    except Exception as er:
        texte = str(traceback.format_exc()) + '\n' + str(er)
    finally:
        afficheFenêtre(texte,'Résultat')
    afficheFenêtre('Pour afficher cette boite de dialogue vous avez été obligé de fermer la fenêtre vide\n Cliquez sur OK pour terminer l\'exécution du programme','Terminer')
    
g_exportedScripts = affiche,

Afficher une fenêtre non-modale

Nous voulons parfois dans une macro que plusieurs fenêtres s'exécutent en même temps. Par exemple comme une fenêtre principale et des boîtes d'outils flottants.

Pour y arriver la fenêtre principale se crée avec la méthode .execute(). Mais les autres fenêtres sont créées en amont de son appel et activées avec la méthode .setVisible(). L'utilisateur peux alors passer d'une fenêtre à l'autre grâce au focus qui va basculer la capture du clavier et de la souris.


fenêtreoutils.setVisible(True)

fenêtreprincipale.execute().
Exécution de la macro fenêtre_non_modale.py
Fermeture de la boite de dialogue


Le code complet de la macro fenetre_non_modale.py :

#!
#coding: utf8
#Macro: fenetre_non_modale.py
#Objectif: Affiche une fenêtre vide active avec comme titre la suite bureautique et une boite de dialogue avec le titre «Attente»
#Auteur: Franc SERRES
#Licence: https://www.gnu.org/licenses/gpl-3.0.fr.html

import os, sys, traceback
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_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 afficheFenêtre(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'intérogation : 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()
    fenêtremessage = boîteàoutils.createMessageBox(fenêtre, typedeboite, typedebouton, titreboîteàmessage, messageboîte)
    return fenêtremessage.execute()

def affiche():
    try:
        prop = PropertyValue()
        prop.Name = 'nodepath'
        prop.Value = '/org.openoffice.Setup/Product'
        properties = (prop,)
        ctx = uno.getComponentContext()
        configuration = ctx.ServiceManager.createInstanceWithContext(
            'com.sun.star.configuration.ConfigurationProvider', ctx)
        informations = configuration.createInstanceWithArguments( 
            'com.sun.star.configuration.ConfigurationAccess', properties)
        bureautique = informations.getByName('ooName')
        révision = informations.getByName('ooSetupVersionAboutBox')
        modèlefenêtre = ctx.ServiceManager.createInstance('com.sun.star.awt.UnoControlDialogModel')
        # Size of Dialog
        modèlefenêtre.Width = 300
        modèlefenêtre.Height = 175
        # Title of Dialog
        modèlefenêtre.Title = bureautique + ' ' + révision
        #
        # Create the dialog and set the model
        fenêtredialogue = ctx.ServiceManager.createInstance('com.sun.star.awt.UnoControlDialog')
        fenêtredialogue.setModel(modèlefenêtre)
        #
        # Create a fenêtre and then tell the dialog to use the created fenêtre.
        affichage = ctx.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
        fenêtredialogue.createPeer(affichage,None)             # None : OK / none : NG
        # Dialog
        fenêtredialogue.setVisible(True)
        texte = 'Vous venez de créer la fenêtre vide non modale'

    except Exception as er:
        texte = str(traceback.format_exc()) + '\n' + str(er)
    finally:
        afficheFenêtre(texte,'Résultat')
    afficheFenêtre('La fenêtre et la boîte de dialogue ont un focus distinct\nCliquez sur OK pour terminer l\'exécution du programme','Attente')
g_exportedScripts = affiche,

Afficher un menu

Macro Fenêtre avec menu
#!
#coding: utf8
#Macro: fenetre_vide.py
#Objectif: Affiche une fenêtre vide active avec comme titre la suite bureautique
#Auteur: Franc SERRES
#Licence: https://www.gnu.org/licenses/gpl-3.0.fr.html

import uno

#Librairies pour avoir des informations système
#import os, sys, traceback
from com.sun.star.beans import PropertyValue, NamedValue

#Librairies de gestion des fenêtres
from com.sun.star.awt import Rectangle, WindowDescriptor
#from com.sun.star.frame import XController
#from com.sun.star.awt.WindowClass import TOP, MODALTOP, CONTAINER, SIMPLE
#from com.sun.star.awt.WindowAttribute import SHOW, FULLSIZE, OPTIMUMSIZE, MINSIZE, BORDER, SIZEABLE, MOVEABLE, CLOSEABLE, SYSTEMDEPENDENT, NODECORATION
#from com.sun.star.awt.PosSize import PS_POSSIZE

#Librairies de Gestion des menus
#from com.sun.star.awt.MenuItemStyle import AUTOCHECK, CHECKABLE, RADIOCHECK
#from com.sun.star.awt import XMenuListener
#from com.sun.star.lang import XEventListener

#global event

#Fonctions de débuggage
# MRI - API Explorer
def mri (ctx, xCible):
    try:
        xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx)
        xMri.inspect(xCible)
    except:
        raise _rtex("\L'extension Python MRI n'est pas installée", uno.getComponentContext())

def getConfigSetting (sNodeConfig, bUpdate):
    "get a configuration node"
    # example: xNode = getConfigSetting( "/org.openoffice.Office.Common/Path/Current", False)
    xSvMgr = uno.getComponentContext().ServiceManager
    xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext())
    xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue")
    xPropertyValue.Name = "nodepath"
    xPropertyValue.Value = sNodeConfig
    if bUpdate:
        sService = "com.sun.star.configuration.ConfigurationUpdateAccess"
    else:
        sService = "com.sun.star.configuration.ConfigurationAccess"
    xNode = xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,))
    return xNode

def info():
    pass

def affiche():
    #Définition des paramètres pour la récupération de la configuration de la suite bureautique
    prop = PropertyValue()
    prop.Name = 'nodepath'
    prop.Value = '/org.openoffice.Setup/Product'
    paramètres = (prop,)
    #Récupération du contexte de la suite bureautique
    ctx = XSCRIPTCONTEXT.getComponentContext()
    #récupération du gestionaire de services
    smgr =ctx.getServiceManager()
    #Création d'une instace bureautique dans le contexte
    desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
    #Création d'un cadre MonCadre dans le contexte
    frame = smgr.createInstanceWithContext('com.sun.star.frame.TaskCreator', ctx).createInstanceWithArguments((NamedValue('FrameName', 'MonCadre'), NamedValue('PosSize', Rectangle(100, 100, 400, 500))))
    #Récupération de sa fenêtre
    window = frame.getContainerWindow()
    #Affichage de la fenêtre
    window.setVisible(True)
    #Modification de son titre
    frame.setTitle('Mon titre')
    #Affecte le contener parent de la frame
    frame.setCreator(desktop)
    #Ajout de la frame à la liste des frames du contener parent
    desktop.getFrames().append(frame)
    #Récupération des outils de gestion de la fenêtre
    toolkit = window.getToolkit()
    #Création d'une instance de bare de menu dans le contexte
    menubar = smgr.createInstanceWithContext('com.sun.star.awt.MenuBar',ctx)
    #Suppression de ses valeurs par défaut
    menubar.removeItem(0,menubar.getItemCount())
    #Ajout des entrées de menus
    menubar_insert = menubar.insertItem
    file_menu = menubar_insert(0,'~Fichier',0,0)
    edit_menu = menubar_insert(1,'~Editer',0,1)
    about_menu = menubar_insert(2,'~Apropos',0,2)
    menubar.setCommand(2,'info')
    #Listener du menu
    #Affectation du menu
    window.setMenuBar(menubar)
    mri(ctx, menubar)
    if cmd_arguments == '--close-window':
        window.setVisible(False)
    #elif cmd_arguments == '--close-office':
    #    mri(ctx, menubar)

g_exportedScripts = affiche,

Afficher une barre d'outils

Afficher des widgets

Afficher un label

Afficher des boutons

Afficher une barre de progression

Afficher une zone d'édition

Afficher des boutons de sélection

Afficher des boutons radio

Afficher une liste de sélection

Afficher une boite liste

Afficher un champ date

Afficher un champ heures

Afficher un champ sélection de fichier

Boites de dialogue | Traitement de texte