1

我的第一篇文章……</p>

我正在使用 python 脚本从 Mac OS X Lion 上的剪贴板上获取文本。

我使用以下功能设置剪贴板:

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

where 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"
4

1 回答 1

5

如果你对 NSPasteboard 一无所知,你应该浏览一下粘贴板编程指南,并查看NSPasteboard 类参考以了解详细信息。

您给我们的代码不可能是您正在运行的代码,因为:

pbstring = pb.stringForType_(NSString *)dataType

这不是有效的 Python。它介于 ObjC 和 Python 之间。所以它只会提高一个SyntaxError. 即使我把它变成合理的东西:

pbstring = pb.stringForType_(dataType)

或者,如果你想明确:

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

这只是 a NameError,因为您没有dataType在任何地方定义。

那么,你从哪里来dataType?好吧,参考stringForType:说明很清楚:

您必须在调用 stringForType: 之前发送类型或 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,
    …
)

一些内置类型不会以字符串文字的形式返回,例如u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, likeNSStringPboardType . If you've donefrom AppKit import * ,from Cocoa import * , or similar, you can just refer to it asNSStringPboardType`。

无论如何选择看起来合理的东西并使用它:

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

一切都很好!

那么,为什么你得到"u'some text'"而不是 just 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.

于 2013-01-04T22:20:13.127 回答