Macro de OpenOffice Calc en Python: macro activada al hacer clic en un botón, ¿cómo obtener el nombre de ese botón?

Macro de OpenOffice Calc en Python: macro activada al hacer clic en un botón, ¿cómo obtener el nombre de ese botón?

Soy realmente nuevo en esto y la Guía del desarrollador de OpenOffice es demasiado difícil de entender para mí o me ayudaría yo mismo.

Tengo una gran cantidad de filas con datos y en cada fila quiero un botón que active una macro en particular rowMacro. Esa macro analizará/modificará datos en esa fila en particular. Para simplificar, digamos que simplemente escribe una cadena arbitraria en algún lugar de la fila:

import uno
oDoc = XSCRIPTCONTEXT.getDocument()

def rowMacro(*args):
  oSheet = oDoc.CurrentController.ActiveSheet
  oCell1 = oSheet.getCellRangeByName("A4")
  CurContr=oDoc.getCurrentController().getSelection()
  oCell1.String = "Tada!"

No quiero crear una docena de scripts separados casi idénticos para cada fila, por lo que no rowMacroRowAse activan con un botón específico en la fila A, etc. Prefiero tener varios botones que activen la misma macro de Python. Esa macro necesita de alguna manera determinar qué botón se usó (cada botón tiene un nombre único) y modificar solo la fila apropiada. Entonces necesito encontrar la manera de obtener el nombre de un botón en Python (sabré cómo manejarlo desde allí).

Me topé con unPágina webcon un extracto como este:

# get the sheet
accueil_sheet = model.Sheets.getByName("Accueil")
# access the draw page
oDrawPage = accueil_sheet.DrawPage
# count the number of form
oDrawPage.getForms().getCount()
# get the list box of the control element
ListBox = oDrawPage.getForms().getByIndex(0).getByName("Listbox")
# get the list box item list
ListBox.StringItemList
# get the list box controller
ListBoxCtrl = model.getCurrentController().getControl(ListBox)
# get the selected items:
ListBoxCtrl.SelectedItems

pero no sé cómo deducir de eso la solución de mi problema.

Para resumir:

  1. ¿Cómo obtener el nombre de un botón que se utilizó para activar una macro?
  2. Mejor aún: ¿cómo conseguir su posición, en particular una fila? (Este prefiero resolverlo por mi cuenta si me empujas en la dirección correcta).

Respuesta1

El nombre del botón se puede determinar a partir de laEvento de acciónque se pasa como parámetro. Para el siguiente ejemplo, nombré el botón btnRow4.

Conseguir el puesto es más difícil, pero es posible obteniendo elForma Xdel botón de DrawPage. Aquí hay un código que ilustra cómo funciona todo esto:

def rowMacro(action_event=None):

    ## Get the button name.
    if action_event:
        button_name = action_event.Source.Model.getName()
    else:
        button_name = ''
    if button_name == 'btnRow4':
        rowname = "4"
    else:
        rowname = "5"

    ## Get the button position.
    oDoc = XSCRIPTCONTEXT.getDocument()
    oSheet = oDoc.CurrentController.ActiveSheet
    oDrawPage = oSheet.DrawPage
    oShape = None
    for i in range(oDrawPage.Count):
        aShape = oDrawPage.getByIndex(i)
        if aShape.supportsService("com.sun.star.drawing.ControlShape"):
            if aShape.getControl().getName() == button_name:
                oShape = aShape
    if oShape:
        ypos = oShape.getPosition().Y
    else:
        ypos = "(didn't click on a button)"

    ## Show results.
    oCell = oSheet.getCellRangeByName("A" + rowname)
    oCell.String = "Y Position: " + str(ypos)

Una discusión sobre getPosition()está enhttps://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=82422.

información relacionada