Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python拖放初始化问题_Python_Cocoa_Pyobjc - Fatal编程技术网

python拖放初始化问题

python拖放初始化问题,python,cocoa,pyobjc,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

我不知道如何实现窗口的拖放功能,然后将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
我可以删除该文件,但无法从
performdraguoperation
函数内部引用
form\u文件
出口。正如您所看到的,我正在尝试打印它,但它返回一个
NoneType
错误

(原因“:“非类型”对象不可调用”)是在拖动会话期间引发的


我相信您这里的问题是,在您的窗口能够到达之前,早期的一些东西正在处理
-[draggingEntered:
并拒绝拖动

对于典型的AppKit应用程序,在进入窗口之前,会从NIB向第一响应者发送一条操作消息,然后是挂在其背面的任何内容,然后是最里面的视图及其委托,然后是其所有祖先视图及其委托。因此,例如,如果您有一个文本编辑视图来处理拖动消息,并且您在该视图上拖动,那么窗口将看不到它

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

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

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

同时,PyObjC代码(或任何其他基于事件循环或非线性代码)的通用调试提示。当您遇到如下错误时:

(reason '<type 'exceptions.TypeError'>: 'NoneType' object is not callable') was raised     during a dragging session
在拖动会话期间引发了
(原因“:'NoneType'对象不可调用”)

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

您是否实现了
draggingented:
等方法?如果不是,则得到默认值,它总是返回
nsdragooperationne
,这意味着不能删除任何内容。(你读过文档,对吗?)我读过,我发布了从教程中获得的代码,是的,我读过文档。我想知道我是否需要@iAction或其他什么。此外,您可能希望运行Julian Pellico的Pasteboard Inspector、Xcode doc samples的Pasteboard Peek、Heinrich Giesen的Pasteboardtest、Philippe Mougin的Drop Inspector或类似工具(我目前没有任何链接…)来查看正在删除的内容,我觉得问题不在粘贴板上,我一直在检查是否有东西在上面,但我的窗口不接受它。我发布的代码来自一个旧图坦卡蒙,我觉得可能已经过时了。当你把一个文件放到文本框中时,他们会接受文件的url,光标旁边会有一个绿色加号,但我的窗口不会。你能粘贴到你所遵循的教程的链接吗?有人编辑了我的文章,mainWindow工作正常,我也能拖放工作,我试图用文件路径更新我的文本字段(iboutlet form_文件)但是我不能引用它。但是你不能在这里调用
self
form\u file
。您首先需要缩小异常发生的范围,正如我上面解释的,然后记录所有相关对象,以查看哪个对象不是应该的对象。