我的第一篇帖子......
我正在使用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"
不行。 : - (
YES。我只需要这样做:
print getClip()
我现在有
"some text"
答案 0 :(得分: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:
的引用非常清楚:
在调用stringForType:。
之前,您必须发送types或availableTypeFromArray :.
那么,如果我们致电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,
…
)
一些内置类型不会像来自Cocoa import * u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, like
的AppKit import * . If you've done
中的,
NSStringPboardType , or similar, you can just refer to it as
那样返回字符串文字* In [156]: pb.stringForType_(NSStringPboardType)
Out[156]: u'some text'
NSStringPboardType `。
无论如何选择看起来合理的东西并使用它:
"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_
而跳过整个getClip()
胡说八道吗?实际上,如果您想要的类型是NSStringPboardType,那么到目前为止,您可以使用每个版本的OS X来处理它,可能是宇宙中的每个程序,因为将文本放在剪贴板上是没有意义的以该格式提供。但它仍然是错误的,并且是一个坏习惯。 (此外,也许你实际上更喜欢来获取UTF-8字节而不是Unicode字符串,这在Python 2.x中可能更容易处理,或者在3.3中更有效。)
当您做正确的事情时,如果您只是在控制台上输入u'some text'
,则会看到'u"some text"'
而不是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
- 没有引号,没有{{1}}。