2013-01-09 41 views
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 

我可以刪除文件,但我無法從performDragOperation函數內refrence的form_file出口。正如你可以看到我試圖打印它,但它返回一個NoneType錯誤。

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

你實現了'draggingEntered:'等方法嗎?如果沒有,你會得到默認值,它總是返回'NSDragOperationNone',這意味着什麼都不能被丟棄。 (您已閱讀[拖放介紹](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DragandDrop/DragandDrop.html#//apple_ref/doc/uid/10000069i)該文件,對吧?) – abarnert

+0

我做到了,我發佈了我從教程中獲得的代碼,是的,我讀過文檔。我想知道是否需要@IBAction或其他東西。 – lostAstronaut

+0

此外,您可能需要運行Julian Pellico的Pasteboard Inspector,Xcode doc樣本的Pasteboard Peeker,Heinrich Giesen的Pasteboardtest,Philippe Mougin的Drop Inspector或類似的工具(我目前沒有任何鏈接... )看看究竟是什麼被丟棄,並確保實際上有一個'NSURLPboardType'。 – abarnert

回答

0

我相信在這裏你的問題是,早在Responder Chain事情正在處理-[draggingEntered:],拒絕拖累,之前你的窗口可以得到它。

對於一個典型的AppKit應用程序,在進入窗口之前,一個動作消息從NIB進入第一響應者,任何東西都會鉤到它的背面,然後是最內層的視圖及其委託,然後是其所有的祖先意見和他們的代表。因此,例如,如果您有一個處理拖動消息的文本編輯視圖,並且拖動該視圖,該窗口將不會看到它。

無論如何,有很多方法來調試這一點,但最簡單的一種是隻已分別從法迭代selfnextResponder()鏈,print ING(或logging.log更改或NSLog更改)的結果。然後你可以看到你阻止了誰。

由於我們在評論中討論過一堆其他問題,我不確定這是否真的解決了您的問題。但有一點特別提出來:

我不認爲PyObjC是這裏問題的一部分。當Cocoa運行時發送一個像-[draggingEntered:]這樣的ObjC消息給一個PyObjC對象時,PyObjC運行時通過尋找一個draggingEntered_方法並以神奇的方式轉換它。 (嗯,我說魔法,但它是簡單的科學,另外,因爲它是聲波,所以它不會做木頭)。在ObjC程序需要(IBAction)的地方需要@IBAction,這在Cocoa文檔中有很好的記錄。同時,爲PyObjC代碼(或任何其他基於事件循環或非線性代碼)提供一個通用調試提示。當你得到這樣的錯誤:

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

很難弄清楚究竟發生了什麼錯誤。但是你可以處理引發的函數內部的異常,並獲得你想要的所有信息。你可以在每一行周圍打一個try/except來找出哪一行出現,你可以用print整個回溯代替總結,等等。

+0

有人編輯我的帖子,mainWindow工作正常,我也得到了拖放工作,我試圖用文件路徑(iboutlet form_file)更新我的文本字段,但我無法引用它。 – lostAstronaut

+0

但是你不是在這裏調用'self'或'form_file'。您首先需要按照上面的解釋縮小發生異常的位置,然後記錄所有相關對象以查看哪些不是應該的。 – abarnert