Python
TDF LibreOffice Document Liberation Project Blogs communautaires Weblate Nextcloud Redmine Ask LibreOffice Donner
⇐ 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.
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()
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().
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,
#!
#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,