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


2

나는 이것에 익숙하지 않으며 OpenOffice Developer 's Guide는 너무 이해하기 어렵거나 스스로 도울 것입니다.

데이터가 많은 행이 있고 각 행에 특정 매크로를 트리거하는 버튼을 원합니다 rowMacro. 해당 매크로는 해당 특정 행의 데이터를 분석 / 수정합니다. 간단히하기 위해 행의 임의의 위치에 임의의 문자열을 작성한다고 가정 해 봅시다.

import uno
oDoc = XSCRIPTCONTEXT.getDocument()

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

각 행에 대해 12 개의 별도의 거의 동일한 스크립트를 만들고 싶지 않으므로 rowMacroRowA행 A의 특정 버튼으로 트리거 되지 않습니다 . 모두 동일한 파이썬 매크로를 트리거하는 많은 버튼이 있습니다. 이 매크로는 어떤 버튼이 사용되었는지 (각 버튼마다 고유 한 이름이 있음)를 결정하고 적절한 행만 수정해야합니다. 그래서 파이썬에서 버튼 이름을 얻는 방법을 알아야합니다 (나는 거기에서 그것을 다루는 방법을 알게 될 것입니다).

다음 과 같이 발췌 한 웹 페이지 를 발견 했습니다.

# 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. 더 나은 아직 위치, 특히 행을 얻는 방법? (이것은 올바른 방향으로 나를 밀면 오히려 스스로 알아 내고 싶습니다).

답변:


2

버튼 이름은 매개 변수로 전달되는 ActionEvent 에서 확인할 수 있습니다 . 아래 예제에서는 버튼의 이름을 지정했습니다 btnRow4.

위치를 얻는 것은 어렵지만 DrawPage에서 버튼 의 XShape 를 얻어서 가능합니다 . 다음은이 모든 작동 방식을 보여주는 코드입니다.

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 .


그게 다야! 고마워. 후속 조치가 필요하지 않았으므로 예제가 많은 도움이되었습니다.
user2551153
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.