如何治疗;“退出”;Mac OS上python中的事件
我需要检测用户何时在dock菜单中按下“退出” 我的应用程序实际上只是一个web界面后端服务器的启动器。我通过手动等待启动的进程结束(轮询和睡眠),将其保留在dock菜单中。ACTIVITY监视器显示它没有响应,所以我添加了一个本机函数来处理诸如“触摸”之类的事件。不响应标志现在消失了,但用户无法退出此应用程序(我想是因为本机函数处理事件) 我使用ctypes访问该本机函数如何治疗;“退出”;Mac OS上python中的事件,python,macos,Python,Macos,我需要检测用户何时在dock菜单中按下“退出” 我的应用程序实际上只是一个web界面后端服务器的启动器。我通过手动等待启动的进程结束(轮询和睡眠),将其保留在dock菜单中。ACTIVITY监视器显示它没有响应,所以我添加了一个本机函数来处理诸如“触摸”之类的事件。不响应标志现在消失了,但用户无法退出此应用程序(我想是因为本机函数处理事件) 我使用ctypes访问该本机函数 TVB = subprocess.popen(args) coreFoundation = cdll.LoadLibrar
TVB = subprocess.popen(args)
coreFoundation = cdll.LoadLibrary('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')
CFRunLoopRunInMode = coreFoundation.CFRunLoopRunInMode # the native function
CFRunLoopRunInMode.restype = c_int32 # its return type
CFRunLoopRunInMode.argtypes = [ c_void_p, c_double, c_bool ] # its arguments types
defaultMode = c_void_p.in_dll(coreFoundation, u'kCFRunLoopDefaultMode') # the default mode to process events
sleepTime = c_double(5) # the duration to process the events
retAfterSourceHandled = c_bool(0) # do NOT return after processing
while not TVB.poll(): # keep alive as long as TVB is alive
CFRunLoopRunInMode(defaultMode, sleepTime, retAfterSourceHandled)
sleep(5)
#detect 'quit' here and stop TVB, then quit
<>我也会考虑其他解决方案<代码> CFRunLoopRunInMode <代码>…类似于
processNextEvent()
的东西将非常理想。解决此问题的一个可能方法是使用和自定义实现
import AppKit
import Foundation
from PyObjCTools import AppHelper
class ApplicationDelegate(Foundation.NSObject):
""" MAC OS UI specific Delegate class """
def applicationDidFinishLaunching_(self, notification):
""" Here you could register a timer to pull your sub-processes, for example. """
pass
def applicationWillTerminate_(self, notification):
""" This is the hook you get for when the user clicks QUIT in dock """
pass
app = AppKit.NSApplication.sharedApplication()
delegate = ApplicationDelegate.alloc().init()
app.setDelegate_(delegate)
AppHelper.runEventLoop()
最后,PyObjC与您尝试的ctypes加载没有太大区别,但它有一些帮助器方法(如AppKit.nsrunlop.currentRunLoop()或AppHelper.stopEventLoop()),可以使python代码更清晰
对于这个解决方案,我假设有一个Python项目进一步打包,以便使用py2app进行部署。我使用了pyObjc版本2.3(在Mac OS x 10.7.5上的Python 2.7中随easy_install一起安装) 此问题的一个可能解决方案是使用和自定义实现
import AppKit
import Foundation
from PyObjCTools import AppHelper
class ApplicationDelegate(Foundation.NSObject):
""" MAC OS UI specific Delegate class """
def applicationDidFinishLaunching_(self, notification):
""" Here you could register a timer to pull your sub-processes, for example. """
pass
def applicationWillTerminate_(self, notification):
""" This is the hook you get for when the user clicks QUIT in dock """
pass
app = AppKit.NSApplication.sharedApplication()
delegate = ApplicationDelegate.alloc().init()
app.setDelegate_(delegate)
AppHelper.runEventLoop()
最后,PyObjC与您尝试的ctypes加载没有太大区别,但它有一些帮助器方法(如AppKit.nsrunlop.currentRunLoop()或AppHelper.stopEventLoop()),可以使python代码更清晰
对于这个解决方案,我假设有一个Python项目进一步打包,以便使用py2app进行部署。我使用了pyObjc版本2.3(在Mac OS x 10.7.5上的Python 2.7中随easy_install一起安装)