在Python脚本中输出来自NSPasteboard的额外字符
我的第一篇文章...在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一无所知。我在*上找到了这些代码片段。
在此先感谢。
附录:我的实际代码
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"
如果你一无所知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'
?我的猜测是,在你真实的代码中,setClip
或getClip
正在做一个额外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
。
如果使用[dataForType](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSPasteboard_Class/Reference/Reference.html)而不是'stringForType',会发生什么情况? – unutbu
这不能是你的实际代码,因为'getClip'的第二行会引发'SyntaxError'。除非您向我们展示正确的代码,否则我们无法调试您的代码。 – abarnert
'pbstring = pb.stringForType_(NSString *)dataType'的语法看起来可能来自不同的语言 - 您能准确地包含您用来生成上述输出的内容吗? – RocketDonkey