如何在wxPython应用程序中使用Mac OS X NSEvents?

时间:2016-10-11 22:17:28

标签: python macos cocoa wxpython pyobjc

我正在编写一个应用程序,必须对Mac OS X上的系统范围的按键做出反应。

所以我找到了一些应该起作用的关键记录器示例,因为所有示例都基于NSSharedApplication()和PyObjC AppHelper.runEventLoop()而我的应用程序是用wxPython编写的。

在这里,我发布了https://github.com/ljos中最简单示例的修改 我认为它应该工作。但事实并非如此。

from AppKit import *
import wx

class AppDelegate(NSObject):
    def applicationDidFinishLaunching_(self, aNotification):
        NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, handler)

def handler(event):
    print (u"%@", event)

app = wx.App()
delegate = AppDelegate.alloc().init()
NSApp().setDelegate_(delegate)
app.MainLoop()

很明显,MainLoop()并没有捕获委托的NSEvents。

在app = wx.App()之后,正确返回NSApp()。那么为什么这不起作用呢?我如何使它工作?

1 个答案:

答案 0 :(得分:0)

由于没有人回答我在视野中以不同角度搜寻。

所以我发现Quartz模块可用于获取键盘和鼠标事件。不需要自定义循环,因此wx.App()和wx.App.MainLoop()不会妨碍。

我还找到了一个名为pynput的漂亮包,它为我做了这样的事情,从而节省了我很多时间。 Quartz非常复杂,很多函数和常量都是乱码。但它做得很好。