0

ウィンドウにドラッグアンドドロップ機能を実装して、URLをテキストボックスに表示する方法について混乱しています。

行き詰まったところを更新しました

class controller(NSWindow):

#File to encode or decode
form_file = IBOutlet()
mainWindow = IBOutlet()


#drag and drop ability
def awakeFromNib(self):
    self.registerForDraggedTypes_([NSFilenamesPboardType, None])
    print 'registerd drag type'


def draggingEntered_(self, sender):
    print 'dragging entered doctor who'
    pboard = sender.draggingPasteboard()
    types = pboard.types()
    opType = NSDragOperationNone
    if NSFilenamesPboardType in types:
        opType = NSDragOperationCopy
    return opType


def performDragOperation_(self,sender):
    print 'preform drag operation'
    pboard = sender.draggingPasteboard()
    successful = False
    if NSFilenamesPboardType in pboard.types():
        print 'my actions finally working'
        fileAStr = pboard.propertyListForType_(NSFilenamesPboardType)[0]
        print type(fileAStr.encode('utf-8'))
        successful = True
    print self.form_file
    return successful

ファイルをドロップすることはできますがform_file、関数内からアウトレットを参照できませんperformDragOperation。ご覧のとおり、印刷しようとしていますが、NoneTypeエラーが返されます。

(理由'<type' exceptions.TypeError'>:' NoneType'オブジェクトは呼び出し可能ではありません')ドラッグセッション中に発生しました

4

1 に答える 1

0

ここでのあなたの問題は、レスポンダーチェーンの初期の何かが、ウィンドウがドラッグに到達する前にドラッグを処理-[draggingEntered:]して拒否していたことだと思います。

一般的なAppKitアプリの場合、ウィンドウに到達する前に、アクションメッセージがNIBからFirst Responderに送信され、その背面にフックされているものがすべて、次に最も内側のビューとそのデリゲート、次にすべての祖先ビューとそのデリゲートに送信されます。 。したがって、たとえば、ドラッグメッセージを処理するテキスト編集ビューがあり、そのビューの上にドラッグすると、ウィンドウには表示されません。

とにかく、これをデバッグする方法はたくさんありますが、最も簡単な方法は、各メソッドに結果のing(またはgingまたはging)からチェーンを反復させることですnextResponder()。次に、ブロックしているユーザーを確認できます。selfprintlogging.logNSLog

コメントで話し合った他の問題がたくさんあったので、これが実際にあなたの問題を解決したものであったかどうかはわかりません。しかし、特に提起すべきことが1つあります。

ここでは、PyObjCが問題の一部ではなかったと思います。CocoaランタイムがPyObjCオブジェクトのようにObjCメッセージを送信する-[draggingEntered:]と、PyObjCランタイムはメソッドを探しdraggingEntered_て魔法のように変換することでそれを処理します。(まあ、私は魔法と言いますが、それは単純な科学です。また、それは音であるため、木材を使用しません。)@IBAction同じ場所にObjCプログラムが必要です(IBAction)。これは、Cocoaのドキュメントにかなり詳しく記載されています。

一方、PyObjCコード(または他のイベントループベースまたはその他の非線形コード)の汎用デバッグのヒントの1つ。次のようなエラーが発生した場合:

(reason '<type 'exceptions.TypeError'>: 'NoneType' object is not callable') was raised     during a dragging session

何がうまくいかなかったのかを理解するのは難しいです。ただし、発生した関数内で例外を処理し、必要なすべての情報を取得できます。各行を/で囲んで、どの行が発生したかを把握したり、try要約だけでなくトレースバック全体を取得したりできます。exceptprint

于 2013-01-10T19:39:38.343 に答える