<!DOCTYPE html>
<html lang="es" dir="ltr">
<head>
<base href="../../../../">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Monitorización de los eventos del documento</title>
<link rel="shortcut icon" href="media/navigation/favicon.ico">
<link type="text/css" href="normalize.css" rel="Stylesheet">
<link type="text/css" href="prism.css" rel="Stylesheet">
<link type="text/css" href="default.css" rel="Stylesheet">
<script type="text/javascript" src="polyfills.js"></script><script type="text/javascript" src="languages.js"></script><script type="text/javascript" src="es/langnames.js"></script><script type="text/javascript" src="flexsearch.debug.js"></script><script type="text/javascript" src="prism.js"></script><script type="text/javascript" src="help2.js" defer></script><script type="text/javascript" src="a11y-toggle.js" defer></script><script type="text/javascript" src="paginathing.js" defer></script><script type="text/javascript" src="es/bookmarks.js" defer></script><script type="text/javascript" src="es/contents.js" defer></script><script type="text/javascript" src="help.js" defer></script><meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<body>
<header id="TopLeftHeader"><a class="symbol" href="es/text/shared/05/new_help.html"><div></div></a><a class="logo" href="es/text/shared/05/new_help.html"><p dir="auto">Ayuda de LibreOffice 25.2</p></a><div class="dropdowns"><div class="modules">
<button type="button" data-a11y-toggle="modules-nav" id="modules" aria-haspopup="true" aria-expanded="false" aria-controls="modules-nav">Módulo</button><nav id="modules-nav" hidden=""></nav>
</div></div></header><aside class="leftside"><input id="accordion-1" name="accordion-menu" type="checkbox"><label for="accordion-1" dir="auto">Contenido</label><div id="Contents" class="contents-treeview"></div></aside><div id="SearchFrame"><div id="Bookmarks">
<input id="search-bar" type="search" class="search" placeholder="Buscar en los marcadores del módulo elegido" dir="auto"><div class="nav-container" tabindex="0"><nav class="index" dir="auto"></nav></div>
</div></div>
<div id="DisplayArea" itemprop="softwareHelp" itemscope="true" itemtype="http://schema.org/SoftwareApplication">
<noscript><div id="WarnJS"><h1 dir="auto">Active JavaScript en el navegador para mostrar las páginas de ayuda de LibreOffice.</h1></div></noscript>
<a id="N0526"></a> <meta itemprop="keywords" content="Basic,Monitorización de eventos de documento"> <meta itemprop="keywords" content="Python,Monitorización de eventos de documento"> <meta itemprop="keywords" content="Access2Base,Consola"> <meta itemprop="keywords" content="Access2Base,Traza"> <meta itemprop="keywords" content="API,document.DocumentEvent: Monitorización de eventos de documento"> <meta itemprop="keywords" content="API,document.XDocumentEventBroadcaster: Monitorización de eventos de documento"> <meta itemprop="keywords" content="API,document.XDocumentEventListener: Monitorización de eventos de documento"> <meta itemprop="keywords" content="API,lang.EventObject: Monitorización de eventos de documento">
<a id="pythonmonitor1"></a>
<h1 id="N0527" dir="auto">
<a id="pythonmonitor"></a>Escucha de eventos de documento</h1>
<p id="par_id641630582314861" class="paragraph" dir="auto">Escuchar los eventos del documento puede ser útil en situaciones como las siguientes:</p>
<ul itemprop="Unordered" itemscope="true" itemtype="http://schema.org/ItemList" dir="auto">
<li itemprop="itemListElement" itemscope="true" itemtype="http://schema.org/ItemListUnordered" dir="auto">
<p id="par_id431630582396327" class="listitem" dir="auto">Identificar un nuevo documento en el momento de la apertura, a diferencia de los existentes, y realizar una configuración específica.</p>
</li>
<li itemprop="itemListElement" itemscope="true" itemtype="http://schema.org/ItemListUnordered" dir="auto">
<p id="par_id461630582396782" class="listitem" dir="auto">Controlar el procesamiento de las solicitudes para guardar, copiar o imprimir documentos o para combinar correspondencia.</p>
</li>
<li itemprop="itemListElement" itemscope="true" itemtype="http://schema.org/ItemListUnordered" dir="auto">
<p id="par_id631630582394790" class="listitem" dir="auto">Recalcular la tabla de contenidos, los índices o las entradas de la tabla de un documento del escritos cuando se va a cerrar el documento.</p>
</li>
<li itemprop="itemListElement" itemscope="true" itemtype="http://schema.org/ItemListUnordered" dir="auto">
<p id="par_id601630582398998" class="listitem" dir="auto">Importar los paquetes matemáticos de Python antes de abrir un documento Calc. Liberar estos paquetes cuando el documento se cierra.</p>
</li>
</ul>
<p id="N0528" class="paragraph" dir="auto">Además de <a target="_top" href="es/text/sbasic/shared/01040000.html">asignar macros a eventos</a>, es posible monitorizar los eventos emitidos por los documentos de LibreOffice. Los emisores de API (interfaz de programación de aplicaciones, por sus siglas en inglés) son responsables de llamar a las macros de los eventos. A diferencia de los agentes de escucha, que requieren que se definan todos los métodos admitidos, incluso si estos no se utilizan, los monitores de documento únicamente requieren dos métodos junto a las macros conectadas de eventos.</p>
<h2 id="N0529" dir="auto">Monitorización de los eventos del documento</h2>
<p id="N0530" class="paragraph" dir="auto">A continuación se ilustra la monitorización para los lenguajes Basic y Python mediante la programación orientada a objetos. La asignación de la secuencia de órdenes <span class="literal">OnLoad</span> al evento <span class="menuitem">Abrir documento</span> es suficiente para iniciar y finalizar la monitorización de eventos del documento. La pestaña <span class="menuitem">Eventos</span> del menú <span class="menuitem">Herramientas ▸ Personalizar</span> se utiliza para asignar cualquiera de las dos secuencias de órdenes.</p>
<p id="N0531" class="paragraph" dir="auto">La interceptación de eventos ayuda a establecer las condiciones previas y posteriores de las secuencias de órdenes, como la carga y descarga de bibliotecas o el seguimiento del procesamiento de las secuencias de órdenes en segundo plano. El uso del módulo <span class="literal">Access2Base.Trace</span> ilustra este segundo contexto.</p>
<h3 id="N0532" dir="auto">Con Python</h3>
<a id="bm_id721622446590963"></a> <meta itemprop="keywords" content="API,frame.Desktop: Monitorización de eventos de documento"> <meta itemprop="keywords" content="API,script.provider.MasterScriptProviderFactory: Monitorización de eventos de documento"> <meta itemprop="keywords" content="API,script.provider.XScript: Monitorización de eventos de documento">
<p id="N0533" class="paragraph" dir="auto">La monitorización de eventos inicia desde la instanciación del objeto y termina cuando Python libera el objeto. Los eventos producidos se reportan mediante la consola <span class="literal">Access2Base</span></p>
<div class="note">
<div class="noteicon" dir="auto"><img src="media/icon-themes/res/helpimg/note.svg" alt="note" style="width:40px;height:40px;"></div>
<div class="notetext"><p id="N0534" dir="auto">Los eventos <span class="literal">OnLoad</span> y <span class="literal">OnUnload</span> se pueden utilizar para establecer y restablecer respectivamente la ruta de los programas de Python. Se describen como <span class="menuitem">Abrir documento</span> y <span class="menuitem">Cerrar documento</span>.</p></div>
</div>
<br>
<div class="pycode" itemscope="true" itemtype="http://schema.org/SoftwareSourceCode" itemprop="codeSampleType" content="snippet" data-tooltip="Pulse en el texto para copiarlo en el portapapeles"><pre dir="auto"><code class="language-python line-numbers">
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os.path, uno, unohelper
from com.sun.star.document import DocumentEvent, \
XDocumentEventListener as AdapterPattern
from com.sun.star.lang import EventObject
class UiDocument(unohelper.Base, AdapterPattern):
""" Monitor de eventos del documento """
'''
adaptado de la secuencia de órdenes 'Python script to monitor OnSave event', que se encuentra en:
https://forum.openoffice.org/en/forum/viewtopic.php?t=68887
'''
def __init__(self):
""" Monitor de eventos del documento """
''' Reporta mediante la consola Access2Base.Trace o
reporta en 1.ª hoja, 1.ª columna para documentos de Calc '''
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
desktop = smgr.createInstanceWithContext(
'com.sun.star.frame.Desktop' , ctx)
self.doc = desktop.CurrentComponent
#self.row = 0 # descomentarice solo en documentos de Calc
Console.setLevel("DEBUG")
self.listen() # Inicia seguimiento de eventos del documento
@property
def Filename(self) -> str:
sys_filename = uno.fileUrlToSystemPath(self.doc.URL)
return os.path.basename(sys_filename)
def setCell(self, calcDoc, txt: str):
""" Saca los eventos del documento en la 1ª columna de una hoja de cálculo Calc """
sheet = calcDoc.getSheets().getByIndex(0)
sheet.getCellByPosition(0,self.row).setString(txt)
self.row = self.row + 1
def listen(self, *args): # OnLoad/OnNew, lo antes posible
""" Iniciar la monitorización de los eventos del documento """
self.doc.addDocumentEventListener(self)
Console.log("INFO", "Se están registrando los eventos del documento", True)
def sleep(self, *args): # OnUnload hasta el final (opcional)
""" Detener la monitorización de los eventos del documento """
self.doc.removeDocumentEventListener(self)
Console.log("INFO", "Se han registrado los eventos del documento", True)
def documentEventOccured(self, event: DocumentEvent):
""" Intercepta todos los eventos del documento """
#self.setCell(event.Source, event.EventName) # solo para documentos Calc
Console.log("DEBUG",
event.EventName+" in "+self.Filename,
False)
def disposing(self, event: EventObject):
""" Liberar todas las actividades """
self.sleep()
Console.show()
def OnLoad(*args): # Evento «Abrir documento»
listener = UiDocument() # Inicia la escucha
def OnUnload(*args): # Evento «El documento se ha cerrado»
pass # (opcional) realizado cuando se desecha
g_exportedScripts = (OnLoad,)
from com.sun.star.script.provider import XScript
class Console():
"""
Puesta en primer o segundo plano de la consola para registrar la ejecución del programa.
"""
@staticmethod
def trace(*args,**kwargs):
""" Imprime la lista de elementos libres en la consola """
scr = Console._a2bScript(script='DebugPrint', module='Compatible')
scr.invoke((args),(),())
@staticmethod
def log(level: str, text: str, msgBox=False):
""" Anexar el mensaje de registro a la consola, con indicación opcional al usuario """
scr = Console._a2bScript(script='TraceLog')
scr.invoke((level,text,msgBox),(),())
@staticmethod
def setLevel(logLevel: str):
""" Establecer el límite inferior de los mensajes de registro """
scr = Console._a2bScript(script='TraceLevel')
scr.invoke((logLevel,),(),())
@staticmethod
def show():
""" Mostrar el contenido o un diálogo de la consola """
scr = Console._a2bScript(script='TraceConsole')
scr.invoke((),(),())
@staticmethod
def _a2bScript(script: str, library='Access2Base',
module='Trace') -> XScript:
''' Coge la secuencia de órdenes Basic basada en la aplicación '''
sm = uno.getComponentContext().ServiceManager
mspf = sm.createInstanceWithContext(
"com.sun.star.script.provider.MasterScriptProviderFactory",
uno.getComponentContext())
scriptPro = mspf.createScriptProvider("")
scriptName = "vnd.sun.star.script:"+library+"."+module+"."+script+"?language=Basic&location=application"
xScript = scriptPro.getScript(scriptName)
return xScript
</code></pre></div>
<div class="warning">
<div class="noteicon" dir="auto"><img src="media/icon-themes/res/helpimg/warning.svg" alt="warning" style="width:40px;height:40px;"></div>
<div class="notetext"><p id="N0647" dir="auto">Preste atención al error ortográfico en el método <span class="literal">documentEventOccured</span>, que proviene de la interfaz de programación de aplicaciones (API, por sus siglas en inglés) de LibreOffice.</p></div>
</div>
<br>
<div class="tip">
<div class="noteicon" dir="auto"><img src="media/icon-themes/res/helpimg/tip.svg" alt="Icono de consejo" style="width:40px;height:40px;"></div>
<div class="notetext"><p dir="auto">Los eventos <span class="menuitem">Iniciar aplicación</span> and <span class="menuitem">Cerrar la aplicación</span> pueden ser usados, respectivamente, para establecer o restablecer la ruta a las secuencias de órdenes Python del usuario o de la aplicación LibreOffice. De manera similar, las bibliotecas o los módulos Python incluidos en los documentos pueden ser cargados y liberados mediante los eventos <span class="menuitem">Abrir documento</span> y <span class="menuitem">Documento cerrado</span>. Vea <a target="_top" href="es/text/sbasic/python/python_import.html">Importación de módulos Python</a> para mayores detalles.</p></div>
</div>
<br>
<h3 id="N0649" dir="auto">Con LibreOffice Basic</h3>
<a id="bm_id591622446367707"></a> <meta itemprop="keywords" content="API,GlobalScope.BasicLibraries"> <meta itemprop="keywords" content="Herramientas,Cadenas">
<p id="N0650" class="paragraph" dir="auto">Al usar la pestaña <span class="menuitem">Eventos</span> del menú <span class="menuitem">Herramientas ▸ Personalizar</span>, el evento <span class="menuitem">Abrir documento</span> dispara una inicialización de <span class="literal">ConsoleLogger</span>. La rutina <span class="literal">_documentEventOccured</span>, establecida por <span class="literal">Console Logger</span>, sirve como punto de entrada único para atrapar todos los eventos de documento.</p>
<h4 id="hd_id421630510141729" dir="auto">Módulo controller.Events</h4>
<div class="bascode" itemscope="true" itemtype="http://schema.org/SoftwareSourceCode" itemprop="codeSampleType" content="snippet" data-tooltip="Pulse en el texto para copiarlo en el portapapeles"><pre dir="auto"><code class="language-visual-basic line-numbers">
Option Explicit
Global _obj As Object ' instancia de controller.ConsoleLogger
Sub OnLoad(evt As com.sun.star.document.DocumentEvent) ' >> Abrir documento <<
_obj = New ConsoleLogger : _obj.StartAdapter(evt)
End Sub ' controller.OnLoad
Sub _documentEventOccured(evt As com.sun.star.document.DocumentEvent)
''' Punto de entrada único de ConsoleLogger '''
_obj.DocumentEventOccurs(evt)
End Sub ' controller._documentEventOccured
</code></pre></div>
<h4 id="hd_id721630511986813" dir="auto">Módulo de clase controller.ConsoleLogger</h4>
<p id="par_id901630509435225" class="paragraph" dir="auto">La monitorización de eventos se inicia desde el momento en que se instancia un objeto <span class="literal">ConsoleLogger</span> y finalmente se detiene al cerrar el documento. La rutina <span class="literal">StartAdapter</span> carga las bibliotecas Basic necesarias, mientras que los eventos capturados se reportan mediante el módulo <span class="literal">Access2Base.Trace</span>.</p>
<div class="bascode" itemscope="true" itemtype="http://schema.org/SoftwareSourceCode" itemprop="codeSampleType" content="snippet" data-tooltip="Pulse en el texto para copiarlo en el portapapeles"><pre dir="auto"><code class="language-visual-basic line-numbers">
Option Explicit
Option Compatible
Option ClassModule
' Objeto del patrón de diseño ADAPTER que se instanciará en el evento "Abrir documento".
Private Const UI_PROMPT = True
Private Const UI_NOPROMPT = Falso ' Poner como Verdadero para visualizar los eventos de los documentos
' MIEMBROS
Private _evtAdapter As Object ' com.sun.star.document.XDocumentEventBroadcaster
Private _txtMsg As String ' mensaje de texto para hacer registros en la consola
' PROPIEDADES
Private Property Get FileName As String
''' nombre de archivo dependiente del sistema '''
Const _LIBRARY = "Tools" : With GlobalScope.BasicLibraries
If Not .IsLibraryLoaded(_LIBRARY) Then .LoadLibrary(_LIBRARY)
End With
Filename = Tools.Strings.FilenameOutofPath(ThisComponent.URL)
End Property ' controller.ConsoleLogger.Filename
' MÉTODOS
Public Sub DocumentEventOccurs(evt As com.sun.star.document.DocumentEvent)
''' Monitorizar eventos de documento '''
Access2Base.Trace.TraceLog("DEBUG", _
evt.EventName &" in "& Filename(evt.Source.URL), _
UI_NOPROMPT)
Select Case evt.EventName
Case "OnUnload" : _StopAdapter(evt)
End Select
End Sub ' controller.ConsoleLogger.DocumentEventOccurs
Public Sub StartAdapter(Optional evt As com.sun.star.document.DocumentEvent)
''' Iniciar registro de eventos de documento '''
Const _LIBRARY = "Access2Base" : With GlobalScope.BasicLibraries
If Not .IsLibraryLoaded(_LIBRARY) Then .LoadLibrary(_LIBRARY)
End With : Access2Base.Trace.TraceLevel("DEBUG")
If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
Access2Base.Trace.TraceLog("INFO", _txtMsg & "Se están registrando los eventos del documento", UI_PROMPT)
_evtAdapter = CreateUnoListener( "_", "com.sun.star.document.XDocumentEventListener" )
ThisComponent.addDocumentEventListener( _evtAdapter )
End Sub ' controller.ConsoleLogger.StartAdapter
Private Sub _StopAdapter(Optional evt As com.sun.star.document.DocumentEvent)
''' Terminar el registro de eventos del documento '''
ThisComponent.removeDocumentEventListener( _evtAdapter )
If IsMissing(evt) Then _txtMsg = "" Else _txtMsg = evt.EventName & "-"
Access2Base.Trace.TraceLog("INFO", _txtMsg & "Se registraron los eventos del documento", UI_PROMPT)
Access2Base.Trace.TraceConsole() ' Diálogo con los eventos capturados
End Sub ' controller.ConsoleLogger._StopAdapter
' EVENTOS
' Su código para la gestión de eventos va aquí
</code></pre></div>
<div class="warning">
<div class="noteicon" dir="auto"><img src="media/icon-themes/res/helpimg/warning.svg" alt="warning" style="width:40px;height:40px;"></div>
<div class="notetext"><p id="N0724" dir="auto">Preste atención al error ortográfico en el método <span class="literal">_documentEventOccured</span>, que proviene de la interfaz de programación de aplicaciones (API, por sus siglas en inglés) de LibreOffice.</p></div>
</div>
<br>
<h2 id="N0725" dir="auto">Descubrimiento de eventos de documento</h2>
<a id="bm_id681622445958242"></a> <meta itemprop="keywords" content="API,frame.GlobalEventBroadcaster: Monitorización de eventos del documento">
<p id="N0726" class="paragraph" dir="auto">El objeto API de emisora proporciona la lista de los eventos de los que es responsable:</p>
<h3 id="N0727" dir="auto">Con Python</h3>
<div class="pycode" itemscope="true" itemtype="http://schema.org/SoftwareSourceCode" itemprop="codeSampleType" content="snippet" data-tooltip="Pulse en el texto para copiarlo en el portapapeles"><pre dir="auto"><code class="language-python line-numbers">
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uno, apso_utils as ui
def displayAvailableEvents():
""" Mostrar eventos del documento """
'''
adaptado de DisplayAvailableEvents() por A. Pitonyak
https://forum.openoffice.org/en/forum/viewtopic.php?&t=43689
'''
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.ServiceManager
geb = smgr.createInstanceWithContext(
"com.sun.star.frame.GlobalEventBroadcaster", ctx)
events = geb.Events.getElementNames()
ui.msgbox('; '.join(events))
g_exportedScripts = (displayAvailableEvents,)
</code></pre></div>
<div class="note">
<div class="noteicon" dir="auto"><img src="media/icon-themes/res/helpimg/note.svg" alt="note" style="width:40px;height:40px;"></div>
<div class="notetext"><p id="N0747" dir="auto">La extensión Organizador Alternativo de Secuencias de Órdenes Python o <a target="_blank" href="https://extensions.libreoffice.org/extensions/apso-alternative-script-organizer-for-python">Alternative Python Script Organizer (APSO)</a> se usa para desplegar en pantalla la información de los eventos.</p></div>
</div>
<br>
<h3 id="N0748" dir="auto">Con LibreOffice Basic</h3>
<div class="bascode" itemscope="true" itemtype="http://schema.org/SoftwareSourceCode" itemprop="codeSampleType" content="snippet" data-tooltip="Pulse en el texto para copiarlo en el portapapeles"><pre dir="auto"><code class="language-visual-basic line-numbers">
Sub DisplayAvailableEvents
''' Mostrar eventos del documento '''
Dim geb As Object ' com.sun.star.frame.GlobalEventBroadcaster
Dim events() As String
geb = CreateUnoService("com.sun.star.frame.GlobalEventBroadcaster")
events = geb.Events.ElementNames()
MsgBox Join(events, "; ")
End Sub
</code></pre></div>
<a id="relatedtopics"></a><div class="relatedtopics">
<p class="related" itemprop="mentions" dir="auto"><a id="related"></a><span class="emph">Temas relacionados</span></p>
<div class="relatedbody" itemprop="mentions">
<div class="embedded"><p class="embedded" dir="auto"><a target="_top" href="es/text/sbasic/python/python_listener.html">Creating Event Listeners</a></p></div>
<div class="embedded"><p class="embedded" dir="auto"><a target="_top" href="es/text/sbasic/python/python_import.html">Importar módulos de Python</a></p></div>
<div class="embedded"><p class="embedded" dir="auto"><a target="_top" href="es/text/sbasic/python/python_handler.html">Creación de un controlador de diálogos</a></p></div>
<div class="embedded"><p class="embedded" dir="auto"><a target="_top" href="es/text/sbasic/python/python_examples.html">Ejemplos de programación en Python</a></p></div>
<div class="embedded"><p class="embedded" dir="auto"><a target="_top" href="es/text/sbasic/python/python_programming.html">Programar con secuencias de órdenes en Python</a></p></div>
<div class="embedded"><p class="embedded" dir="auto"><a target="_top" href="es/text/sbasic/python/python_2_basic.html">Llamar macros en Basic desde Python</a></p></div>
</div>
</div>
</div>
<div id="DonationFrame"></div>
<footer><h2 style="text-align: center;"><a href="https://books.libreoffice.org" target="_blank">Libros de LibreOffice</a></h2>
<div class="noteicon" dir="auto" style="display:flex;justify-content:center;flex-wrap:wrap;row-gap:15px;">
<img src="media/navigation/libo-writer.svg" alt="Writer Icon" style="width:60px;height:60px;"><img src="media/navigation/libo-calc.svg" alt="Calc Icon" style="width:60px;height:60px;"><img src="media/navigation/libo-impress.svg" alt="Impress Icon" style="width:60px;height:60px;"><img src="media/navigation/libo-draw.svg" alt="Draw Icon" style="width:60px;height:60px;"><img src="media/navigation/libo-base.svg" alt="Base Icon" style="width:60px;height:60px;"><img src="media/navigation/libo-math.svg" alt="Math Icon" style="width:60px;height:60px;"><img src="media/navigation/libo-symbol-black.svg" alt="Getting Started Icon" style="width:60px;height:60px;">
</div>
<div id="DEBUG" class="debug">
<h3 class="bug">Help content debug info:</h3>
<p dir="auto">This page is: <a href="https://opengrok.libreoffice.org/xref/help/source/text/sbasic/python/python_document_events.xhp" target="_blank">/text/sbasic/python/python_document_events.xhp</a></p>
<p dir="auto">Title is: Monitorización de los eventos del documento</p>
<p id="bm_module" dir="auto"></p>
<p id="bm_system" dir="auto"></p>
<p id="bm_HID" dir="auto"></p>
</div></footer>
</body>
</html>