das beiligende python Script. funktioniert einwandfrei. Es wird in einem Terminal gestartet und läuft, wie es soll durch. Mir ist aber etwas aufgefallen, was ich mir nicht erklären kann.
Hier zunächst das Script.
Code: Alles auswählen
#!/usr/bin/env python3
## ------------
# version : 10.3.2026:21.15
#---- python imports
import sys
import subprocess
import time
from tkinter import messagebox as msgbox
# ---- LO API imports
import uno
from com.sun.star.beans import PropertyValue
from pythonscript import ScriptContext
# False if no debugging needed
#DEBUG=False
DEBUG=True
# Start LibreOffice
def start_libreoffice():
try:
process = subprocess.Popen([
r"soffice",
#"--headless",
"--accept=socket,host=localhost,port=2002;urp;StarOffice.Servicemanager",
"--minimized"
])
if DEBUG:
print("LibreOffice process started")
###
return process
except Exception as e:
print(f"Failed to start LibreOffice: {e}")
return None
# Connect to LibreOffice
def connect_to_libreoffice():
local_context = uno.getComponentContext()
resolver = local_context.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", local_context)
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
return context
# Load playground.ods document
def getWorkbook(context):
try:
args = (PropertyValue(Name='Hidden', Value=False),PropertyValue(Name="MacroExecutionMode",Value=1),)
if DEBUG:
print ("props sind eingerichtet")
###
# Pfadangabe nur fuer playground.ods;
path="/home/gerd/projects/playground.ods"
docurl = uno.systemPathToFileUrl(path)
if DEBUG:
print ("path ist gesetzt ..")
###
XSCRIPTCONTEXT = ScriptContext(context, None, None)
desktop = XSCRIPTCONTEXT.getDesktop()
if DEBUG:
print ("desktop definiert .... ")
###
document = desktop.loadComponentFromURL(docurl,"_default",0,args)
if DEBUG:
print ("calc dokument ist geladen!")
return document
except Exception as e:
print(f"Calc File nicht gefunden: {e}")
return None
"""
# funktioniert nicht
def mri(target):
ctx = uno.getComponentContext()
mri = ctx.ServiceManager.createInstanceWithContext(
"mytools.Mri",ctx)
mri.inspect(target)
"""
# funktioniert einwandfrei
def mri(ctx, target):
mri = ctx.ServiceManager.createInstanceWithContext(
"mytools.Mri",ctx)
mri.inspect(target)
def write_to_spreadsheet(ctx,doc):
sheet = doc.Sheets.getByIndex(0) # Get the first sheet
if DEBUG:
print("mri in 'write_to_spreadsheet' wird aufgerufen")
mri(ctx,sheet)
###
# Define headers (abgeschrieben)
header_name_cell = sheet.getCellByPosition(0, 0) # A1
header_name_cell.String = "Name"
header_name_cell.CellBackColor = 0xADD8E6 # Set background color to light blue (RGB: 173, 216, 230)
header_name_cell.CharColor = 0x000000 # Set text color to black (RGB: 0, 0, 0)
header_age_cell = sheet.getCellByPosition(1, 0) # B1
header_age_cell.String = "Age"
header_age_cell.CellBackColor = 0xADD8E6 # Set background color to light blue (RGB: 173, 216, 230)
header_age_cell.CharColor = 0x000000 # Set text color to black (RGB: 0, 0, 0)
header_salary_cell = sheet.getCellByPosition(2, 0) # C1
header_salary_cell.String = "Salary"
header_salary_cell.CellBackColor = 0xADD8E6 # Set background color to light blue (RGB: 173, 216, 230)
header_salary_cell.CharColor = 0x000000 # Set text color to black (RGB: 0, 0, 0)
header_index_cell = sheet.getCellByPosition(3, 0) # D1
header_index_cell.String = "Index (Age + Salary)"
header_index_cell.CellBackColor = 0xADD8E6 # Set background color to light blue (RGB: 173, 216, 230)
header_index_cell.CharColor = 0x000000 # Set text color to black (RGB: 0, 0, 0)
## ---- lets go ----
def main():
try:
# Start LibreOffice
libreoffice_process = start_libreoffice()
#API server take time to fire up
# therefor: start 10 seconds
time.sleep(10)
# Connect to LibreOffice
context = connect_to_libreoffice()
# load an exiting spreadsheet document
doc = getWorkbook(context)
if DEBUG:
print("mri wird aufgerufen")
mri(context,doc)
print("mri wurde aufgerufen")
###
if doc == None : # Es wurde kein CALC File geladen
return
else: # CALC File wurde geladen, kann jetzt bearbeitet werden
write_to_spreadsheet(context,doc)
except Exception as e:
print(f"An error occurred: {e}")
finally:
if libreoffice_process:
msgbox.showinfo("Beenden","App beenden?")
# Store document
doc.store()
# Stop LibreOffice
doc.close(True)
libreoffice_process.terminate()
print("LibreOffice process terminated.")
# Main execution
if __name__ == "__main__":
main()
Wo befindet sich hier das NoneType object ohne das Atribut addMouseListener? Was soll mir diese Meldung sagen?
Wenn ich den DEBUG Modus ausschalte, läuft das Script wie bereits geschrieben durch. Muss ich für weitere Schritte etwas am MRI Aufruf ändern? Oder kann ich die Meldung ignorieren?
Gruß
Gerd Erich