Pyuno indexing issue that I would like an explanation for

喜你入骨 提交于 2019-12-13 06:05:24

问题


The following python libreoffice Uno macro works but only with the try..except statement.
The macro allows you to select text in a writer document and send it to a search engine in your default browser.
The issue, is that if you select a single piece of text,oSelected.getByIndex(0) is populated but if you select multiple pieces of text oSelected.getByIndex(0) is not populated. In this case the data starts at oSelected.getByIndex(1) and oSelected.getByIndex(0) is left blank.
I have no idea why this should be and would love to know if anyone can explain this strange behaviour.

#!/usr/bin/python    
import os
import webbrowser
from configobj import ConfigObj
from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY
from com.sun.star.awt.MessageBoxButtons import DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE

from com.sun.star.awt.MessageBoxType import MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX

def fs3Browser(*args):
#get the doc from the scripting context which is made available to all scripts
    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()
    doc = XSCRIPTCONTEXT.getDocument()
    parentwindow = doc.CurrentController.Frame.ContainerWindow

    oSelected = model.getCurrentSelection()
    oText = ""
    try:
        for i in range(0,4,1):
            print ("Index No ", str(i))
            try:
                oSel = oSelected.getByIndex(i)
                print (str(i), oSel.getString())
                oText += oSel.getString()+" "
            except:
                break
    except AttributeError:
        mess = "Do not select text from more than one table cell"
        heading = "Processing error"
        MessageBox(parentwindow, mess, heading, INFOBOX, BUTTONS_OK)
        return

    lookup = str(oText)
    special_c =str.maketrans("","",'!|@#"$~%&/()=?+*][}{-;:,.<>')
    lookup = lookup.translate(special_c)
    lookup = lookup.strip()
    configuration_dir = os.environ["HOME"]+"/fs3"
    config_filename = configuration_dir + "/fs3.cfg"
    if  os.access(config_filename, os.R_OK):
        cfg = ConfigObj(config_filename)

    #define search engine from the configuration file
    try:
        searchengine = cfg["control"]["ENGINE"]
    except:
        searchengine = "https://duckduckgo.com"
    if 'duck' in searchengine:
        webbrowser.open_new('https://www.duckduckgo.com//?q='+lookup+'&kj=%23FFD700 &k7=%23C9C4FF &ia=meanings')
    else:
        webbrowser.open_new('https://www.google.com/search?/&q='+lookup)
    return None
def MessageBox(ParentWindow, MsgText, MsgTitle, MsgType, MsgButtons):
    ctx = XSCRIPTCONTEXT.getComponentContext()
    sm = ctx.ServiceManager
    si = sm.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx) 
    mBox = si.createMessageBox(ParentWindow, MsgType, MsgButtons, MsgTitle, MsgText)
    mBox.execute()    

回答1:


Your code is missing something. This works without needing an extra try/except clause:

selected_strings = []
try:
    for i in range(oSelected.getCount()):
        oSel = oSelected.getByIndex(i)
        if oSel.getString():
            selected_strings.append(oSel.getString())
except AttributeError:
    # handle exception...
    return
result = " ".join(selected_strings)

To answer your question about the "strange behaviour," it seems pretty straightforward to me. If the 0th element is empty, then there are multiple selections which may need to be handled differently.



来源:https://stackoverflow.com/questions/32411714/pyuno-indexing-issue-that-i-would-like-an-explanation-for

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!