easymacro/doc/public/es/index.json

134 lines
32 KiB
JSON

[
{
"uri": "https://doc.cuates.net/easymacro/es/installation/",
"title": "Instalación",
"tags": [],
"description": "",
"content": "Clonar repositorio Clone el repositorio en su directorio de proyectos favorito.\ngit clone https://git.cuates.net/elmau/easymacro Muévase al directorio\ncd easymacro/source copie la carpeta easymacro a la carpeta pythonpath en la carpeta de macros Python dentro de su perfil de usuario. Reemplace USUARIO por su usuario real.\n/home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/pythonpath o use un vínculo simbólico. Reemplace RUTA_ABSOLUTA por la ruta absoluta donde se localice easymacro en su sistema de archivos y USUARIO por su nombre de usuario.\nln -s `RUTA_ABSOLUTA`/easymacro/source/easymacro /home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/pythonpath/ Probar En su archivo de macros favorito, por ejemplo mismacros.py. Use su editor de texto plano o IDE favorito.\nvim /home/`USUARIO`/.config/libreoffice/4/user/Scripts/python/mismacros.py Copie el siguiente código:\nimport easymacro as app def main(): app.msgbox(app.INFO_DEBUG) return Ejecute la macro main desde LibreOffice, si ve un cuadro de mensaje con información similar a la siguiente, !felicidades¡\nEsta todo listo para empezar a desarrollar macros con easymacro.\n!Feliz programación!\n"
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/messages/",
"title": "Mensajes",
"tags": [],
"description": "",
"content": "Cuadros de mensaje msgbox Mostrar mensaje estandar.\nmensaje = \u0026#39;Maldito Mundo\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; app.msgbox(mensaje, titulo) warning Mostrar mensaje con icono de advertencia.\nmensaje = \u0026#39;Cuidado, esta acción es peligrosa\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; app.warning(mensaje, titulo) errorbox Mostrar mensaje con icono de error.\nmensaje = \u0026#39;ERROR: contacte a soporte\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; 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.\nmensaje = \u0026#39;¿Es fácil Python?\u0026#39; titulo = \u0026#39;Mi Macro\u0026#39; resultado = app.question(mensaje, titulo) app.msgbox(resultado) inputbox Muestra un mensaje al usuario, permitiendo capturar una respuesta.\nmensaje = \u0026#39;Escribe tu nombre\u0026#39; nombre = app.inputbox(mensaje) app.msgbox(nombre) Para ocultar solo en pantalla lo que captura el usuario, como contraseñas.\nmensaje = \u0026#39;Captura la contraseña\u0026#39; echochar = \u0026#39;*\u0026#39; contraseña = app.inputbox(mensaje, echochar=echochar) app.msgbox(contraseña) "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/dates_and_time/",
"title": "Fechas y tiempo",
"tags": [],
"description": "",
"content": " La fecha inicial en Calc y en Python es diferente.\ntoday Obtener la fecha de hoy.\nd = app.dates app.msgbox(d.today) now Obtener la fecha y hora actuales.\nd = app.dates app.msgbox(d.now) time Obtener la hora actual.\nd = app.dates app.msgbox(d.now.time()) epoch Obtener el tiempo Unix\nd = app.dates app.msgbox(d.epoch) date Devolver una fecha\nd = app.dates date = d.date(1974, 1, 15) app.msgbox(date) time Devolver un tiempo\nd = app.dates time = d.time(10, 20, 15) app.msgbox(time) datetime Devolver fecha y hora\nd = 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\nd = app.dates cadena = \u0026#39;1974-01-15\u0026#39; plantilla = \u0026#39;%Y-%m-%d\u0026#39; 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.\nd = app.dates cadena = \u0026#39;1974-01-15\u0026#39; plantilla = \u0026#39;%Y-%m-%d\u0026#39; 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.\nd = 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.\nd = app.dates d.start() app.sleep(5) seconds = d.end() app.msgbox(seconds) Regresar timedelta en vez de segundos.\nd = app.dates d.start() app.sleep(5) td = d.end(False) app.msgbox(td) "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools_debug/",
"title": "Herramientas para depurar",
"tags": [],
"description": "",
"content": "INFO_DEBUG Mostrar información de depuración en un cuadro de mensaje.\nSi 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.\nimport easymacro as app def info(): app.msgbox(app.INFO_DEBUG) return debug Mostrar información en la terminal.\nimport easymacro as app def test_debug(): msg = \u0026#39;Verificar esta información...\u0026#39; app.debug(msg) return 11/08/2022 18:15:45 - DEBUG - Verificar esta información... info Mostrar mensajes informativos en la terminal.\nimport easymacro as app def test_info(): msg = \u0026#39;Iniciando proceso...\u0026#39; app.info(msg) return 11/08/2022 18:23:53 - INFO - Iniciando proceso... error Mostrar mensajes de error en la terminal.\nimport easymacro as app def test_error(): msg = \u0026#39;Error 505\u0026#39; 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.\nimport easymacro as app def test_save_log(): app.save_log(\u0026#39;/home/mau/log.txt\u0026#39;, \u0026#39;PyUNO\u0026#39;) app.save_log(\u0026#39;/home/mau/log.txt\u0026#39;, \u0026#39;Maldito Mundo\u0026#39;) return cat ~/log.txt 2022-08-11 18:30:11 - \u0026#39;PyUNO\u0026#39; 2022-08-11 18:30:11 - \u0026#39;Maldito Mundo\u0026#39; msgbox Mostrar cualquier información en un cuadro de mensaje.\ndef message(): msg = \u0026#39;Por favor, consume menos.\u0026#39; app.msgbox(msg) msg = (\u0026#39;uno\u0026#39;, 2, \u0026#39;tres\u0026#39;) app.msgbox(msg) msg = {\u0026#39;nombre\u0026#39;: \u0026#39;Teresa\u0026#39;} app.msgbox(msg) app.msgbox(app) return catch_exception Capturar cualquier error que se produzca al ejecutar una macro.\n@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 \u0026#34;/home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro/easytools.py\u0026#34;, line 115, in func return f(*args, **kwargs) File \u0026#34;/home/mau/.config/libreoffice/4/user/Scripts/python/test.py\u0026#34;, 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.\nmri MRI es la mejor extensión para inspeccionar cualquier objeto UNO de LibreOffice. Necesita instalarla primero para poder llamarla.\ndef inspeccionar_objeto(): obj = app.active app.mri(obj) return inspect Inspeccionar un objeto.\ndef 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.\ndef inspeccionar_objeto(): doc = app.active app.inspect(doc, True) return "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/paths/",
"title": "Rutas y archivos",
"tags": [],
"description": "",
"content": "Trabajar con rutas y archivos. path Obtener información de una ruta.\nruta_archivo = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; 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.\nruta_archivo = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; p = app.paths(ruta_archivo) app.debug(p.info) 15/08/2022 14:43:01 - DEBUG - (\u0026#39;/home/mau\u0026#39;, \u0026#39;mi_archivo.ods\u0026#39;, \u0026#39;mi_archivo\u0026#39;, \u0026#39;ods\u0026#39;, 7011, \u0026#39;file:///home/mau/mi_archivo.ods\u0026#39;) O como diccionario.\nruta_archivo = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; p = app.paths(ruta_archivo) app.debug(p.dict) 15/08/2022 14:43:01 - DEBUG - {\u0026#39;path\u0026#39;: \u0026#39;/home/mau\u0026#39;, \u0026#39;file_name\u0026#39;: \u0026#39;mi_archivo.ods\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mi_archivo\u0026#39;, \u0026#39;ext\u0026#39;: \u0026#39;ods\u0026#39;, \u0026#39;size\u0026#39;: 7011, \u0026#39;url\u0026#39;: \u0026#39;file:///home/mau/mi_archivo.ods\u0026#39;} home Obtener la carpeta de inicio del usuario.\np = app.paths app.debug(p.home) documents Obtener la carpeta Documentos del usuario.\np = app.paths app.debug(p.documents) user_profile Obtener la ruta del perfil de usuario.\np = app.paths app.debug(p.user_profile) user_config Obtener la ruta de la carpeta config en el perfil de usuario.\np = app.paths app.debug(p.user_config) python Obtener la ruta del ejecutable python\np = app.paths app.debug(p.python) to_system Pasar una ruta en formato URL al formato del sistema de archivos del SO.\np = app.paths ruta_url = \u0026#39;file:///home/mau/mi_archivo.ods\u0026#39; ruta = p.to_system(ruta_url) app.debug(ruta) to_url Pasar una ruta del sistema de archivos del SO al formato URL.\np = app.paths ruta = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; 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\np = app.paths ruta = p.config() app.debug(ruta) ruta = p.config(\u0026#39;UserConfig\u0026#39;) app.debug(ruta) Algunas rutas pueden ser más de una, separados por ;, en este caso, el resultado es una lista con las rutas.\njoin Concatenar rutas.\np = app.paths ruta = p.join(\u0026#39;/home/mau\u0026#39;, \u0026#39;pruebas\u0026#39;, \u0026#39;archivo.ods\u0026#39;) app.debug(ruta) exists Verificar si una ruta existe.\np = app.paths resultado = p.exists(\u0026#39;/home/mau/test/archivo.ods\u0026#39;) app.debug(resultado) exists_app Verificar si una aplicación existe.\np = app.paths resultado = p.exists_app(\u0026#39;noexiste\u0026#39;) app.debug(resultado) resultado = p.exists_app(\u0026#39;soffice\u0026#39;) app.debug(resultado) is_dir Verificar si la ruta es un directorio.\np = app.paths resultado = p.is_dir(\u0026#39;/home/mau\u0026#39;) app.debug(resultado) is_file Verificar si la ruta es un archivo.\np = app.paths resultado = p.is_file(\u0026#39;/home/mau/mi_archivo.ods\u0026#39;) app.debug(resultado) temp_file Crear un archivo temporal, es borrado automáticamente al cerrarse.\np = app.paths f = p.temp_file() f.write(app.INFO_DEBUG) f.close() Usado en contexto, se cierra automáticamente.\nwith p.temp_file() as f: app.debug(f.name) f.write(\u0026#39;test\u0026#39;) temp_dir Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.\np = 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.\np = app.paths ruta = p.get() app.debug(ruta) Establecer que abra en otro directorio.\nruta = p.get(\u0026#39;/tmp\u0026#39;) app.debug(ruta) Agregar un filtro.\nruta = p.get(filters=\u0026#39;ods\u0026#39;) app.debug(ruta) Agregar multiples filtros.\nruta = p.get(filters=\u0026#39;xml,txt\u0026#39;) app.debug(ruta) Permitir selecciones multiples.\nruta = p.get(filters=\u0026#39;xml,txt\u0026#39;, 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.\np = app.paths ruta = p.get_dir() app.debug(ruta) Establecer que abra en otro directorio.\nruta = p.get_dir(\u0026#39;/tmp\u0026#39;) app.debug(ruta) get_for_save Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.\np = app.paths ruta = p.get_for_save() app.debug(ruta) Establecer que inicie en otro directorio.\nruta = p.get_for_save(\u0026#39;/tmp\u0026#39;) app.debug(ruta) Si se establece un filtro, automáticamente se agrega la extensión.\nruta = p.get_for_save(filters=\u0026#39;txt\u0026#39;) app.debug(ruta) files Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.\nruta = \u0026#39;/home/mau\u0026#39; p = app.paths archivos = p.files(ruta) for a in archivos: app.debug(a) Filtrar por tipo de archivo.\np = app.paths archivos = p.files(ruta, \u0026#39;*.pdf\u0026#39;) Obtener archivos de forma recursiva.\np = app.paths archivos = p.files(ruta, \u0026#39;**/*.xml\u0026#39;) walk Obtener archivos de forma recursiva.\np = app.paths ruta = \u0026#39;/home/mau/Documents\u0026#39; archivos = p.walk(ruta) for a in archivos: app.debug(a) Con filtro.\narchivos = p.walk(ruta, \u0026#39;ods\u0026#39;) Con filtros.\narchivos = p.walk(ruta, \u0026#39;ods|odt\u0026#39;) dirs Obtener los directorios de una ruta, no recursivamente.\np = app.paths ruta = \u0026#39;/home/mau/Documents\u0026#39; folders = p.dirs(ruta) for f in folders: app.debug(f) walk_dirs Obtener los directorios de una ruta, no recursivamente.\np = app.paths ruta = \u0026#39;/home/mau/Documents\u0026#39; 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)\nfolders = p.walk_dirs(ruta, True) extension Obtener la ruta de instalación de una extensión a partir de su ID.\np = app.paths id_ext = \u0026#39;net.elmau.zaz.talk\u0026#39; ruta = p.extension(id_ext) app.debug(ruta) replace_ext Reemplazar extensión de un archivo.\np = app.paths ruta = \u0026#39;/home/mau/mi_archivo.ods\u0026#39; ruta_nueva = p.replace_ext(ruta, \u0026#39;pdf\u0026#39;) app.debug(ruta_nueva) open Abrir cualquier archivo con el programas predeterminado del SO.\np = app.paths ruta = \u0026#39;/home/mau/archivo.pdf\u0026#39; p.open(ruta) ruta = \u0026#39;/home/mau/index.html\u0026#39; p.open(ruta) save y read Guardar y leer datos, el encoding predeterminado es UTF8.\np = app.paths datos = \u0026#34;\u0026#34;\u0026#34;¿Quieres saber quién eres? No preguntes. Actúa. La acción te delineará y definirá. Thomas Jefferson \u0026#34;\u0026#34;\u0026#34; ruta = \u0026#39;/home/mau/temp.txt\u0026#39; p.save(ruta, datos) datos = p.read(ruta) app.msgbox(datos) Cambiar el encoding.\napp.paths.save(ruta, datos, \u0026#39;iso-8859-1\u0026#39;) save_bin y read_bin Guardar y leer datos binarios.\np = app.paths datos = b\u0026#39;Datos binarios\u0026#39; ruta = \u0026#39;/home/mau/temp.bin\u0026#39; p.save_bin(ruta, datos) datos = p.read_bin(ruta) app.msgbox(datos) save_json y read_json Guardar y leer en formato json.\np = app.paths ruta = \u0026#39;/home/mau/datos.json\u0026#39; datos = { \u0026#39;tipo\u0026#39;: \u0026#39;calc\u0026#39;, \u0026#39;nombre\u0026#39;: \u0026#39;miarchivo.ods\u0026#39;, } 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.\np = app.paths ruta = \u0026#39;/home/mau/datos.csv\u0026#39; ahora = app.dates.now datos = ( (1, \u0026#39;uno\u0026#39;, ahora), (2, \u0026#39;dos\u0026#39;, ahora), (3, \u0026#39;tres\u0026#39;, 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.\nEste proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.\np = app.paths ruta = \u0026#39;/home/mau/temp.bin\u0026#39; resultado = p.kill(ruta) app.msgbox(resultado) copy Copiar archivos. Devuelve la ruta completa final destino.\nDe un origen a una carpeta destino\np = app.paths ruta_origen = \u0026#39;/home/mau/temp.txt\u0026#39; ruta_destino = \u0026#39;/home/mau/Desktop\u0026#39; ruta = p.copy(ruta_origen, ruta_destino) app.debug(ruta) Cambiar el nombre destino.\nruta_origen = \u0026#39;/home/mau/temp.txt\u0026#39; ruta_destino = \u0026#39;/home/mau/Desktop\u0026#39; nuevo_nombre = \u0026#39;datos.csv\u0026#39; ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre) app.debug(ruta) "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/email/",
"title": "Correo electrónico",
"tags": [],
"description": "",
"content": "Enviar correo electrónico. Siempre guarda las contraseñas de la forma más segura posible.\nsend Enviar un correo electrónico.\nfrom conf import PASSWORD SERVER = dict( server = \u0026#39;mail.correo.net\u0026#39; , port = 405, ssl = True, user = \u0026#39;no-responder@pruebas.mx\u0026#39;, password = PASSWORD, ) body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34; message = dict( to = \u0026#39;ingrid@bergman.mx\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, 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.\nto = \u0026#39;mail1@correo.com,mail2@correo.com,mail3@correo.com\u0026#39; cc = \u0026#39;otro@correo.com\u0026#39; bcc = \u0026#39;oculto@correo.com\u0026#39; Podemos enviar más de un mensaje.\nmensaje1 = dict( to = \u0026#39;ingrid@correo.net\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, ) mensaje2 = dict( to = \u0026#39;sophia@correo.net\u0026#39;, subject = \u0026#39;A ti también...\u0026#39;, body = \u0026#34;Hola Sophia\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, ) 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.\narchivo = \u0026#39;/home/mau/temp.txt\u0026#39; mensaje = dict( to = \u0026#39;ingrid@bergman.mx\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, files = archivo, ) app.email.send(SERVER, mensaje) O varios.\narchivos = ( \u0026#39;/home/mau/temp.txt\u0026#39;, \u0026#39;/home/mau/datos.csv\u0026#39;, ) 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.\nruta = \u0026#39;/home/mau/.thunderbird/7iznrbyw.default/Mail/Local Folders/LibreOffice\u0026#39; mensaje = dict( to = \u0026#39;ingrid@bergman.mx\u0026#39;, subject = \u0026#39;Te amo...\u0026#39;, body = \u0026#34;Hola Ingrid\\n\\n¿Como estas?\\n\\nSaludos cordiales\u0026#34;, path = ruta, ) app.email.send(SERVER, mensaje) Todos los correos se envían siempre en otro hilo de ejecución.\n"
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/",
"title": "Herramientas",
"tags": [],
"description": "",
"content": "Recuerda, es necesario importar la librería.\nimport easymacro as app Información sobre la PC OS Obtener el sistema operativo.\napp.msgbox(app.OS) DESKTOP Obtener el tipo de escritorio, solo en GNU/Linux.\napp.msgbox(app.DESKTOP) PC Obtener el nombre de la computadora.\napp.msgbox(app.PC) USER Obtener el nombre de usuario.\napp.msgbox(app.USER) IS_WIN Saber si estamos en Windows.\napp.msgbox(app.IS_WIN) IS_MAC Saber si estamos en OSX.\napp.msgbox(app.IS_MAC) Información sobre LibreOffice NAME Nombre de la aplicación.\napp.msgbox(app.NAME) VERSION Versión de la aplicación.\napp.msgbox(app.VERSION) LANG Lenguaje de la aplicación.\napp.msgbox(app.LANG) LANGUAGE Lenguaje con variante.\napp.msgbox(app.LANGUAGE) "
},
{
"uri": "https://doc.cuates.net/easymacro/es/application/",
"title": "LibreOffice",
"tags": [],
"description": "",
"content": "create_instance "
},
{
"uri": "https://doc.cuates.net/easymacro/es/documents/",
"title": "Documentos",
"tags": [],
"description": "",
"content": "Trabajar con Documentos active "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/threads/",
"title": "Hilos",
"tags": [],
"description": "",
"content": "Ejecutar macros en otros hilos. Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación.\nSi ejecutas la siguiente macro main, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso.\nimport easymacro as app def hacer_pausa(segundos): app.sleep(segundos) app.debug(\u0026#39;He terminado\u0026#39;) return def main(): hacer_pausa(5) app.msgbox(\u0026#39;Fin...\u0026#39;) return Hasta que aparece el cuadro de mensaje con la palabra Fin y lo cierras, el usuario puede seguir usando la aplicación.\nrun_in_thread Ahora ejecutamos la macro en otro hilo, \u0026ldquo;decorando\u0026rdquo; cualquier macro con run_in_thread\n@app.run_in_thread def hacer_pausa(segundos): app.sleep(segundos) app.debug(\u0026#39;He terminado\u0026#39;) return def main(): hacer_pausa(5) app.msgbox(\u0026#39;Fin...\u0026#39;) return Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos.\nPonga 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.\n"
},
{
"uri": "https://doc.cuates.net/easymacro/es/calc/",
"title": "Calc",
"tags": [],
"description": "",
"content": "Trabajar con Calc active "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/macros/",
"title": "Ejecutar macros",
"tags": [],
"description": "",
"content": "Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario.\nimport easymacro as app def mostrar_info(): app.msgbox(app.INFO_DEBUG) return def main(args=None): macro = { \u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_info\u0026#39;, } app.macro.call(macro) return Ejecutar una macro compartida en LibreOffice Macros.\nmacro = { \u0026#39;library\u0026#39;: \u0026#39;HelloWorld\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;HelloWorldPython\u0026#39;, \u0026#39;location\u0026#39;: \u0026#39;share\u0026#39;, } app.macro.call(macro) Ejecutar una macro Basic.\nSub mostrar_info() MsgBox \u0026#34;Mejor usa Python :)\u0026#34; End Sub macro = { \u0026#39;language\u0026#39;: \u0026#39;Basic\u0026#39;, \u0026#39;library\u0026#39;: \u0026#39;Standard\u0026#39;, \u0026#39;module\u0026#39;: \u0026#39;Module1\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_info\u0026#39;, } app.macro.call(macro) Cualquier macro se puede ejecutar en otro hilo.\napp.macro.call(macro, True) Más información en: Scripting Framework URI Specification\n"
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/timer/",
"title": "Timer",
"tags": [],
"description": "",
"content": "El timer siempre se ejecuta en otro hilo.\nonce Ejecutar macro una sola vez en X segundos.\nimport easymacro as app NOMBRE = \u0026#39;reloj\u0026#39; def mostrar_hora(): app.debug(app.dates.now_time) return def iniciar_conteo(): segundos = 5 macro = { \u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_hora\u0026#39;, } app.timer.once(NOMBRE, segundos, macro) return def main(args=None): iniciar_conteo() return cancel Cancelar ejecución, antes del tiempo establecido.\ndef 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: \u0026#34;reloj\u0026#34;, started... execute in 60 seconds 16/08/2022 21:18:55 - INFO - Cancel event: \u0026#34;reloj\u0026#34;, ok... start Ejecutar macro cada X segundos.\nNOMBRE = \u0026#39;reloj\u0026#39; def mostrar_hora(): app.debug(app.dates.now_time) return def iniciar_reloj(): segundos = 1 macro = { \u0026#39;library\u0026#39;: \u0026#39;test\u0026#39;, \u0026#39;name\u0026#39;: \u0026#39;mostrar_hora\u0026#39;, } app.timer.start(NOMBRE, segundos, macro) return def main(args=None): iniciar_reloj() return stop Detener timer.\ndef detener_reloj(): app.timer.stop(NOMBRE) return 16/08/2022 21:25:37 - INFO - Timer \u0026#39;reloj\u0026#39; started, execute macro: \u0026#39;mostrar_hora\u0026#39; 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.\nAsegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario.\n"
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/url/",
"title": "URL",
"tags": [],
"description": "",
"content": "get Método get.\ndef prueba_get(): url = \u0026#39;https://api.ipify.org\u0026#39; respuesta = app.url.get(url) if respuesta.status_code == 200: mi_ip = respuesta.body.decode() app.debug(f\u0026#39;IP: {mi_ip}\u0026#39;) else: app.debug(respuesta.status_code) return 16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159 Respuestas en formato json.\ndef prueba_get(): url = \u0026#39;https://api.ipify.org/?format=json\u0026#39; respuesta = app.url.get(url) if respuesta.status_code == 200: datos = respuesta.json() app.debug(f\u0026#39;IP: {datos[\u0026#34;ip\u0026#34;]}\u0026#39;) else: app.debug(respuesta.status_code) return "
},
{
"uri": "https://doc.cuates.net/easymacro/es/tools/utils/",
"title": "Utilidades",
"tags": [],
"description": "",
"content": "dict_to_property Convertir diccionarios en PropertyValue\ndatos = { \u0026#39;Hidden\u0026#39;: True, \u0026#39;Password\u0026#39;: \u0026#39;letmein\u0026#39;, } propiedades = app.dict_to_property(datos) app.msgbox(propiedades) data_to_dict Convertir PropertyValue en diccionarios\ndatos = app.data_to_dict(propiedades) app.msgbox(datos) Convertir tuplas a diccionario.\ntupla_de_tuplas = ( (\u0026#39;Hidden\u0026#39;, True), (\u0026#39;Password\u0026#39;, \u0026#39;letmein\u0026#39;), ) datos = app.data_to_dict(tupla_de_tuplas) app.msgbox(datos) Convertir listas a diccionario.\nlista_de_listas = [ [\u0026#39;Hidden\u0026#39;, True], [\u0026#39;Password\u0026#39;, \u0026#39;letmein\u0026#39;], ] datos = app.data_to_dict(lista_de_listas) app.msgbox(datos) sleep Hacer una pausa de X segundos.\napp.sleep(5) render Reemplazar variables en cadenas de texto.\nplantilla = \u0026#34;\u0026#34;\u0026#34;Hola $nombre Te envío este archivo: $archivo Saludos cordiales \u0026#34;\u0026#34;\u0026#34; datos = { \u0026#39;nombre\u0026#39;: \u0026#39;Ingrid Bergman\u0026#39;, \u0026#39;archivo\u0026#39;: \u0026#39;carta_de_amor.odt\u0026#39; } resultado = app.render(plantilla, datos) app.msgbox(resultado) run Ejecutar un programa.\nnombre_aplicacion = \u0026#39;gnome-calculator\u0026#39; app.shell.run(nombre_aplicacion) Ejecutar comandos shell y capturar la salida.\ncomandos = \u0026#39;ls -lh ~\u0026#39; 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.\ncomandos = \u0026#39;ls -lh /home/mau\u0026#39; for line in app.shell.popen(comandos): app.debug(line) digest Obtener hash. Por default se regresa en hexadecimal.\ndatos = \u0026#39;LibreOffice con Python\u0026#39; digest = app.hash.digest(\u0026#39;md5\u0026#39;, datos) app.debug(\u0026#39;MD5 = \u0026#39;, digest) digest = app.hash.digest(\u0026#39;sha1\u0026#39;, datos) app.debug(\u0026#39;SHA1 = \u0026#39;, digest) digest = app.hash.digest(\u0026#39;sha256\u0026#39;, datos) app.debug(\u0026#39;SHA256 = \u0026#39;, digest) digest = app.hash.digest(\u0026#39;sha512\u0026#39;, datos) app.debug(\u0026#39;SHA512 = \u0026#39;, 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.\ndigest = app.hash.digest(\u0026#39;md5\u0026#39;, datos, False) app.debug(\u0026#39;MD5 = \u0026#39;, digest) 16/08/2022 18:48:07 - DEBUG - MD5 = b\u0026#39;8\\x01u\\x9e\\xad \\xab\\xc3\\xce\\r\\x00\\x95(\\x9b\\xdc\\xfd\u0026#39; config Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario.\nnombre = \u0026#39;mi_extension\u0026#39; datos = { \u0026#39;ruta\u0026#39;: \u0026#39;/home/mau/pruebas\u0026#39;, \u0026#39;guardar\u0026#39;: True, } if app.config.set(nombre, datos): app.debug(\u0026#39;Configuración guardada...\u0026#39;) Y recuperarlos en cualquier momento.\ndatos = app.config.get(nombre) app.debug(datos) color Puede ver los colores que puede usar en Wikipedia Colores Web\ncolor_nombre = \u0026#39;darkblue\u0026#39; color = app.color(color_nombre) app.debug(color) color_rgb = (125, 200, 10) color = app.color(color_rgb) app.debug(color) color_html = \u0026#39;#008080\u0026#39; color = app.color(color_html) app.debug(color) "
},
{
"uri": "https://doc.cuates.net/easymacro/es/dialog/",
"title": "Cuadros de diálogo",
"tags": [],
"description": "",
"content": "Trabajar con 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.\ndef crear_cuadro_de_dialogo(): path = \u0026#39;/home/mau/Desktop/Dialog1.xdl\u0026#39; propiedades = {\u0026#39;Path\u0026#39;: path} dialog = app.dialog.create(propiedades) dialog.open() return Desde mis macros Si el cuadro de diálogo esta en la librería Standard.\ndef crear_cuadro_de_dialogo(): propiedades = { \u0026#39;Location\u0026#39;: \u0026#39;user\u0026#39;, \u0026#39;Name\u0026#39;: \u0026#39;Dialog1\u0026#39;, } dialog = app.dialog.create(propiedades) dialog.open() return Si el cuadro de diálogo esta en otra librería.\ndef crear_cuadro_de_dialogo(): propiedades = { \u0026#39;Location\u0026#39;: \u0026#39;user\u0026#39;, \u0026#39;Library\u0026#39;: \u0026#39;MiAplicacion\u0026#39;, \u0026#39;Name\u0026#39;: \u0026#39;Dialog2\u0026#39;, } dialog = app.dialog.create(propiedades) dialog.open() return Si el cuadro de diálogo esta en el documento activo en la librería Standard.\ndef crear_cuadro_de_dialogo(): propiedades = { \u0026#39;Location\u0026#39;: \u0026#39;document\u0026#39;, \u0026#39;Name\u0026#39;: \u0026#39;miApp\u0026#39;, } dialog = app.dialog.create(propiedades) dialog.open() return Crear dinámicamente Crear un cuadro de diálogo vacío.\ndef crear_cuadro_de_dialogo(): dialog = app.dialog.create() dialog.open() return "
},
{
"uri": "https://doc.cuates.net/easymacro/es/",
"title": "",
"tags": [],
"description": "",
"content": "Documentación de easymacro! Software Libre, no software gratis. easymacro es una librería para desarrollar más fácilmente macros en LibreOffice con Python. Es una capa de abstracción entre la extensa y compleja API UNO de LibreOffice y tu código.\nProbablemente, será más feliz si la usa :)\nPuede utilizar easymacro con cualquier extensión o directamente en sus macros.\nEste proyecto esta en continuo desarrollo.\n"
},
{
"uri": "https://doc.cuates.net/easymacro/es/categories/",
"title": "Categories",
"tags": [],
"description": "",
"content": ""
},
{
"uri": "https://doc.cuates.net/easymacro/es/tags/",
"title": "Tags",
"tags": [],
"description": "",
"content": ""
}]