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_fileperformDragOperation函数内部引用插座。如您所见,我正在尝试打印它,但它返回NoneType错误。

(原因 '<type 'exceptions.TypeError'>: 'NoneType' object is not callable')在拖动会话期间引发

4

1 回答 1

0

我相信您的问题是响应者链中较早的东西正在处理-[draggingEntered:]和拒绝拖动,然后您的窗口才能到达它。

对于一个典型的 AppKit 应用程序,在到达窗口之前,一条操作消息会从 NIB 发送给 First Responder,任何挂在它后面的东西,然后是最里面的视图及其委托,然后是它的所有祖先视图及其委托. 因此,例如,如果您有一个处理拖动消息的文本编辑视图,并且您在该视图上拖动,则窗口将看不到它。

无论如何,有很多方法可以调试它,但最简单的方法是让每个方法从、ing (或ging 或ging )结果迭代nextResponder()链。然后你可以看到你在阻止谁。selfprintlogging.logNSLog

由于我们在评论中讨论了许多其他问题,我不确定这是否是真正解决您问题的问题。但特别要提出一件事:

我不认为 PyObjC 是这里问题的一部分。当 Cocoa 运行时向 PyObjC 对象发送 ObjC 消息-[draggingEntered:]时,PyObjC 运行时通过查找draggingEntered_方法并神奇地转换它来处理它。(好吧,我说的是魔法,但它是简单的科学。另外,因为它是声波的,所以它不会做木头。)@IBAction在相同的地方你需要一个 ObjC 程序需要(IBAction),这些在 Cocoa 文档中有很好的记录。

同时,PyObjC 代码(或几乎任何其他基于事件循环或其他非线性代码)的通用调试技巧。当您收到这样的错误时:

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

很难弄清楚到底出了什么问题。但是您可以在引发的函数内部处理异常,并获取所需的所有信息。您可以在每一行周围包裹一个try/except以确定哪一行被提出,您可以print整个回溯,而不仅仅是摘要,等等。

于 2013-01-10T19:39:38.343 回答