2013-01-04 89 views
0

我的第一篇文章...在Python腳本中輸出來自NSPasteboard的額外字符

我正在使用python腳本從Mac OS X Lion上的剪貼板中獲取文本。

我設置具有以下功能剪貼板:

def setClip (text): 
    pb = NSPasteboard.generalPasteboard() 
    pb.clearContents() 
    a = NSArray.arrayWithObject_(text) 
    return pb.writeObjects_(a) 

其中text = 「一些文本」

我用下面的檢索剪貼板:

def getClip(): 
    pb = NSPasteboard.generalPasteboard() 
    pbstring = pb.stringForType_(NSString *)dataType 
    return pbstring 

輸出前置用「u」將文字用引號括起來如下:

In [224]: setClip('some text') 
Out[224]: True 

In [225]: getClip() 
Out[225]: "u'some text'" 

如何檢索文本,因爲它應該是輸入到剪貼板?

我對NSPasteboard一無所知。我在stackoverflow上找到了這些代碼片段。

在此先感謝。

附錄:我的實際代碼

from AppKit import * 
    def setClip (text): 
     pb = NSPasteboard.generalPasteboard() 
     pb.clearContents() 
     a = NSArray.arrayWithObject_(text) 
     return pb.writeObjects_(a) 

    def getClip(): 
     pb = NSPasteboard.generalPasteboard() 
     pbstring = pb.stringForType_(NSString *)dataType 
     return pbstring 

這是我在IPython中運行它會發生什麼:

輸出被換成了一個「U」在引號的文本如下:

In [224]: setClip('some text') 
Out[224]: True 

In [225]: getClip() 
Out[225]: "u'some text'" 

試過一個建議從答案 ***

def getClip(): 
    pb = NSPasteboard.generalPasteboard() 
    return pb.stringForType_("public.utf8-plain-text") 

In [332]: getClip() 
Out[332]: u"some text" 

不行。 :-(

是的,我只需要做到這一點。

print getClip() 

而且我現在有

"some text" 
+0

如果使用[dataForType](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSPasteboard_Class/Reference/Reference.html)而不是'stringForType',會發生什麼情況? – unutbu

+0

這不能是你的實際代碼,因爲'getClip'的第二行會引發'SyntaxError'。除非您向我們展示正確的代碼,否則我們無法調試您的代碼。 – abarnert

+0

'pbstring = pb.stringForType_(NSString *)dataType'的語法看起來可能來自不同的語言 - 您能準確地包含您用來生成上述輸出的內容嗎? – RocketDonkey

回答

5

如果你一無所知NSPasteboard,你應該撇去Pasteboard Programming Guide,看看NSPasteboard Class Reference的詳細信息

您給我們的代碼不可能是您正在運行的代碼,因爲:

pbstring = pb.stringForType_(NSString *)dataType 

這是無效的Python。它位於ObjC和Python之間的某處。所以它只會提高SyntaxError。即使我把它弄成明智:

pbstring = pb.stringForType_(dataType) 

或者,如果你想明確:

pbstring = pb.stringForType_(NSString.stringWithString_(dataType)) 

這將只是一個NameError,因爲你還沒有定義dataType任何地方。

那麼,你從哪裏得到dataType?那麼,對於stringForType:參考使得這很清楚:

You must send types or availableTypeFromArray: before invoking stringForType:.

那麼,如果我們所說的pb.types()?我們回來的字符串列表,像這樣:

Out[153]: 
(
    "NeXT smart paste pasteboard type", 
    "com.apple.webarchive", 
    "NeXT Rich Text Format v1.0 pasteboard type", 
    "public.utf8-plain-text", 
    NSStringPboardType, 
    … 
) 

少數的內置類型將不會從AppKit的進口* ,從可可進口* , or similar, you can just refer to it as NSStringPboardType回來作爲字符串文字像u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, like NSStringPboardType . If you've done `。

反正挑一些看起來合理,並使用它:

In [156]: pb.stringForType_(NSStringPboardType) 
Out[156]: u'some text' 

一切都很好!

那麼,爲什麼你得到"u'some text'",而不是隻有u'some text'?我的猜測是,在你真實的代碼中,setClipgetClip正在做一個額外repr(s)的地方。例如:

In [165]: s=u'some text' 

In [166]: repr(s) 
Out[166]: "u'some text'" 

In [167]: s 
Out[167]: u'some text' 

Out[166]可能看起來很熟悉。最有可能的是,你已經在你的代碼中完成了等價物。但是既然你沒有在你向我們展示的代碼中完成它,我們無法猜測在哪裏。

getClip()正確的方法是,使一個類型list在你的優先順序,然後做這樣的事情:

def getClip(): 
    pb = NSPasteboard.generalPasteboard() 
    best_type = pb.availableTypeFromArray_(myFavoriteTypes) 
    if best_type: 
     return pb.stringForType_(best_type) 

這似乎是一個痛苦和不必要的。你不能只是做return pb.stringForType_(best_type[0])並跳過整個availableTypeFromArray_廢話?在實踐中,如果你想要的類型是NSStringPboardType,那麼到目前爲止,每個OS X版本都可能會遇到它,因爲它可能是宇宙中的每個程序,因爲將文本放在剪貼板上並沒有意義以該格式提供。但它仍然是錯誤的,也是一個不好的習慣。 (另外,也許你實際上寧願用來獲取UTF-8字節而不是Unicode字符串,這在Python 2.x中可能更容易處理,或者在3.3中更加高效。)

當你做事情是對的,如果你只是在控制檯輸入getClip(),你會看到u'some text'而不是'u"some text"'。 「但是堅持下去」,你說,「那裏仍然有一個'u'和一對引號,即使沒有兩個引號,所以它仍然是壞的!不,這不對。看看這個:

In [182]: s=u'some text' 

In [183]: s 
Out[183]: u'some text' 

In [184]: print s 
some text 

或者這樣:

In [185]: s='some text' 

In [186]: s 
Out[186]: 'some text' 

In [187]: print s 
some text 

每當你只需要輸入一個字符串(或返回一個字符串的函數)在交互式控制檯,它打印出帶有引號的字符串。但是引號實際上並不在字符串中 - 正如您在明確使用print語句時所看到的那樣。

所以,如果你看到這一點:

In [332]: getClip() 
Out[332]: u"some text" 

這實際上是正確的。它與上面的s=u'some text'示例相同。字符串中沒有引號或u個字符;這就是交互式解釋器顯示您在命令行中鍵入的字符串的方式。爲了驗證它,只是print結果:

In [332]: print getClip() 
some text 

或者其存儲在一個文件中:

In [188]: with open('test.txt', 'w') as f: 
    .....:  f.write(getClip()) 
    .....: 

在文本編輯器,沒有引號現在打開test.txt,沒有u

+0

顯然,正如本文中提到的,http://cl.ly/3z1T0Q2L2b44,當涉及到前綴'u'時,我只需要「吮吸它」。 – DMfll

+0

@ user1913726:不,這不是你的實際問題。字符串的'repr'確實有'u',但即使沒有,你也有額外的引號。你的問題是你有字符串的'repr'而不是字符串本身,這就是你需要解決的問題。 – abarnert

+0

我只想從剪貼板中抓取文本並使用python進行處理。因爲我的主要目標是使用python,所以我現在沒有時間深入NSPasteboard。感謝您的幫助。 – DMfll