Макрос OpenOffice Calc в Python - макрос, запускаемый нажатием кнопки, как получить имя этой кнопки?

328
user2551153

Я действительно новичок в этом, и Руководство разработчика 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!" 

Я не хочу создавать дюжину отдельных почти идентичных сценариев для каждой строки - так что их нельзя rowMacroRowAзапускать с помощью определенной кнопки в строке A и т. Д. Я бы предпочел, чтобы все кнопки запускали один и тот же макрос 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. А еще лучше - как получить свою позицию, в частности ряд? (этот я предпочел бы выяснить самостоятельно, если вы подтолкнете меня в правильном направлении).
2

1 ответ на вопрос

2
Jim K

Имя кнопки может быть определено из ActionEvent, который передается в качестве параметра. Для примера ниже я назвал кнопку btnRow4.

Получить позицию сложнее, но это возможно, если получить XShape кнопки из DrawPage. Вот код, который иллюстрирует, как все это работает:

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 3 года назад 0

Похожие вопросы