如果您对NSPasteboard一无所知,您应该浏览一下Pasteboard Programming Guide,并查看{a2}以了解详细信息。在
您给我们的代码不可能是您正在运行的代码,因为:pbstring = pb.stringForType_(NSString *)dataType
这不是有效的Python。它在ObjC和Python之间的某个地方。所以它只会引发一个SyntaxError。即使我把它变成合理的:
^{pr2}$
或者,如果你想明确地说: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 import*, or similar, you can just refer to it asNSStringPboardType. If you've done来自AppKit import*,来自Cocoa import*, or similar, you can just refer to it asNSStringPboardType`。在
总之,选择一些看起来合理的东西并使用它:In [156]: pb.stringForType_(NSStringPboardType)
Out[156]: u'some text'
一切都很好!在
那么,为什么你得到"u'some text'"而不是{}?我的猜测是,在实际代码中,setClip或{}在某处执行额外的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,那么到目前为止,在OSX的每一个版本中,可能在宇宙中的每一个程序中,你都可以摆脱它,因为把文本放在剪贴板上而不以那种格式提供是没有意义的。但这仍然是错误的,而且是个坏习惯。(此外,也许您更喜欢使用UTF-8字节而不是Unicode字符串,这在python2.x中更容易处理,或者在3.3中更有效)
当你在控制台上看到{cd23>时,你会看到{cd17>而不是^在控制台上但是,你说,“还有一个‘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。在