Acceso a boton desde una macro de python

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,

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.

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