【问题标题】:Python CGEventTap Bus ErrorPython CGEventTap 总线错误
【发布时间】:2011-02-14 18:52:24
【问题描述】:

每当我运行此 Python CGEventTap 代码时都会出现总线错误:

def callback(ent):
    loc = CGEventGetLocation(ent)
    print loc

tap = CGEventTapCreate(
    kCGSessionEventTap,
    kCGHeadInsertEventTap, 
    kCGEventTapOptionDefault,
    CGEventMaskBit(kCGEventMouseMoved),
    callback(CGEventRef) )

loop = CFMachPortCreateRunLoopSource(None, tap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, kCFRunLoopCommonModes)

RunApplicationEventLoop()

我有什么明显的遗漏吗?

【问题讨论】:

  • 您是否链接反对 ApplicationServices 框架(即,不只是 importing 它)?
  • @josh 我已经尝试了以下所有方法:导入 objc,从 Foundation 导入 *,从 PyObjCTools 导入 AppHelper,从 Quartz 导入 *,从 AppKit 导入 *。我需要哪些不需要哪些? 链接是什么意思?
  • 一个重要注意是你的回调需要返回ent,否则你的程序不会将输入事件转发给下一个处理程序,你会锁定你的系统起来!

标签: python objective-c events macos pyobjc


【解决方案1】:

我已经尝试了以下所有方法:... 我需要哪些哪些不需要? 链接是什么意思? – 柚木

用答案回复您的评论,因为它不适合评论。对不起。

情况可能有点复杂。 PyObjC 有一大堆关于 Apple 框架中的函数、对象等的信息(元数据和一些帮助代码),但它不包含代码本身(因为它是 Apple 的代码,而 PyObjC不能只是到处复制它)。您使用的功能在 Apple 的 ApplicationServices 框架中。 PyObjC 将有关该框架的信息保存在其Quartz 模块中。所以第 I 部分是:要在 Python 中使用这些函数,您需要获取 PyObjC 的信息:from Quartz import *

第二部分是,就像我说的那样,您的应用程序需要知道的不仅仅是 PyObjC 的元数据在哪里,还有您尝试使用的 Apple 代码在哪里。这是链接部分。 (看起来您不是在使用 Xcode,因为您正在设置自己的运行循环,但在 Xcode 中,您将转到项目中的 Linked Frameworks 组并将 ApplicationServices 添加到其中。)

我猜你正在使用 py2app?恐怕我不是 100% 确定如何做到这一点,但这个 SO 问题可能会让你开始:Problem using py2app

希望能为您指明一个有用的方向。

(顺便说一句,当我在 Xcode 中使用您的代码和链接的 ApplicationServices 框架建立一个项目时,它锁定了我的输入设备,所以我唯一能做的就是重新启动。我可能做了一些事情错误,但请注意,当您获得此链接时,可能您正在设置的水龙头存在其他问题。您可能想先尝试在 C/Obj-C 中执行此操作,然后再尝试当你知道它有效时翻译成 Python。)

【讨论】:

  • 谢谢。这非常有帮助,就像您指出我的主题一样。我会尝试你的一些建议。并感谢您的警告...
  • 很高兴我能帮上忙。我从你的问题历史中注意到你已经研究这个谜题很长一段时间了。祝你好运!
  • @Teak:刚刚在 cocoa-dev 邮件列表线程中看到提到了这个实用程序:pfiddlesoft.com/eventtapstestbench。没试过,但可能对你有用。
  • @Josh:我一直在研究这个问题。您是否可以向我发送您制作的 Xcode 项目,或者只是代码,因为我是 Python 人,对 C 和 Xcode 了解甚少?另外,我已经有了 Event Taps Testbench,(在我广泛且不成功的研究中发现它)谢谢。
  • @Teak:抱歉,当我在 Xcode 中尝试它时(这样我可以确定它是链接的)我也在使用 Python。在不得不重新启动后,我从来没有费心在 C 中尝试过。我建议使用 C 的原因是我发现 PyObjC 似乎在普通 C Apple API 周围有最粗糙的边缘(与用 Objective-C 编写的 API 不同)。如果你没有太多的 C 练习,我想只是忽略这个想法。对不起。不过,您可以自己轻松创建一个 Xcode PyObjC 项目,然后运行其中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2016-07-14
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多