“如何接受”;“打开文档”;基于py2app的Python应用程序已经运行时的事件?

“如何接受”;“打开文档”;基于py2app的Python应用程序已经运行时的事件?,python,macos,py2app,appleevents,Python,Macos,Py2app,Appleevents,我一直在OS X 10.10上构建一个64位Python 3.4.2应用程序,我使用py2app 0.9将其打包为Mac应用程序。 我已经修改了应用程序的Info.plist文件,以便OSX知道具有特定文件名后缀的文件可以由我的应用程序打开 当用户双击Finder中具有特定文件名后缀的文件时,将打开应用程序,并将双击文件的名称作为参数发送给应用程序 但是,如果应用程序已经在运行,并且我双击了第二个具有匹配文件名后缀的文件,则该文件名似乎不会被移交给我的应用程序 这正是我试图实现的:无论我的应用程

我一直在OS X 10.10上构建一个64位Python 3.4.2应用程序,我使用py2app 0.9将其打包为Mac应用程序。 我已经修改了应用程序的Info.plist文件,以便OSX知道具有特定文件名后缀的文件可以由我的应用程序打开

当用户双击Finder中具有特定文件名后缀的文件时,将打开应用程序,并将双击文件的名称作为参数发送给应用程序

但是,如果应用程序已经在运行,并且我双击了第二个具有匹配文件名后缀的文件,则该文件名似乎不会被移交给我的应用程序

这正是我试图实现的:无论我的应用程序是否已经运行,如果我双击Finder中的匹配文件,它都应该在我的应用程序中打开

我看到py2app创建了文件Contents/Resources/boot.py,它似乎捕获了Finder发送的odoc Apple事件,并将其发送到我的Python应用程序

我在boot.py文件中添加了一些日志记录,发现当我的py2app捆绑Python应用程序已经运行并且双击Finder中的一个文件时,boot.py似乎没有被调用

如有任何意见,将不胜感激

提前多谢了


André

我刚刚了解到,Mac上的Tk可以处理一些应用程序事件,例如打开文档

在中有一个很好的示例,在中列出了特定于Mac的Tk函数。 基本上你只需要添加一些

tk.createcommand("::tk::mac::OpenDocument", doOpenFile)
在Tk事件循环中,
doOpenFile
需要指向如下函数:

def doOpenFile(*args):
     for f in args:
         do something

这在Python2.7和Python3.4.2中运行良好(尚未测试其他版本)。

这是哪种应用程序,GUI还是命令行?如果是GUI,您使用的是什么框架?我问的原因是,如果您只是使用
--argv仿真
或等效工具,则存在严重的限制(而且,10.9完全破坏了argv仿真,直到py2app 0.8修复它,所以如果10.10再次破坏它,我不会感到惊讶……)。如果您的程序在处理完参数后立即退出,或者您将其设置为多个副本可以并行运行,那么您可以让一切正常运行,但对于典型的Cocoa应用程序,这两种情况都不可接受,因此您必须实际添加处理程序(无论是通过PyObjC还是您正在使用的任何框架)。此外,对于非GUI应用程序,即使argv仿真器正在(例如)循环事件,您希望名称如何传递?您需要提供一些它可以调用的“hook”函数,对吗?这意味着您需要编写一个事件循环。感谢您的快速回复。应用程序正在使用tkinter显示UI。我想为我从Finder中打开的每个文档打开一个窗口,每个窗口都在自己的线程中运行。在中有一个很好的示例,在中列出了特定于Mac的Tk函数。基本上,您只需将类似于
tk.createcommand(“::tk::mac::OpenDocument”,doOpenFile)
的内容添加到tk事件循环中,其中doOpenFile需要指向这样一个函数:
def doOpenFile(*args):对于args中的f:do something
,我在上写了一个详细的说明