Проблема индексации Pyuno, которую я хотел бы объяснить

Следующий макрос Python libreoffice Uno работает, но только с try..except заявление.
Макрос позволяет вам выбрать текст в документе писателя и отправить его поисковой системе в браузере по умолчанию.
Проблема в том, что если вы выберете один фрагмент текста,oSelected.getByIndex(0) заполняется, но если выбрать несколько фрагментов текста oSelected.getByIndex(0) не заселен. В этом случае данные начинаются с oSelected.getByIndex(1) а также oSelected.getByIndex(0) оставлено пустым
Я понятия не имею, почему это должно быть, и хотел бы знать, может ли кто-нибудь объяснить это странное поведение.

#!/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 ответ

В вашем коде чего-то не хватает. Это работает без необходимости дополнительного try/except пункт:

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)

Чтобы ответить на ваш вопрос о "странном поведении", мне это кажется довольно простым. Если 0-й элемент пуст, то есть несколько вариантов выбора, которые, возможно, придется обрабатывать по-разному.

Другие вопросы по тегам