🚨 Das LibreOffice Forum braucht jetzt Ihre Hilfe! 🚨
🙏 Spenden Sie heute und sichern Sie die Zukunft unseres LibreOffice-Forums 🙏
Ihre Spende hilft, die Community offen, werbefrei (bei Registrierung) und lebendig zu halten. Vielen lieben Dank!

❤️ DANKE >> << DANKE ❤️

>> Das LibreOffice-Forum lebt von Ihnen – und von vielen Experten, die freiwillig und kostenlos ihr Wissen teilen.<<
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

Verständnissfrage zu LO mit Python und MRI

Alles zur Programmierung im LibreOffice.
Antworten
gerderich
Beiträge: 39
Registriert: Sa 17. Mai 2014, 16:59

Verständnissfrage zu LO mit Python und MRI

Beitrag von gerderich » Mi 11. Mär 2026, 10:56

Moin zusammen,
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()

In Zeile 15 schalte ich meinen DEBUG Modus ein. Es werden jetzt von mir gewollt Meldungen im Terminal angezeigt. Und da steht dann, wenn MRI aufgerufen wird die Meldung: NoneType' object has no attribute 'addMouseListener'.
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

gerderich
Beiträge: 39
Registriert: Sa 17. Mai 2014, 16:59

Re: Verständnissfrage zu LO mit Python und MRI

Beitrag von gerderich » Fr 13. Mär 2026, 20:36

Moin zusammen,
okay, dann nehme ich das mal so hin . Sozusagen als Natur gegeben.
Gruß
Gerd Erich

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2692
Registriert: Fr 10. Dez 2010, 10:01

Re: Verständnissfrage zu LO mit Python und MRI

Beitrag von karolus » Mo 30. Mär 2026, 11:35

Hallo

War zwar nicht deine Frage, aber was du da mittendrin umständlich mit ~20 Zeilen machst, könnte man zum Beispiel auch erschlagen mit:

Code: Alles auswählen

name, age, salary, LIGHT_BLUE =  'Name', 'Age', 'Salary', 0xadd8e6
header = sheet['A1:D1']
header.DataArray = ((name, age, salary, f'Index ( {age} + {salary} )'),)
header.CellBackColor = LIGHT_BLUE
LO25.2.x.y debian 13(trixie) auf Raspberry5 8GB (64bit)
LO25.8.x.y flatpak debian 13(trixie) auf Raspberry5 8GB (64bit)

gerderich
Beiträge: 39
Registriert: Sa 17. Mai 2014, 16:59

Re: Verständnissfrage zu LO mit Python und MRI

Beitrag von gerderich » Mo 30. Mär 2026, 18:03

Moin Karolus,
den Code Block hatte ich auf die Schnelle irgendwo abgeschrieben um etwas zum Testen zu haben. Deine Idee mit dem DataArray finde ich super. Kannte ich so nicht.
karolus hat geschrieben:
Mo 30. Mär 2026, 11:35
Hallo

War zwar nicht deine Frage, aber was du da mittendrin umständlich mit ~20 Zeilen machst, könnte man zum Beispiel auch erschlagen mit:

Code: Alles auswählen

name, age, salary, LIGHT_BLUE =  'Name', 'Age', 'Salary', 0xadd8e6
header = sheet['A1:D1']
header.DataArray = ((name, age, salary, f'Index ( {age} + {salary} )'),)
header.CellBackColor = LIGHT_BLUE
Danke dafür.
Meine APP ist jetzt soweit fertig und läuft. Mal sehen, ob ich das Teil hier mal veröffentliche.
Gruß
Gerd Erich


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten