我很困惑如何实现窗口的拖放功能,然后将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'对象不可调用')是在拖动会话期间引发的
答案 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
整个追溯而不仅仅是摘要等。