我的第一篇文章…
我正在使用python脚本从Mac上的剪贴板获取文本。
我使用以下函数设置剪贴板:
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'"answer*** 尝试了一个建议
def getClip():
pb = NSPasteboard.generalPasteboard()
return pb.stringForType_("public.utf8-plain-text")
In [332]: getClip()
Out[332]: u"some text"不去。:-(
是。我只需要这样做:
print getClip()我现在有
"some text"发布于 2013-01-04 22:20:13
如果您对NSPasteboard一无所知,则应该浏览纸板程序设计指南,并查看NSPasteboard类引用以获得详细信息。
您给我们的代码不可能是您正在运行的代码,因为:
pbstring = pb.stringForType_(NSString *)dataType这是无效的Python。它介于ObjC和Python之间。所以它只会引发一个SyntaxError。即使我把它变成理智的东西:
pbstring = pb.stringForType_(dataType)或者,如果你想说得很清楚:
pbstring = pb.stringForType_(NSString.stringWithString_(dataType))这将只是一个NameError,因为您还没有在任何地方定义dataType。
那么,你从哪里得到dataType呢?stringForType:的引用非常清楚地表明了这一点:
必须在调用availableTypeFromArray:之前发送类型或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,
…
)一些内置类型不会以字符串形式返回,比如从Cocoa * u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, likeNSStringPboardType. If you've donefrom AppKit import *, *, or similar, you can just refer to it asNSStringPboardType`。
无论如何,选择一些看起来合理的东西,然后使用它:
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的每个版本,可能是宇宙中的每个程序,因为将文本放在剪贴板上而不是以这种格式提供文本是没有意义的。但这仍然是错误的,也是一个坏习惯。(此外,您可能实际上更喜欢获得UTF-8字节,而不是Unicode字符串,后者在Python2.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。
https://stackoverflow.com/questions/14165442
复制相似问题