diff --git a/doc/content/es/calc/_index.md b/doc/content/es/calc/_index.md index a9c1069..8e09b8b 100644 --- a/doc/content/es/calc/_index.md +++ b/doc/content/es/calc/_index.md @@ -1,6 +1,6 @@ +++ title = "Calc" -weight = 5 +weight = 6 +++ #### Trabajar con Calc diff --git a/doc/content/es/dialog/_index.md b/doc/content/es/dialog/_index.md index 7934e68..0360246 100644 --- a/doc/content/es/dialog/_index.md +++ b/doc/content/es/dialog/_index.md @@ -1,6 +1,6 @@ +++ title = "Cuadros de diálogo" -weight = 6 +weight = 20 +++ #### Trabajar con cuadros de diálogo diff --git a/doc/content/es/documents/_index.md b/doc/content/es/documents/_index.md new file mode 100644 index 0000000..68b5b6b --- /dev/null +++ b/doc/content/es/documents/_index.md @@ -0,0 +1,12 @@ ++++ +title = "Documentos" +weight = 5 ++++ + +#### Trabajar con Documentos + +### active + + +```python +``` diff --git a/doc/content/es/tools/macros/_index.md b/doc/content/es/tools/macros/_index.md new file mode 100644 index 0000000..1cd0c2d --- /dev/null +++ b/doc/content/es/tools/macros/_index.md @@ -0,0 +1,65 @@ ++++ +title = "Ejecutar macros" +weight = 6 ++++ + +Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario. + +```python +import easymacro as app + + +def mostrar_info(): + app.msgbox(app.INFO_DEBUG) + return + + +def main(args=None): + macro = { + 'library': 'test', + 'name': 'mostrar_info', + } + app.macro.call(macro) + return +``` + +Ejecutar una macro compartida en LibreOffice Macros. + +```python +macro = { + 'library': 'HelloWorld', + 'name': 'HelloWorldPython', + 'location': 'share', +} +app.macro.call(macro) +``` + +Ejecutar una macro Basic. + +```vb +Sub mostrar_info() + MsgBox "Mejor usa Python :)" +End Sub +``` + +```python +macro = { + 'language': 'Basic', + 'library': 'Standard', + 'module': 'Module1', + 'name': 'mostrar_info', +} +app.macro.call(macro) +``` + +Cualquier macro se puede ejecutar en otro hilo. + +```python +app.macro.call(macro, True) +``` + + +Más información en: [Scripting Framework URI Specification][1] + + +[1]: https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification diff --git a/doc/content/es/tools/threads/_index.md b/doc/content/es/tools/threads/_index.md new file mode 100644 index 0000000..b78ac01 --- /dev/null +++ b/doc/content/es/tools/threads/_index.md @@ -0,0 +1,50 @@ ++++ +title = "Hilos" +weight = 5 ++++ + +#### Ejecutar macros en otros hilos. + +Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación. + +Si ejecutas la siguiente macro `main`, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso. + +```python +import easymacro as app + + +def hacer_pausa(segundos): + app.sleep(segundos) + app.debug('He terminado') + return + +def main(): + hacer_pausa(5) + app.msgbox('Fin...') + return +``` + +Hasta que aparece el cuadro de mensaje con la palabra `Fin` y lo cierras, el usuario puede seguir usando la aplicación. + +### run_in_thread + +Ahora ejecutamos la macro en otro hilo, "decorando" cualquier macro con `run_in_thread` + +```python +@app.run_in_thread +def hacer_pausa(segundos): + app.sleep(segundos) + app.debug('He terminado') + return + +def main(): + hacer_pausa(5) + app.msgbox('Fin...') + return +``` + +Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos. + +{{% notice warning %}} +Ponga mucha atención en **no ejecutar macros en otros hilo** que dependen de algo suceptible de ser cambiado o interceptado por el usuario, por ejemplo, la celda activa. +{{% /notice %}} diff --git a/doc/content/es/tools/timer/_index.md b/doc/content/es/tools/timer/_index.md new file mode 100644 index 0000000..6d32858 --- /dev/null +++ b/doc/content/es/tools/timer/_index.md @@ -0,0 +1,116 @@ ++++ +title = "Timer" +weight = 7 ++++ + +El `timer` siempre se ejecuta en otro hilo. + +### once + +Ejecutar macro una sola vez en X segundos. + + +```python +import easymacro as app + + +NOMBRE = 'reloj' + + +def mostrar_hora(): + app.debug(app.dates.now_time) + return + + +def iniciar_conteo(): + segundos = 5 + macro = { + 'library': 'test', + 'name': 'mostrar_hora', + } + app.timer.once(NOMBRE, segundos, macro) + return + + +def main(args=None): + iniciar_conteo() + return +``` + +### cancel + +Cancelar ejecución, antes del tiempo establecido. + +```python +def main(args=None): + iniciar_conteo() + app.sleep(3) + detener_conteo() + return + +def detener_conteo(): + app.timer.cancel(NOMBRE) + return +``` + +``` +16/08/2022 21:18:50 - INFO - Event: "reloj", started... execute in 60 seconds +16/08/2022 21:18:55 - INFO - Cancel event: "reloj", ok... +``` + +### start + +Ejecutar macro cada X segundos. + +```python +NOMBRE = 'reloj' + + +def mostrar_hora(): + app.debug(app.dates.now_time) + return + + +def iniciar_reloj(): + segundos = 1 + macro = { + 'library': 'test', + 'name': 'mostrar_hora', + } + app.timer.start(NOMBRE, segundos, macro) + return + +def main(args=None): + iniciar_reloj() + return +``` + +### stop + +Detener timer. + +```python +def detener_reloj(): + app.timer.stop(NOMBRE) + return +``` + +``` +16/08/2022 21:25:37 - INFO - Timer 'reloj' started, execute macro: 'mostrar_hora' +16/08/2022 21:25:38 - DEBUG - 21:25:38 +16/08/2022 21:25:39 - DEBUG - 21:25:39 +... +16/08/2022 21:25:47 - DEBUG - 21:25:47 +16/08/2022 21:25:48 - DEBUG - 21:25:48 +16/08/2022 21:25:48 - INFO - Timer stopped... +``` + + +{{% notice tip %}} +Asegurese siempre de establecer un nombre único para cada timer. +{{% /notice %}} + + +{{% notice warning %}} +Asegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario. +{{% /notice %}} diff --git a/doc/content/es/tools/url/_index.md b/doc/content/es/tools/url/_index.md new file mode 100644 index 0000000..776a1a6 --- /dev/null +++ b/doc/content/es/tools/url/_index.md @@ -0,0 +1,42 @@ ++++ +title = "URL" +weight = 8 ++++ + +### get + +Método `get`. + +```python +def prueba_get(): + + url = 'https://api.ipify.org' + respuesta = app.url.get(url) + if respuesta.status_code == 200: + mi_ip = respuesta.body.decode() + app.debug(f'IP: {mi_ip}') + else: + app.debug(respuesta.status_code) + + return +``` + +``` +16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159 +``` + +Respuestas en formato json. + +```python +def prueba_get(): + + url = 'https://api.ipify.org/?format=json' + respuesta = app.url.get(url) + if respuesta.status_code == 200: + datos = respuesta.json() + app.debug(f'IP: {datos["ip"]}') + else: + app.debug(respuesta.status_code) + + return +``` diff --git a/doc/content/es/tools/utils/_index.md b/doc/content/es/tools/utils/_index.md new file mode 100644 index 0000000..23d975b --- /dev/null +++ b/doc/content/es/tools/utils/_index.md @@ -0,0 +1,198 @@ ++++ +title = "Utilidades" +weight = 9 ++++ + +### dict_to_property + +Convertir diccionarios en PropertyValue + + +```python +datos = { + 'Hidden': True, + 'Password': 'letmein', +} +propiedades = app.dict_to_property(datos) + +app.msgbox(propiedades) +``` + + +### data_to_dict + +Convertir `PropertyValue` en diccionarios + +```python +datos = app.data_to_dict(propiedades) +app.msgbox(datos) +``` + +Convertir `tuplas` a diccionario. + +```python +tupla_de_tuplas = ( + ('Hidden', True), + ('Password', 'letmein'), +) +datos = app.data_to_dict(tupla_de_tuplas) +app.msgbox(datos) +``` + +Convertir `listas` a diccionario. + +```python +lista_de_listas = [ + ['Hidden', True], + ['Password', 'letmein'], +] +datos = app.data_to_dict(lista_de_listas) +app.msgbox(datos) +``` + +### sleep + +Hacer una pausa de X segundos. + +```python +app.sleep(5) +``` + +### render + +Reemplazar variables en cadenas de texto. + +```python +plantilla = """Hola $nombre + +Te envío este archivo: $archivo + +Saludos cordiales +""" + +datos = { + 'nombre': 'Ingrid Bergman', + 'archivo': 'carta_de_amor.odt' +} + +resultado = app.render(plantilla, datos) + +app.msgbox(resultado) +``` + +### run + +Ejecutar un programa. + +```python +nombre_aplicacion = 'gnome-calculator' +app.shell.run(nombre_aplicacion) +``` + +Ejecutar comandos shell y capturar la salida. + +```python +comandos = 'ls -lh ~' +resultado = app.shell.run(comandos, True) +app.debug(resultado) +``` + +``` +drwxr-xr-x 4 mau mau 4.0K Aug 15 23:36 Desktop +drwxr-xr-x 6 mau mau 4.0K Jun 9 23:32 Documents +drwxr-xr-x 5 mau mau 4.0K Aug 16 13:09 Downloads +drwxr-xr-x 3 mau mau 4.0K Aug 14 15:19 Pictures +drwxr-xr-x 10 mau mau 4.0K Jun 19 19:36 Projects +drwxr-xr-x 2 mau mau 4.0K May 11 22:36 Templates +drwxr-xr-x 2 mau mau 4.0K Jul 19 13:37 Videos +``` + +Ejectuar comandos y capturar la salida línea a línea. + +```python +comandos = 'ls -lh /home/mau' +for line in app.shell.popen(comandos): + app.debug(line) +``` + +### digest + +Obtener hash. Por default se regresa en hexadecimal. + +```python + datos = 'LibreOffice con Python' + + digest = app.hash.digest('md5', datos) + app.debug('MD5 = ', digest) + + digest = app.hash.digest('sha1', datos) + app.debug('SHA1 = ', digest) + + digest = app.hash.digest('sha256', datos) + app.debug('SHA256 = ', digest) + + digest = app.hash.digest('sha512', datos) + app.debug('SHA512 = ', digest) +``` + +``` +16/08/2022 18:48:07 - DEBUG - MD5 = 3801759ead20abc3ce0d0095289bdcfd +16/08/2022 18:48:07 - DEBUG - SHA1 = 1df74aaae9658c21074aa5a2d4c2055dcf79f0db +16/08/2022 18:48:07 - DEBUG - SHA256 = 228e90b15b6259307e580677939b1f2f45e9317461e98f603af8fcac0f9a598f +16/08/2022 18:48:07 - DEBUG - SHA512 = 3ef45f79f3bfd2b251d250489c91b631306456405510397fb1a7ee37005d196376b7d6ca86a9895f4eb97eb74813965c24d6564a383f4bdb1360665c8fbb192a +``` + +Para obtener bytes. + +``` +digest = app.hash.digest('md5', datos, False) +app.debug('MD5 = ', digest) +``` + +``` +16/08/2022 18:48:07 - DEBUG - MD5 = b'8\x01u\x9e\xad \xab\xc3\xce\r\x00\x95(\x9b\xdc\xfd' +``` + + +### config + +Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario. + +```python +nombre = 'mi_extension' +datos = { + 'ruta': '/home/mau/pruebas', + 'guardar': True, +} + +if app.config.set(nombre, datos): + app.debug('Configuración guardada...') +``` + +Y recuperarlos en cualquier momento. + +``` +datos = app.config.get(nombre) +app.debug(datos) +``` + + +### color + +Puede ver los colores que puede usar en Wikipedia [Colores Web][1] + +```python +color_nombre = 'darkblue' +color = app.color(color_nombre) +app.debug(color) + +color_rgb = (125, 200, 10) +color = app.color(color_rgb) +app.debug(color) + +color_html = '#008080' +color = app.color(color_html) +app.debug(color) +``` + +[1]: https://es.wikipedia.org/wiki/Colores_web diff --git a/doc/public/404.html b/doc/public/404.html index e86b9a8..1f806c8 100644 --- a/doc/public/404.html +++ b/doc/public/404.html @@ -9,15 +9,15 @@ 404 Page not found - - - - - - - + + + + + + + - + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + LibreOffice +

+ + + + + + +

create_instance

+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/application/index.xml b/doc/public/es/application/index.xml new file mode 100644 index 0000000..d53a722 --- /dev/null +++ b/doc/public/es/application/index.xml @@ -0,0 +1,10 @@ + + + + LibreOffice on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/application/ + Recent content in LibreOffice on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/calc/index.html b/doc/public/es/calc/index.html new file mode 100644 index 0000000..78833b4 --- /dev/null +++ b/doc/public/es/calc/index.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + Calc :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Calc +

+ + + + + + +

Trabajar con Calc

+

active

+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/calc/index.xml b/doc/public/es/calc/index.xml new file mode 100644 index 0000000..a00c072 --- /dev/null +++ b/doc/public/es/calc/index.xml @@ -0,0 +1,10 @@ + + + + Calc on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/calc/ + Recent content in Calc on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/categories/index.html b/doc/public/es/categories/index.html index afe65d7..066ee8c 100644 --- a/doc/public/es/categories/index.html +++ b/doc/public/es/categories/index.html @@ -12,22 +12,22 @@ Categories :: Documentación para EasyMacro - - - - - - - - - - + + + + + + + + + + - + - + - + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Cuadros de diálogo +

+ + + + + + + +

create

+
Desde archivo
+

Crear un cuadro de diálogo desde un archivo xdl previamente creado desde el editor de cuadros de diálogo dentro de LibreOffice y exportado a un archivo.

+
def crear_cuadro_de_dialogo():
+    path = '/home/mau/Desktop/Dialog1.xdl'
+    propiedades = {'Path': path}
+
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+
Desde mis macros
+

Si el cuadro de diálogo esta en la librería Standard.

+
def crear_cuadro_de_dialogo():
+    propiedades = {
+        'Location': 'user',
+        'Name': 'Dialog1',
+    }
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+

Si el cuadro de diálogo esta en otra librería.

+
def crear_cuadro_de_dialogo():
+    propiedades = {
+        'Location': 'user',
+        'Library': 'MiAplicacion',
+        'Name': 'Dialog2',
+    }
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+

Si el cuadro de diálogo esta en el documento activo en la librería Standard.

+
def crear_cuadro_de_dialogo():
+    propiedades = {
+        'Location': 'document',
+        'Name': 'miApp',
+    }
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+
Crear dinámicamente
+

Crear un cuadro de diálogo vacío.

+
def crear_cuadro_de_dialogo():
+    dialog = app.dialog.create()
+    dialog.open()
+    return
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/dialog/index.xml b/doc/public/es/dialog/index.xml new file mode 100644 index 0000000..27ff43b --- /dev/null +++ b/doc/public/es/dialog/index.xml @@ -0,0 +1,10 @@ + + + + Cuadros de diálogo on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/dialog/ + Recent content in Cuadros de diálogo on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/documents/index.html b/doc/public/es/documents/index.html new file mode 100644 index 0000000..106a0f4 --- /dev/null +++ b/doc/public/es/documents/index.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + Documentos :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Documentos +

+ + + + + + +

Trabajar con Documentos

+

active

+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/documents/index.xml b/doc/public/es/documents/index.xml new file mode 100644 index 0000000..7bba374 --- /dev/null +++ b/doc/public/es/documents/index.xml @@ -0,0 +1,10 @@ + + + + Documentos on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/documents/ + Recent content in Documentos on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/index.html b/doc/public/es/index.html index ca834e1..02bddb0 100644 --- a/doc/public/es/index.html +++ b/doc/public/es/index.html @@ -12,22 +12,22 @@ :: Documentación para EasyMacro - - - - - - - - - - + + + + + + + + + + - + - + - + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Fechas y tiempo +

+ + + + + + + +

La fecha inicial en Calc y en Python es diferente.

+
+ +

today

+

Obtener la fecha de hoy.

+
d = app.dates
+app.msgbox(d.today)
+

now

+

Obtener la fecha y hora actuales.

+
d = app.dates
+app.msgbox(d.now)
+

time

+

Obtener la hora actual.

+
d = app.dates
+app.msgbox(d.now.time())
+

epoch

+

Obtener el tiempo Unix

+
d = app.dates
+app.msgbox(d.epoch)
+

date

+

Devolver una fecha

+
d = app.dates
+
+date = d.date(1974, 1, 15)
+app.msgbox(date)
+

time

+

Devolver un tiempo

+
d = app.dates
+
+time = d.time(10, 20, 15)
+app.msgbox(time)
+

datetime

+

Devolver fecha y hora

+
d = app.dates
+
+dt = d.datetime(1974, 1, 15, 10, 11, 12)
+app.msgbox(dt)
+

str_to_date

+

Convertir una cadena en fecha. Mira este excelente recurso

+
d = app.dates
+
+cadena = '1974-01-15'
+plantilla = '%Y-%m-%d'
+fecha = d.str_to_date(cadena, plantilla)
+app.msgbox(fecha)
+app.msgbox(type(fecha))
+

Para obtener un valor válido para establecer en una celda de Calc.

+
d = app.dates
+
+cadena = '1974-01-15'
+plantilla = '%Y-%m-%d'
+fecha = d.str_to_date(cadena, plantilla, True)
+app.msgbox(fecha)
+app.msgbox(type(fecha))
+

calc_to_date

+

Convierte el valor de una celda en una fecha Python, por ejemplo, la fecha inicial configurada en Calc.

+
d = app.dates
+
+value_from_cell = 1
+fecha = d.calc_to_date(value_from_cell)
+app.msgbox(fecha)
+app.msgbox(type(fecha))
+

start y end

+

Medir tiempo en segundos.

+
d = app.dates
+
+d.start()
+app.sleep(5)
+seconds = d.end()
+app.msgbox(seconds)
+

Regresar timedelta en vez de segundos.

+
d = app.dates
+
+d.start()
+app.sleep(5)
+td = d.end(False)
+app.msgbox(td)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/dates_and_time/index.xml b/doc/public/es/tools/dates_and_time/index.xml new file mode 100644 index 0000000..96593af --- /dev/null +++ b/doc/public/es/tools/dates_and_time/index.xml @@ -0,0 +1,10 @@ + + + + Fechas y tiempo on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/dates_and_time/ + Recent content in Fechas y tiempo on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/email/index.html b/doc/public/es/tools/email/index.html new file mode 100644 index 0000000..fd149a9 --- /dev/null +++ b/doc/public/es/tools/email/index.html @@ -0,0 +1,1124 @@ + + + + + + + + + + + + Correo electrónico :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Correo electrónico +

+ + + + + + +

Enviar correo electrónico.

+ +

Siempre guarda las contraseñas de la forma más segura posible.

+
+ +

send

+

Enviar un correo electrónico.

+
from conf import PASSWORD
+
+SERVER = dict(
+    server = 'mail.correo.net' ,
+    port = 405,
+    ssl = True,
+    user = 'no-responder@pruebas.mx',
+    password = PASSWORD,
+)
+
+body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales"
+
+message = dict(
+    to = 'ingrid@bergman.mx',
+    subject = 'Te amo...',
+    body = body,
+)
+
+app.email.send(SERVER, message)
+

Puede usar los campos cc (Con Copia) y bcc (Con Copia Oculta), así como separar por comas las direcciones destino para enviar a más de un correo.

+
to = 'mail1@correo.com,mail2@correo.com,mail3@correo.com'
+cc = 'otro@correo.com'
+bcc = 'oculto@correo.com'
+

Podemos enviar más de un mensaje.

+
mensaje1 = dict(
+    to = 'ingrid@correo.net',
+    subject = 'Te amo...',
+    body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
+)
+mensaje2 = dict(
+    to = 'sophia@correo.net',
+    subject = 'A ti también...',
+    body = "Hola Sophia\n\n¿Como estas?\n\nSaludos cordiales",
+)
+mensajes = (mensaje1, mensaje2)
+
+app.email.send(SERVER, mensajes)
+
16/08/2022 13:01:49 - DEBUG - Connect to: mail.server.net
+16/08/2022 13:01:50 - DEBUG - Email sent...
+16/08/2022 13:01:51 - DEBUG - Email sent...
+16/08/2022 13:01:51 - DEBUG - Close connection...
+

Enviar un archivo adjunto.

+
archivo = '/home/mau/temp.txt'
+mensaje = dict(
+    to = 'ingrid@bergman.mx',
+    subject = 'Te amo...',
+    body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
+    files = archivo,
+)
+
+app.email.send(SERVER, mensaje)
+

O varios.

+
archivos = (
+    '/home/mau/temp.txt',
+    '/home/mau/datos.csv',
+)
+

Si tu cliente de correo usa el formato mbox, puede guardar los correos enviados en una carpeta dentro de la configuración de su cliente de correo.

+
ruta = '/home/mau/.thunderbird/7iznrbyw.default/Mail/Local Folders/LibreOffice'
+mensaje = dict(
+    to = 'ingrid@bergman.mx',
+    subject = 'Te amo...',
+    body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
+    path = ruta,
+)
+
+app.email.send(SERVER, mensaje)
+
+

Todos los correos se envían siempre en otro hilo de ejecución.

+
+ + + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/email/index.xml b/doc/public/es/tools/email/index.xml new file mode 100644 index 0000000..e68463e --- /dev/null +++ b/doc/public/es/tools/email/index.xml @@ -0,0 +1,10 @@ + + + + Correo electrónico on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/email/ + Recent content in Correo electrónico on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/index.html b/doc/public/es/tools/index.html new file mode 100644 index 0000000..d3b514d --- /dev/null +++ b/doc/public/es/tools/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + Herramientas :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Herramientas +

+ + + + + + +

Recuerda, es necesario importar la librería.

+
import easymacro as app
+

Información sobre la PC

+

OS

+

Obtener el sistema operativo.

+
app.msgbox(app.OS)
+

DESKTOP

+

Obtener el tipo de escritorio, solo en GNU/Linux.

+
app.msgbox(app.DESKTOP)
+

PC

+

Obtener el nombre de la computadora.

+
app.msgbox(app.PC)
+

USER

+

Obtener el nombre de usuario.

+
app.msgbox(app.USER)
+

IS_WIN

+

Saber si estamos en Windows.

+
app.msgbox(app.IS_WIN)
+

IS_MAC

+

Saber si estamos en OSX.

+
app.msgbox(app.IS_MAC)
+

Información sobre LibreOffice

+

NAME

+

Nombre de la aplicación.

+
app.msgbox(app.NAME)
+

VERSION

+

Versión de la aplicación.

+
app.msgbox(app.VERSION)
+

LANG

+

Lenguaje de la aplicación.

+
app.msgbox(app.LANG)
+

LANGUAGE

+

Lenguaje con variante.

+
app.msgbox(app.LANGUAGE)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/index.xml b/doc/public/es/tools/index.xml new file mode 100644 index 0000000..c5e10ff --- /dev/null +++ b/doc/public/es/tools/index.xml @@ -0,0 +1,10 @@ + + + + Herramientas on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/ + Recent content in Herramientas on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/macros/index.html b/doc/public/es/tools/macros/index.html new file mode 100644 index 0000000..f7aa28f --- /dev/null +++ b/doc/public/es/tools/macros/index.html @@ -0,0 +1,1075 @@ + + + + + + + + + + + + Ejecutar macros :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Ejecutar macros +

+ + + + + + +

Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario.

+
import easymacro as app
+
+
+def mostrar_info():
+    app.msgbox(app.INFO_DEBUG)
+    return
+
+
+def main(args=None):
+    macro = {
+        'library': 'test',
+        'name': 'mostrar_info',
+    }
+    app.macro.call(macro)
+    return
+

Ejecutar una macro compartida en LibreOffice Macros.

+
macro = {
+    'library': 'HelloWorld',
+    'name': 'HelloWorldPython',
+    'location': 'share',
+}
+app.macro.call(macro)
+

Ejecutar una macro Basic.

+
Sub mostrar_info()
+    MsgBox "Mejor usa Python :)"
+End Sub
+
macro = {
+    'language': 'Basic',
+    'library': 'Standard',
+    'module': 'Module1',
+    'name': 'mostrar_info',
+}
+app.macro.call(macro)
+

Cualquier macro se puede ejecutar en otro hilo.

+
app.macro.call(macro, True)
+

Más información en: Scripting Framework URI Specification

+ + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/macros/index.xml b/doc/public/es/tools/macros/index.xml new file mode 100644 index 0000000..8b3be1a --- /dev/null +++ b/doc/public/es/tools/macros/index.xml @@ -0,0 +1,10 @@ + + + + Ejecutar macros on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/macros/ + Recent content in Ejecutar macros on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/messages/index.html b/doc/public/es/tools/messages/index.html new file mode 100644 index 0000000..9b0f73a --- /dev/null +++ b/doc/public/es/tools/messages/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + Mensajes :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Mensajes +

+ + + + + + +

Cuadros de mensaje

+

msgbox

+

Mostrar mensaje estandar.

+
mensaje = 'Maldito Mundo'
+titulo = 'Mi Macro'
+app.msgbox(mensaje, titulo)
+

warning

+

Mostrar mensaje con icono de advertencia.

+
mensaje = 'Cuidado, esta acción es peligrosa'
+titulo = 'Mi Macro'
+app.warning(mensaje, titulo)
+

errorbox

+

Mostrar mensaje con icono de error.

+
mensaje = 'ERROR: contacte a soporte'
+titulo = 'Mi Macro'
+app.errorbox(mensaje, titulo)
+

question

+

Hacer una pregunta mostrando el icono de interrogación y mostrando los botones de comando Si y No. La respuesta siempre es verdadera (True) si el usuario selecciona si y falsa (False) en caso contrario.

+
mensaje = '¿Es fácil Python?'
+titulo = 'Mi Macro'
+resultado = app.question(mensaje, titulo)
+app.msgbox(resultado)
+

inputbox

+

Muestra un mensaje al usuario, permitiendo capturar una respuesta.

+
mensaje = 'Escribe tu nombre'
+nombre = app.inputbox(mensaje)
+app.msgbox(nombre)
+

Para ocultar solo en pantalla lo que captura el usuario, como contraseñas.

+
mensaje = 'Captura la contraseña'
+echochar = '*'
+contraseña = app.inputbox(mensaje, echochar=echochar)
+app.msgbox(contraseña)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/messages/index.xml b/doc/public/es/tools/messages/index.xml new file mode 100644 index 0000000..572ede1 --- /dev/null +++ b/doc/public/es/tools/messages/index.xml @@ -0,0 +1,10 @@ + + + + Mensajes on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/messages/ + Recent content in Mensajes on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/paths/index.html b/doc/public/es/tools/paths/index.html new file mode 100644 index 0000000..d306874 --- /dev/null +++ b/doc/public/es/tools/paths/index.html @@ -0,0 +1,1376 @@ + + + + + + + + + + + + Rutas y archivos :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + + + + +
+
+ +
+ +
+ +
+ +

+ + Rutas y archivos +

+ + + + + + +

Trabajar con rutas y archivos.

+

path

+

Obtener información de una ruta.

+
ruta_archivo = '/home/mau/mi_archivo.ods'
+p = app.paths(ruta_archivo)
+
+app.debug(p.path)
+app.debug(p.file_name)
+app.debug(p.name)
+app.debug(p.ext)
+app.debug(p.size)
+app.debug(p.url)
+
15/08/2022 14:40:08 - DEBUG - /home/mau
+15/08/2022 14:40:08 - DEBUG - mi_archivo.ods
+15/08/2022 14:40:08 - DEBUG - mi_archivo
+15/08/2022 14:40:08 - DEBUG - ods
+15/08/2022 14:40:08 - DEBUG - 7011
+15/08/2022 14:40:08 - DEBUG - file:///home/mau/mi_archivo.ods
+

Obtener la misma información como un tupla.

+
ruta_archivo = '/home/mau/mi_archivo.ods'
+p = app.paths(ruta_archivo)
+app.debug(p.info)
+
15/08/2022 14:43:01 - DEBUG - ('/home/mau', 'mi_archivo.ods', 'mi_archivo', 'ods', 7011, 'file:///home/mau/mi_archivo.ods')
+

O como diccionario.

+
ruta_archivo = '/home/mau/mi_archivo.ods'
+p = app.paths(ruta_archivo)
+app.debug(p.dict)
+
15/08/2022 14:43:01 - DEBUG - {'path': '/home/mau', 'file_name': 'mi_archivo.ods', 'name': 'mi_archivo', 'ext': 'ods', 'size': 7011, 'url': 'file:///home/mau/mi_archivo.ods'}
+

home

+

Obtener la carpeta de inicio del usuario.

+
p = app.paths
+app.debug(p.home)
+

documents

+

Obtener la carpeta Documentos del usuario.

+
p = app.paths
+app.debug(p.documents)
+

user_profile

+

Obtener la ruta del perfil de usuario.

+
p = app.paths
+app.debug(p.user_profile)
+

user_config

+

Obtener la ruta de la carpeta config en el perfil de usuario.

+
p = app.paths
+app.debug(p.user_config)
+

python

+

Obtener la ruta del ejecutable python

+
p = app.paths
+app.debug(p.python)
+

to_system

+

Pasar una ruta en formato URL al formato del sistema de archivos del SO.

+
p = app.paths
+ruta_url = 'file:///home/mau/mi_archivo.ods'
+ruta = p.to_system(ruta_url)
+app.debug(ruta)
+

to_url

+

Pasar una ruta del sistema de archivos del SO al formato URL.

+
p = app.paths
+ruta = '/home/mau/mi_archivo.ods'
+ruta_url = p.to_url(ruta)
+app.debug(ruta_url)
+

config

+

Obtener rutas de la configuración de LibreOffice. Por default obtiene la ruta de Documentos, para otras ruta mire Api XPathSettings

+
p = app.paths
+ruta = p.config()
+app.debug(ruta)
+
+ruta = p.config('UserConfig')
+app.debug(ruta)
+
+

Algunas rutas pueden ser más de una, separados por ;, en este caso, el resultado es una lista con las rutas.

+
+ +

join

+

Concatenar rutas.

+
p = app.paths
+ruta = p.join('/home/mau', 'pruebas', 'archivo.ods')
+app.debug(ruta)
+

exists

+

Verificar si una ruta existe.

+
p = app.paths
+resultado = p.exists('/home/mau/test/archivo.ods')
+app.debug(resultado)
+

exists_app

+

Verificar si una aplicación existe.

+
p = app.paths
+
+resultado = p.exists_app('noexiste')
+app.debug(resultado)
+
+resultado = p.exists_app('soffice')
+app.debug(resultado)
+

is_dir

+

Verificar si la ruta es un directorio.

+
p = app.paths
+resultado = p.is_dir('/home/mau')
+app.debug(resultado)
+

is_file

+

Verificar si la ruta es un archivo.

+
p = app.paths
+resultado = p.is_file('/home/mau/mi_archivo.ods')
+app.debug(resultado)
+

temp_file

+

Crear un archivo temporal, es borrado automáticamente al cerrarse.

+
p = app.paths
+
+f = p.temp_file()
+f.write(app.INFO_DEBUG)
+f.close()
+

Usado en contexto, se cierra automáticamente.

+
with p.temp_file() as f:
+    app.debug(f.name)
+    f.write('test')
+

temp_dir

+

Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.

+
p = app.paths
+
+with p.temp_dir() as d:
+    app.debug(p.exists(d))
+    app.debug(d)
+
+app.debug(p.exists(d))
+

get

+

Permitir al usuario seleccionar archivos, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos.

+
p = app.paths
+ruta = p.get()
+app.debug(ruta)
+

Establecer que abra en otro directorio.

+
ruta = p.get('/tmp')
+app.debug(ruta)
+

Agregar un filtro.

+
ruta = p.get(filters='ods')
+app.debug(ruta)
+

Agregar multiples filtros.

+
ruta = p.get(filters='xml,txt')
+app.debug(ruta)
+

Permitir selecciones multiples.

+
ruta = p.get(filters='xml,txt', multiple=True)
+app.debug(ruta)
+

get_dir

+

Permitir al usuario seleccionar un directorio, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos.

+
p = app.paths
+ruta = p.get_dir()
+app.debug(ruta)
+

Establecer que abra en otro directorio.

+
ruta = p.get_dir('/tmp')
+app.debug(ruta)
+

get_for_save

+

Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.

+
p = app.paths
+ruta = p.get_for_save()
+app.debug(ruta)
+

Establecer que inicie en otro directorio.

+
ruta = p.get_for_save('/tmp')
+app.debug(ruta)
+

Si se establece un filtro, automáticamente se agrega la extensión.

+
ruta = p.get_for_save(filters='txt')
+app.debug(ruta)
+

files

+

Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.

+
ruta = '/home/mau'
+
+p = app.paths
+archivos = p.files(ruta)
+for a in archivos:
+    app.debug(a)
+

Filtrar por tipo de archivo.

+
p = app.paths
+archivos = p.files(ruta, '*.pdf')
+

Obtener archivos de forma recursiva.

+
p = app.paths
+archivos = p.files(ruta, '**/*.xml')
+

walk

+

Obtener archivos de forma recursiva.

+
p = app.paths
+ruta = '/home/mau/Documents'
+archivos = p.walk(ruta)
+for a in archivos:
+    app.debug(a)
+

Con filtro.

+
archivos = p.walk(ruta, 'ods')
+

Con filtros.

+
archivos = p.walk(ruta, 'ods|odt')
+

dirs

+

Obtener los directorios de una ruta, no recursivamente.

+
p = app.paths
+ruta = '/home/mau/Documents'
+folders = p.dirs(ruta)
+for f in folders:
+    app.debug(f)
+

walk_dirs

+

Obtener los directorios de una ruta, no recursivamente.

+
p = app.paths
+ruta = '/home/mau/Documents'
+folders = p.walk_dirs(ruta)
+for f in folders:
+    app.debug(f)
+

Obtener información en una lista de tuplas: (ID_FOLDER, ID_PADRE, NOMBRE)

+
folders = p.walk_dirs(ruta, True)
+

extension

+

Obtener la ruta de instalación de una extensión a partir de su ID.

+
p = app.paths
+id_ext = 'net.elmau.zaz.talk'
+ruta = p.extension(id_ext)
+app.debug(ruta)
+

replace_ext

+

Reemplazar extensión de un archivo.

+
p = app.paths
+ruta = '/home/mau/mi_archivo.ods'
+ruta_nueva = p.replace_ext(ruta, 'pdf')
+app.debug(ruta_nueva)
+

open

+

Abrir cualquier archivo con el programas predeterminado del SO.

+
p = app.paths
+ruta = '/home/mau/archivo.pdf'
+p.open(ruta)
+
+ruta = '/home/mau/index.html'
+p.open(ruta)
+

save y read

+

Guardar y leer datos, el encoding predeterminado es UTF8.

+
p = app.paths
+datos = """¿Quieres saber quién eres? No preguntes. Actúa.
+La acción te delineará y definirá.
+
+Thomas Jefferson
+"""
+
+ruta = '/home/mau/temp.txt'
+p.save(ruta, datos)
+
+datos = p.read(ruta)
+app.msgbox(datos)
+

Cambiar el encoding.

+
app.paths.save(ruta, datos, 'iso-8859-1')
+

save_bin y read_bin

+

Guardar y leer datos binarios.

+
p = app.paths
+datos = b'Datos binarios'
+
+ruta = '/home/mau/temp.bin'
+p.save_bin(ruta, datos)
+
+datos = p.read_bin(ruta)
+app.msgbox(datos)
+

save_json y read_json

+

Guardar y leer en formato json.

+
p = app.paths
+
+ruta = '/home/mau/datos.json'
+datos = {
+    'tipo': 'calc',
+    'nombre': 'miarchivo.ods',
+}
+p.save_json(ruta, datos)
+
+datos = p.read_json(ruta)
+app.msgbox(datos)
+

save_csv y read_csv

+

Exportar e importar datos en formato CSV. Vea la documentación CSV para los argumentos que puede usar.

+
p = app.paths
+
+ruta = '/home/mau/datos.csv'
+ahora = app.dates.now
+datos = (
+    (1, 'uno', ahora),
+    (2, 'dos', ahora),
+    (3, 'tres', ahora),
+)
+p.save_csv(ruta, datos)
+
+datos = p.read_csv(ruta)
+app.msgbox(datos)
+

kill

+

Borra archivos o directorios con todo su contenido. Devuelve verdadero (True) en caso de exito y falso (Falso) en cualquier otro caso.

+ +

Este proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.

+
+ +
p = app.paths
+
+ruta = '/home/mau/temp.bin'
+resultado = p.kill(ruta)
+app.msgbox(resultado)
+

copy

+

Copiar archivos. Devuelve la ruta completa final destino.

+

De un origen a una carpeta destino

+
p = app.paths
+
+ruta_origen = '/home/mau/temp.txt'
+ruta_destino = '/home/mau/Desktop'
+ruta = p.copy(ruta_origen, ruta_destino)
+app.debug(ruta)
+

Cambiar el nombre destino.

+
ruta_origen = '/home/mau/temp.txt'
+ruta_destino = '/home/mau/Desktop'
+nuevo_nombre = 'datos.csv'
+ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre)
+app.debug(ruta)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/paths/index.xml b/doc/public/es/tools/paths/index.xml new file mode 100644 index 0000000..75f6ead --- /dev/null +++ b/doc/public/es/tools/paths/index.xml @@ -0,0 +1,10 @@ + + + + Rutas y archivos on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/paths/ + Recent content in Rutas y archivos on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/threads/index.html b/doc/public/es/tools/threads/index.html new file mode 100644 index 0000000..f606468 --- /dev/null +++ b/doc/public/es/tools/threads/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + Hilos :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Hilos +

+ + + + + + +

Ejecutar macros en otros hilos.

+

Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación.

+

Si ejecutas la siguiente macro main, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso.

+
import easymacro as app
+
+
+def hacer_pausa(segundos):
+    app.sleep(segundos)
+    app.debug('He terminado')
+    return
+
+def main():
+    hacer_pausa(5)
+    app.msgbox('Fin...')
+    return
+

Hasta que aparece el cuadro de mensaje con la palabra Fin y lo cierras, el usuario puede seguir usando la aplicación.

+

run_in_thread

+

Ahora ejecutamos la macro en otro hilo, “decorando” cualquier macro con run_in_thread

+
@app.run_in_thread
+def hacer_pausa(segundos):
+    app.sleep(segundos)
+    app.debug('He terminado')
+    return
+
+def main():
+    hacer_pausa(5)
+    app.msgbox('Fin...')
+    return
+

Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos.

+ +

Ponga mucha atención en no ejecutar macros en otros hilo que dependen de algo suceptible de ser cambiado o interceptado por el usuario, por ejemplo, la celda activa.

+
+ + + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/threads/index.xml b/doc/public/es/tools/threads/index.xml new file mode 100644 index 0000000..33bffd1 --- /dev/null +++ b/doc/public/es/tools/threads/index.xml @@ -0,0 +1,10 @@ + + + + Hilos on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/threads/ + Recent content in Hilos on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/timer/index.html b/doc/public/es/tools/timer/index.html new file mode 100644 index 0000000..8e8c18a --- /dev/null +++ b/doc/public/es/tools/timer/index.html @@ -0,0 +1,1131 @@ + + + + + + + + + + + + Timer :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Timer +

+ + + + + + +

El timer siempre se ejecuta en otro hilo.

+

once

+

Ejecutar macro una sola vez en X segundos.

+
import easymacro as app
+
+
+NOMBRE = 'reloj'
+
+
+def mostrar_hora():
+    app.debug(app.dates.now_time)
+    return
+
+
+def iniciar_conteo():
+    segundos = 5
+    macro = {
+        'library': 'test',
+        'name': 'mostrar_hora',
+    }
+    app.timer.once(NOMBRE, segundos, macro)
+    return
+
+
+def main(args=None):
+    iniciar_conteo()
+    return
+

cancel

+

Cancelar ejecución, antes del tiempo establecido.

+
def main(args=None):
+    iniciar_conteo()
+    app.sleep(3)
+    detener_conteo()
+    return
+
+def detener_conteo():
+    app.timer.cancel(NOMBRE)
+    return
+
16/08/2022 21:18:50 - INFO - Event: "reloj", started... execute in 60 seconds
+16/08/2022 21:18:55 - INFO - Cancel event: "reloj", ok...
+

start

+

Ejecutar macro cada X segundos.

+
NOMBRE = 'reloj'
+
+
+def mostrar_hora():
+    app.debug(app.dates.now_time)
+    return
+
+
+def iniciar_reloj():
+    segundos = 1
+    macro = {
+        'library': 'test',
+        'name': 'mostrar_hora',
+    }
+    app.timer.start(NOMBRE, segundos, macro)
+    return
+
+def main(args=None):
+    iniciar_reloj()
+    return
+

stop

+

Detener timer.

+
def detener_reloj():
+    app.timer.stop(NOMBRE)
+    return
+
16/08/2022 21:25:37 - INFO - Timer 'reloj' started, execute macro: 'mostrar_hora'
+16/08/2022 21:25:38 - DEBUG - 21:25:38
+16/08/2022 21:25:39 - DEBUG - 21:25:39
+...
+16/08/2022 21:25:47 - DEBUG - 21:25:47
+16/08/2022 21:25:48 - DEBUG - 21:25:48
+16/08/2022 21:25:48 - INFO -    Timer stopped...
+
+

Asegurese siempre de establecer un nombre único para cada timer.

+
+ + +

Asegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario.

+
+ + + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/timer/index.xml b/doc/public/es/tools/timer/index.xml new file mode 100644 index 0000000..da632cc --- /dev/null +++ b/doc/public/es/tools/timer/index.xml @@ -0,0 +1,10 @@ + + + + Timer on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/timer/ + Recent content in Timer on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/tools_01.png b/doc/public/es/tools/tools_01.png new file mode 100644 index 0000000..6395bb4 Binary files /dev/null and b/doc/public/es/tools/tools_01.png differ diff --git a/doc/public/es/tools/url/index.html b/doc/public/es/tools/url/index.html new file mode 100644 index 0000000..6632a39 --- /dev/null +++ b/doc/public/es/tools/url/index.html @@ -0,0 +1,1072 @@ + + + + + + + + + + + + URL :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + URL +

+ + + + + + +

get

+

Método get.

+
def prueba_get():
+
+    url = 'https://api.ipify.org'
+    respuesta = app.url.get(url)
+    if respuesta.status_code == 200:
+        mi_ip = respuesta.body.decode()
+        app.debug(f'IP: {mi_ip}')
+    else:
+        app.debug(respuesta.status_code)
+
+    return
+
16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159
+

Respuestas en formato json.

+
def prueba_get():
+
+    url = 'https://api.ipify.org/?format=json'
+    respuesta = app.url.get(url)
+    if respuesta.status_code == 200:
+        datos = respuesta.json()
+        app.debug(f'IP: {datos["ip"]}')
+    else:
+        app.debug(respuesta.status_code)
+
+    return
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/url/index.xml b/doc/public/es/tools/url/index.xml new file mode 100644 index 0000000..09585f0 --- /dev/null +++ b/doc/public/es/tools/url/index.xml @@ -0,0 +1,10 @@ + + + + URL on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/url/ + Recent content in URL on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/utils/index.html b/doc/public/es/tools/utils/index.html new file mode 100644 index 0000000..74c2b91 --- /dev/null +++ b/doc/public/es/tools/utils/index.html @@ -0,0 +1,1168 @@ + + + + + + + + + + + + Utilidades :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Utilidades +

+ + + + + + +

dict_to_property

+

Convertir diccionarios en PropertyValue

+
datos = {
+    'Hidden': True,
+    'Password': 'letmein',
+}
+propiedades = app.dict_to_property(datos)
+
+app.msgbox(propiedades)
+

data_to_dict

+

Convertir PropertyValue en diccionarios

+
datos = app.data_to_dict(propiedades)
+app.msgbox(datos)
+

Convertir tuplas a diccionario.

+
tupla_de_tuplas = (
+    ('Hidden', True),
+    ('Password', 'letmein'),
+)
+datos = app.data_to_dict(tupla_de_tuplas)
+app.msgbox(datos)
+

Convertir listas a diccionario.

+
lista_de_listas = [
+    ['Hidden', True],
+    ['Password', 'letmein'],
+]
+datos = app.data_to_dict(lista_de_listas)
+app.msgbox(datos)
+

sleep

+

Hacer una pausa de X segundos.

+
app.sleep(5)
+

render

+

Reemplazar variables en cadenas de texto.

+
plantilla = """Hola $nombre
+
+Te envío este archivo: $archivo
+
+Saludos cordiales
+"""
+
+datos = {
+    'nombre': 'Ingrid Bergman',
+    'archivo': 'carta_de_amor.odt'
+}
+
+resultado = app.render(plantilla, datos)
+
+app.msgbox(resultado)
+

run

+

Ejecutar un programa.

+
nombre_aplicacion = 'gnome-calculator'
+app.shell.run(nombre_aplicacion)
+

Ejecutar comandos shell y capturar la salida.

+
comandos = 'ls -lh ~'
+resultado = app.shell.run(comandos, True)
+app.debug(resultado)
+
drwxr-xr-x  4 mau mau 4.0K Aug 15 23:36 Desktop
+drwxr-xr-x  6 mau mau 4.0K Jun  9 23:32 Documents
+drwxr-xr-x  5 mau mau 4.0K Aug 16 13:09 Downloads
+drwxr-xr-x  3 mau mau 4.0K Aug 14 15:19 Pictures
+drwxr-xr-x 10 mau mau 4.0K Jun 19 19:36 Projects
+drwxr-xr-x  2 mau mau 4.0K May 11 22:36 Templates
+drwxr-xr-x  2 mau mau 4.0K Jul 19 13:37 Videos
+

Ejectuar comandos y capturar la salida línea a línea.

+
comandos = 'ls -lh /home/mau'
+for line in app.shell.popen(comandos):
+    app.debug(line)
+

digest

+

Obtener hash. Por default se regresa en hexadecimal.

+
    datos = 'LibreOffice con Python'
+
+    digest = app.hash.digest('md5', datos)
+    app.debug('MD5 = ', digest)
+
+    digest = app.hash.digest('sha1', datos)
+    app.debug('SHA1 = ', digest)
+
+    digest = app.hash.digest('sha256', datos)
+    app.debug('SHA256 = ', digest)
+
+    digest = app.hash.digest('sha512', datos)
+    app.debug('SHA512 = ', digest)
+
16/08/2022 18:48:07 - DEBUG - MD5 =     3801759ead20abc3ce0d0095289bdcfd
+16/08/2022 18:48:07 - DEBUG - SHA1 =    1df74aaae9658c21074aa5a2d4c2055dcf79f0db
+16/08/2022 18:48:07 - DEBUG - SHA256 =  228e90b15b6259307e580677939b1f2f45e9317461e98f603af8fcac0f9a598f
+16/08/2022 18:48:07 - DEBUG - SHA512 =  3ef45f79f3bfd2b251d250489c91b631306456405510397fb1a7ee37005d196376b7d6ca86a9895f4eb97eb74813965c24d6564a383f4bdb1360665c8fbb192a
+

Para obtener bytes.

+
digest = app.hash.digest('md5', datos, False)
+app.debug('MD5 = ', digest)
+
16/08/2022 18:48:07 - DEBUG - MD5 =     b'8\x01u\x9e\xad \xab\xc3\xce\r\x00\x95(\x9b\xdc\xfd'
+

config

+

Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario.

+
nombre = 'mi_extension'
+datos = {
+    'ruta': '/home/mau/pruebas',
+    'guardar': True,
+}
+
+if app.config.set(nombre, datos):
+    app.debug('Configuración guardada...')
+

Y recuperarlos en cualquier momento.

+
datos = app.config.get(nombre)
+app.debug(datos)
+

color

+

Puede ver los colores que puede usar en Wikipedia Colores Web

+
color_nombre = 'darkblue'
+color = app.color(color_nombre)
+app.debug(color)
+
+color_rgb = (125, 200, 10)
+color = app.color(color_rgb)
+app.debug(color)
+
+color_html = '#008080'
+color = app.color(color_html)
+app.debug(color)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/utils/index.xml b/doc/public/es/tools/utils/index.xml new file mode 100644 index 0000000..144e8a6 --- /dev/null +++ b/doc/public/es/tools/utils/index.xml @@ -0,0 +1,10 @@ + + + + Utilidades on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/utils/ + Recent content in Utilidades on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools_debug/index.html b/doc/public/es/tools_debug/index.html new file mode 100644 index 0000000..3a37935 --- /dev/null +++ b/doc/public/es/tools_debug/index.html @@ -0,0 +1,1163 @@ + + + + + + + + + + + + Herramientas para depurar :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Herramientas para depurar +

+ + + + + + +

INFO_DEBUG

+

Mostrar información de depuración en un cuadro de mensaje.

+

Si tiene cualquier problema en su código durante el desarrollo de sus macros, puede abrir un ticket de soporte en el sistema de ticket de este proyecto. Siempre copie la información de depuración mostrada en este mensaje.

+
import easymacro as app
+
+def info():
+    app.msgbox(app.INFO_DEBUG)
+    return
+

Info debug

+

debug

+

Mostrar información en la terminal.

+
import easymacro as app
+
+def test_debug():
+    msg = 'Verificar esta información...'
+    app.debug(msg)
+    return
+
11/08/2022 18:15:45 - DEBUG - Verificar esta información...
+

info

+

Mostrar mensajes informativos en la terminal.

+
import easymacro as app
+
+def test_info():
+    msg = 'Iniciando proceso...'
+    app.info(msg)
+    return
+
11/08/2022 18:23:53 - INFO - Iniciando proceso...
+

error

+

Mostrar mensajes de error en la terminal.

+
import easymacro as app
+
+def test_error():
+    msg = 'Error 505'
+    app.error(msg)
+    return
+
11/08/2022 18:27:34 - ERROR - Error 505
+

save_log

+

Guardar registro en un archivo, automáticamente se agrega la fecha y hora.

+
import easymacro as app
+
+def test_save_log():
+
+    app.save_log('/home/mau/log.txt', 'PyUNO')
+    app.save_log('/home/mau/log.txt', 'Maldito Mundo')
+
+    return
+
cat ~/log.txt
+2022-08-11 18:30:11 - 'PyUNO'
+2022-08-11 18:30:11 - 'Maldito Mundo'
+

msgbox

+

Mostrar cualquier información en un cuadro de mensaje.

+
def message():
+
+    msg = 'Por favor, consume menos.'
+    app.msgbox(msg)
+
+    msg = ('uno', 2, 'tres')
+    app.msgbox(msg)
+
+    msg = {'nombre': 'Teresa'}
+    app.msgbox(msg)
+
+    app.msgbox(app)
+
+    return
+

catch_exception

+

Capturar cualquier error que se produzca al ejecutar una macro.

+
@app.catch_exception
+def test_capturar_error():
+    r = 1 / 0
+    return
+
11/08/2022 18:44:36 - ERROR - test_capturar_error
+Traceback (most recent call last):
+  File "/home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro/easytools.py", line 115, in func
+    return f(*args, **kwargs)
+  File "/home/mau/.config/libreoffice/4/user/Scripts/python/test.py", line 18, in test_capturar_error
+    r = 1 / 0
+ZeroDivisionError: division by zero
+
+

Usa este método solo en tiempo de desarrollo. No la uses en producción.

+
+ +

mri

+

MRI es la mejor extensión para inspeccionar cualquier objeto UNO de LibreOffice. Necesita instalarla primero para poder llamarla.

+
def inspeccionar_objeto():
+    obj = app.active
+    app.mri(obj)
+    return
+

inspect

+

Inspeccionar un objeto.

+
def inspeccionar_objeto():
+    doc = app.active
+    data = app.inspect(doc)
+    for p in data.properties:
+        app.debug(p)
+    for m in data.methods:
+        app.debug(m)
+    return
+

Vaciar en una hoja de calculo.

+
def inspeccionar_objeto():
+    doc = app.active
+    app.inspect(doc, True)
+    return
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools_debug/index.xml b/doc/public/es/tools_debug/index.xml new file mode 100644 index 0000000..c71f78b --- /dev/null +++ b/doc/public/es/tools_debug/index.xml @@ -0,0 +1,10 @@ + + + + Herramientas para depurar on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools_debug/ + Recent content in Herramientas para depurar on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools_debug/tools_01.png b/doc/public/es/tools_debug/tools_01.png new file mode 100644 index 0000000..6395bb4 Binary files /dev/null and b/doc/public/es/tools_debug/tools_01.png differ diff --git a/doc/public/fr/404.html b/doc/public/fr/404.html index 089aa59..21bd4ae 100644 --- a/doc/public/fr/404.html +++ b/doc/public/fr/404.html @@ -9,15 +9,15 @@ 404 Page not found - - - - - - - + + + + + + + - +