OpenOffice Calc-Makro in Python - Makro, das durch Klicken auf eine Schaltfläche ausgelöst wird. Wie erhält man einen Namen für diese Schaltfläche?

691
user2551153

Ich bin wirklich neu in diesem Bereich und OpenOffice Developer's Guide ist zu schwer für mich zu verstehen, oder ich würde mir selbst helfen.

Ich habe eine große Anzahl von Zeilen mit Daten und in jeder Zeile möchte ich eine Schaltfläche, die ein bestimmtes Makro auslöst rowMacro. Dieses Makro analysiert / modifiziert Daten in dieser bestimmten Zeile. Der Einfachheit halber sagen wir, es schreibt irgendwo in der Reihe eine beliebige Zeichenfolge:

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

Ich möchte nicht für jede Zeile ein Dutzend separater, fast identischer Skripte erstellen - also kein rowMacroRowAAuslösen durch eine bestimmte Schaltfläche in Zeile A usw. Ich hätte lieber eine Reihe von Tasten, die alle dasselbe Python-Makro auslösen. Dieses Makro muss irgendwie bestimmen, welche Schaltfläche verwendet wurde (jede Schaltfläche hat einen eindeutigen Namen) und nur die entsprechende Zeile ändern. Also muss ich den Weg finden, um einen Tastennamen in Python zu bekommen (ich weiß, wie ich damit umgehen soll).

Ich stieß auf eine Webseite mit einem Auszug wie diesem:

# 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 

aber ich weiß nicht, wie ich die Lösung meines Problems von dieser abziehen kann.

Zusammenfassen:

  1. Wie bekomme ich den Namen einer Schaltfläche, mit der ein Makro ausgelöst wurde?
  2. Besser noch - wie bekommt man seine Position, insbesondere eine Reihe? (Ich würde es lieber selbst herausfinden, wenn Sie mich in die richtige Richtung drängen).
2

1 Antwort auf die Frage

2
Jim K

Der Name der Schaltfläche kann aus dem ActionEvent ermittelt werden, das als Parameter übergeben wird. Für das Beispiel unten habe ich den Button benannt btnRow4.

Die Position zu erhalten ist schwieriger, jedoch möglich, indem die XShape der Schaltfläche von DrawPage abgerufen wird. Hier ist ein Code, der veranschaulicht, wie das alles funktioniert:

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) 

Eine Diskussion darüber getPosition()findet sich unter https://forum.openoffice.org/de/forum/viewtopic.php?f=20&t=82422 .

Das ist es! Danke ein Dutzend. Kein Follow-up nötig, das Beispiel hat mir sehr geholfen. user2551153 vor 7 Jahren 0