python拖放初始化问题

时间:2013-01-09 21:21:40

标签: python cocoa pyobjc

我很困惑如何实现窗口的拖放功能,然后将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'对象不可调用')是在拖动会话期间引发的

1 个答案:

答案 0 :(得分:0)

我相信你的问题是Responder Chain中早些时候处理-[draggingEntered:]并且在你的窗口到达之前拒绝阻力。

对于一个典型的AppKit应用程序,在进入窗口之前,一条动作消息从NIB转到First Responder,任何东西都挂在它的背面,然后是最里面的视图及其委托,然后是它的所有祖先视图和他们的代表。因此,例如,如果您有一个处理拖动消息的文本编辑视图,并且您拖动该视图,则窗口将看不到它。

无论如何,有很多方法可以调试它,但最简单的方法是让每个方法从nextResponder()self(或{{1}迭代print链。 ging或logging.log ging)结果。然后你可以看到你阻止了谁。

由于我们在评论中讨论了很多其他问题,我不确定这是否真的解决了你的问题。但有一点特别要提出:

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

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

(IBAction)

很难弄清楚到底出了什么问题。但是您可以在引发的函数内处理异常,并获取所需的所有信息。您可以围绕每一行包裹(reason '<type 'exceptions.TypeError'>: 'NoneType' object is not callable') was raised during a dragging session / try以确定引出的行,您可以except整个追溯而不仅仅是摘要等。