2015-09-05 93 views
0

下面的python libreoffice Uno宏可以工作,但只適用於try..except語句。
該宏允許您選擇書寫器文檔中的文本並將其發送到默認瀏覽器中的搜索引擎。
問題是,如果選擇單個文本,oSelected.getByIndex(0)已填充,但如果選擇多個文本oSelected.getByIndex(0)未填充。在這種情況下,數據從oSelected.getByIndex(1)開始,oSelected.getByIndex(0)留空。
我不知道爲什麼這應該是,並想知道是否有人可以解釋這種奇怪的行爲。Pyuno索引問題,我想解釋一下

#!/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()  
+0

我可以建議創建一個新的標籤'python-uno'。 Python使用uno的文檔非常糟糕,並且在SO上查找Q&A的快速方法會很有幫助。 –

+0

我同意文檔不太好。這太糟糕了,因爲正確使用Python和UNO可以成爲一個強大的組合。也許SO可以提供幫助。 –

+0

這樣的標籤已經存在:[pyuno](http://stackoverflow.com/tags/pyuno/info)。 –

回答

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個元素爲空,則有多個選擇可能需要以不同的方式處理。

+0

我很感謝你的輸入,是的,這確實擺脫了try語句,但同時它還必須通過添加if語句來補償零位數據的缺乏。你關於元素零爲空的觀點意味着有多種選擇,很可能是真實的,但與Uno和python一樣,我沒有發現它在任何地方都有記錄。我認爲,爲了將來的參考,我們只需要牢記這一點。對於最簡單的解決方案,我只是停止關注元素0並將其包含在整個字符串中,因爲最終它只是空格。 –

+0

我可能會要求您回覆您對編輯出的零位數據缺乏的懷疑。雖然我們沒有人知道它是否是密切相關的,但值得記錄下來,以便其他人也能記住類似的問題 –

+0

我不擔心太多這樣的事情,如額外的if語句Python UNO需要。對於更大的項目,很容易在某種自定義迭代器類中抽象出語句。但是,記錄這種行爲是很好的。 –