1

私の最初の投稿…</p>

私はPythonスクリプトを使用して、Mac OSXLionのクリップボードからテキストを取得しています。

次の機能でクリップボードを設定しました。

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"

立ち入り禁止。:-(

はい。私はこれを行う必要がありました:

print getClip()

そして私は今持っています

"some text"
4

1 に答える 1

5

NSPasteboardについて何も知らない場合は、Pasteboardプログラミングガイドをざっと読み、詳細についてはNSPasteboardクラスリファレンスを参照してください。

あなたが私たちに与えたコードは、あなたが実行しているコードではない可能性があります。理由は次のとおりです。

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,
    …
)

組み込み型のいくつかは、 AppKit import * from Cocoa import* u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, likeNSStringPboardType`のNSStringPboardTypeのような文字列リテラルとして返されません。. If you've done,, or similar, you can just refer to it as

とにかく合理的に見えるものを選び、それを使用してください:

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で、おそらく宇宙のすべてのプログラムで、それを回避できます。クリップボードにテキストを配置するのは意味がなく、その形式で利用できるようにします。しかし、それはまだ間違っており、入り込むのは悪い習慣です。(さらに、実際にはUnicode文字列ではなくUTF-8バイトを取得したい場合があります。これは、Python 2.xで処理する方が簡単で、3.3ではより効率的です。)

正しく行う場合getClip()、コンソールで入力するだけで、のu'some text'代わりにが表示されます'u"some text"'。「でも、ちょっと待ってください」とあなたは言います。「引用符のペアがもう2つなくても、「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 に答える