![Python 中的 OpenOffice Calc 宏 - 通过单击按钮触发的宏,如何获取该按钮的名称?](https://linux22.com/image/1525593/Python%20%E4%B8%AD%E7%9A%84%20OpenOffice%20Calc%20%E5%AE%8F%20-%20%E9%80%9A%E8%BF%87%E5%8D%95%E5%87%BB%E6%8C%89%E9%92%AE%E8%A7%A6%E5%8F%91%E7%9A%84%E5%AE%8F%EF%BC%8C%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%AF%A5%E6%8C%89%E9%92%AE%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
我对此真的很陌生,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。