
Я совсем новичок в этом деле, и Руководство разработчика 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
Название кнопки можно определить изДействиеСобытиекоторый передается как параметр. Для примера ниже я назвал кнопку btnRow4
.
Получить должность сложнее, но возможно, получивXШейпкнопки из 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.