Python의 OpenOffice Calc 매크로 - 버튼 클릭으로 트리거되는 매크로, 해당 버튼의 이름을 얻는 방법은 무엇입니까?

Python의 OpenOffice Calc 매크로 - 버튼 클릭으로 트리거되는 매크로, 해당 버튼의 이름을 얻는 방법은 무엇입니까?

저는 이것에 대해 정말 처음 접했고 OpenOffice 개발자 가이드는 이해하기 너무 어렵습니다. 그렇지 않으면 스스로 해결하고 싶습니다.

나는 데이터가 있는 많은 수의 행을 갖고 있으며 각 행에 특정 매크로를 실행하는 버튼을 원합니다 rowMacro. 해당 매크로는 해당 특정 행의 데이터를 분석/수정합니다. 단순화를 위해 행 어딘가에 임의의 문자열을 쓴다고 가정해 보겠습니다.

import uno
oDoc = XSCRIPTCONTEXT.getDocument()

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

나는 각 행에 대해 수십 개의 별도의 거의 동일한 스크립트를 만들고 싶지 않습니다. 따라서 rowMacroRowAA 행의 특정 버튼에 의해 트리거되지 않습니다. 오히려 동일한 Python 매크로를 트리거하는 여러 개의 버튼이 있는 것이 좋습니다. 해당 매크로는 어떤 버튼이 사용되었는지(각 버튼에는 고유한 이름이 있음) 결정하고 적절한 행만 수정해야 합니다. 그래서 Python에서 버튼 이름을 얻는 방법을 알아내야 합니다. (여기서부터 처리 방법을 알게 될 것입니다.)

나는 우연히웹 페이지다음과 같이 발췌했습니다.

# 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

하지만 나는 그것으로부터 내 문제의 해결책을 어떻게 추론해야 할지 모르겠습니다.

요약:

  1. 매크로를 실행하는 데 사용된 버튼의 이름을 얻는 방법은 무엇입니까?
  2. 더 나은 점은 위치, 특히 행을 얻는 방법입니다. (당신이 나를 올바른 방향으로 밀어준다면 이것은 내가 스스로 알아내는 것이 낫습니다).

답변1

버튼 이름은 다음에서 확인할 수 있습니다.액션이벤트매개변수로 전달되는 것입니다. 아래 예에서는 버튼 이름을 으로 지정했습니다 btnRow4.

일자리를 얻는 것이 더 어렵지만, 자격증을 취득하면 가능합니다.XShapeDrawPage의 버튼입니다. 이 모든 것이 어떻게 작동하는지 보여주는 코드는 다음과 같습니다.

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)

에 대한 토론은 getPosition()다음 위치에 있습니다.https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=82422.

관련 정보