Haz tu Pregunta
0

Acceso a boton desde una macro de python

preguntado 2016-01-21 10:49:39 +0200

this post is marked as community wiki

This post is a wiki. Anyone with karma >75 is welcome to improve it.

Tengo un boton en una hoja que llama a una macro en python, como la macro tarda en ejecutarse, quiero desactivar el boton al empezar y activarlo al terminar de nuevo. No sé cual es el objeto al que acceder para cambiar la propiedad del botón. ¿Puede alguien indicarme documentación de referencia?

Adjunto Macro:

import time

def BusquedaTabla(*args): # Si se llama desde un botón, pasa el argumento del evento del objeto que lo llama
    # The context variable is of type XScriptContext and is available to
    # all BeanShell scripts executed by the Script Framework
    momento1 = time.clock()
    Libro = XSCRIPTCONTEXT.getDocument()
    Hojas = Libro.Sheets
    Hoja1 = Libro.CurrentController.ActiveSheet
    # Comprobamos si el evento se llama desde un boton
    LAMADABOTON = 0
    if len(args) > 0 :  # Si se llama desde un boton, desactivamos el mismo
        LLAMADABOTON = 1

    HojaComprobar = Hojas.getByName(Hoja1.getCellRangeByName("C2").String)
    HojaValores = Hojas.getByName(Hoja1.getCellRangeByName("F2").String)
    HojaAsignar = Hojas.getByName(Hoja1.getCellRangeByName("I2").String)
    HojaRellenar = Hojas.getByName(Hoja1.getCellRangeByName("L2").String)
    RangoComprobar = HojaComprobar.getCellRangeByName(Hoja1.getCellRangeByName("A4").String + Hoja1.getCellRangeByName("B4").String + ":" + Hoja1.getCellRangeByName("A4").String + Hoja1.getCellRangeByName("C4").String)
    RangoValores = HojaValores.getCellRangeByName(Hoja1.getCellRangeByName("D4").String + Hoja1.getCellRangeByName("E4").String + ":" + Hoja1.getCellRangeByName("D4").String + Hoja1.getCellRangeByName("F4").String)
    RangoAsignar = HojaAsignar.getCellRangeByName(Hoja1.getCellRangeByName("G4").String + Hoja1.getCellRangeByName("H4").String + ":" + Hoja1.getCellRangeByName("G4").String + Hoja1.getCellRangeByName("I4").String)
    Cadena =  Hoja1.getCellRangeByName("L4").String
    RangoRellenar = HojaRellenar.getCellRangeByName(Hoja1.getCellRangeByName("J4").String + Hoja1.getCellRangeByName("K4").String + ":" + Hoja1.getCellRangeByName("J4").String + Hoja1.getCellRangeByName("L4").String)
#
    lComprobar = len(RangoComprobar.getDataArray())
    lValores = len(RangoValores.getDataArray())
    lRellenar = len(RangoRellenar.getDataArray())
    tRellenar = RangoRellenar.getDataArray()
    iComprobar = 1
    while iComprobar <= lComprobar :
        cComprobar = RangoComprobar.getDataArray()[iComprobar - 1][0]
        iValores = 1
        while iValores <= lValores :
            if cComprobar == RangoValores.getDataArray()[iValores - 1][0] :
                RangoRellenar.getCellByPosition(0,iComprobar - 1).setString(RangoAsignar.getDataArray()[iValores - 1][0])
                iValores = lValores
            iValores += 1
        iComprobar += 1
    Datos = RangoComprobar.getDataArray()

    momento2 = time.clock()
    Hoja1.getCellRangeByName("A10").setString("Tiempo de Proceso:")
    Hoja1.getCellRangeByName("A11").setValue(momento2 - momento1)
#
    return None
# lists the scripts, that shall be visible inside OOo. Can be omited, if
# all functions shall be visible, however here getNewString shall be surpressed
g_exportedScripts = BusquedaTabla,
edit re-etiquetar marcar como ofensivo cerrar fusionar delete

2 Respuestas

Ordenar por » viejos nuevas más votado
2

respondido 2016-07-16 17:46:35 +0200

Imagen Gravatar de mauricio

Aprovecha el poder de Python, divide la macro en dos y llama de forma asyncronica a la segunda, por ejemplo:

import time
from threading import Thread

import uno

def procesar(event):
    source = event.Source
    thread = Thread(target=sleep, args=(source,))
    thread.start()
    return

def sleep(button):
    button.setEnable(False)
    time.sleep(3)
    button.setEnable(True)
    return

Saludos

edit marcar como ofensivo delete enlace mas
0

respondido 2016-02-08 12:44:50 +0200

Imagen Gravatar de Tejon

updated 2016-04-11 11:58:55 +0200

Ok, solucionado, se puede acceder al formulario con

getDrawPage().getForms().

import time

def BusquedaTabla(*args): # Si se llama desde un botón, pasa el argumento del evento del objeto que lo llama
    # The context variable is of type XScriptContext and is available to
    # all BeanShell scripts executed by the Script Framework
    momento1 = time.clock()
    Libro = XSCRIPTCONTEXT.getDocument()
    oFormularios = Libro.getCurrentController().getActiveSheet().getDrawPage().getForms()
    # Comprobamos si el evento se llama desde un boton
    LAMADABOTON = 0
    if len(args) > 0 :  # Si se llama desde un boton, desactivamos el mismo
        LLAMADABOTON = 1
        oBoton_Procesar = oFormularios.getByIndex(0).getByName('Boton_Procesar')
        oBoton_Procesar.Enabled = False
    Hojas = Libro.getSheets()
    Hoja1 = Libro.CurrentController.getActiveSheet()
    Hoja1.getCellRangeByName("A11").setValue(0)
    HojaComprobar = Hojas.getByName(Hoja1.getCellRangeByName("C2").String)
    HojaValores = Hojas.getByName(Hoja1.getCellRangeByName("F2").String)
    HojaAsignar = Hojas.getByName(Hoja1.getCellRangeByName("I2").String)
    HojaRellenar = Hojas.getByName(Hoja1.getCellRangeByName("L2").String)
    RangoComprobar = HojaComprobar.getCellRangeByName(Hoja1.getCellRangeByName("A4").String + Hoja1.getCellRangeByName("B4").String + ":" + Hoja1.getCellRangeByName("A4").String + Hoja1.getCellRangeByName("C4").String)
    RangoValores = HojaValores.getCellRangeByName(Hoja1.getCellRangeByName("D4").String + Hoja1.getCellRangeByName("E4").String + ":" + Hoja1.getCellRangeByName("D4").String + Hoja1.getCellRangeByName("F4").String)
    RangoAsignar = HojaAsignar.getCellRangeByName(Hoja1.getCellRangeByName("G4").String + Hoja1.getCellRangeByName("H4").String + ":" + Hoja1.getCellRangeByName("G4").String + Hoja1.getCellRangeByName("I4").String)
    Cadena =  Hoja1.getCellRangeByName("L4").String
    RangoRellenar = HojaRellenar.getCellRangeByName(Hoja1.getCellRangeByName("J4").String + Hoja1.getCellRangeByName("K4").String + ":" + Hoja1.getCellRangeByName("J4").String + Hoja1.getCellRangeByName("L4").String)
#
    lComprobar = len(RangoComprobar.getDataArray())
    lValores = len(RangoValores.getDataArray())
    lRellenar = len(RangoRellenar.getDataArray())
    tRellenar = RangoRellenar.getDataArray()
    iComprobar = 1
    while iComprobar <= lComprobar :
        cComprobar = RangoComprobar.getDataArray()[iComprobar - 1][0]
        iValores = 1
        while iValores <= lValores :
            if cComprobar == RangoValores.getDataArray()[iValores - 1][0] :
                RangoRellenar.getCellByPosition(0,iComprobar - 1).setString(RangoAsignar.getDataArray()[iValores - 1][0])
                iValores = lValores
            iValores += 1
        iComprobar += 1
    Datos = RangoComprobar.getDataArray()

    momento2 = time.clock()
    Hoja1.getCellRangeByName("A10").setString("Tiempo de Proceso:")
    Hoja1.getCellRangeByName("A11").setValue(momento2 - momento1)
    Hoja1.getCellRangeByName("L11").setString(repr(dir(Hoja1)))
    Hoja1.getCellRangeByName("L12").setString(oFormularios.getByIndex(0).getByName('Boton_Procesar').Name)
    Hoja1.getCellRangeByName("L13").setString(repr(oFormularios.getByName('Formulario').getByName('Boton_Procesar')))

    if LLAMADABOTON == 1 :
        oBoton_Procesar.Enabled = True
#
    return None
# lists the scripts, that shall be visible inside OOo. Can be omited, if
# all functions shall be visible, however here getNewString shall be surpressed
g_exportedScripts = BusquedaTabla,

Ahora el problema es que el botón se desactiva y se activa, cuando termina el proceso, no durante el mismo, ¿a alguien se le ocurre algo para forzar que lo haga durante el procedo?

     Gracias.
edit marcar como ofensivo delete enlace mas
Ingresa/Regístrate para Contestar

Herramientas de Preguntas

1 seguidor

Estadisticas

Preguntado: 2016-01-21 10:49:39 +0200

Visto: 92 veces

Ultima actualización: Jul 16 '16