TIS/TSM非主线程错误; 热键触发的pygame脚本(臀部,pygame,键盘)

one*_*ion 6 python macos keyboard-shortcuts hotkeys keyboard-maestro

我正在编写一个python应用程序,其主要目的是运行一个迷你游戏(使用'pygame'库),每当我使用一个热键(目前使用'键盘'库).我希望这个热键被普遍认可,所以我将整个东西打包为状态栏应用程序(使用'rumps'库).

到目前为止,我可以启动整个事情,从状态栏下拉列表选择播放,它的工作原理!大.

但是,如果我尝试使用绑定的热键,运行Play触发器的相同功能,我得到:

python[58226:599749] pid(58226)/euid(0) is calling TIS/TSM in non-main thread
environment, ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!
Run Code Online (Sandbox Code Playgroud)

这显示了四次,并且是后续的

python[58226:599749] WARNING: nextEventMatchingMask should only be
called from the Main Thread! This will throw an exception in the future.
Run Code Online (Sandbox Code Playgroud)

为了检查它本身不是热键,我做了一个测试:如果我将热键连接到一个更简单的功能,比如设置一个警报,它工作正常.它仍然抱怨,并给我错误:

python[60308:620099] -[NSAlert runModal] may only be invoked from the main thread. Behavior on other threads is undefined. (
0   AppKit                              0x00007fff2b7f563f -[NSAlert runModal] + 178
1   _objc.cpython-36m-darwin.so         0x000000010c1358c7 ffi_call_unix64 + 79
2   ???                                 0x000070000f3b2e50 0x0 + 123145557847632
)
Run Code Online (Sandbox Code Playgroud)

但它确实运行.但是,如果它连接到Play功能,它会中断(并产生上面的第一个错误).

总结一下:

1)下拉=>运行迷你游戏:成功!

2)Hotkey =>运行迷你游戏:难以理解的错误!

我用谷歌搜索了这个错误,但只看到了解释的问题; 有没有办法可以解决这个错误,使用不同的软件,或不同的方法 - 但不必离开python,或对底层系统执行一些深刻和邪恶的黑客攻击?

我能以某种方式获得热线/游戏以使用主线程环境吗?怎么样?

我可以使用状态栏应用程序以外的车辆来收听热键吗?(更新:我尝试了pynput,并得到了相同的非主线程错误.)

我可以在pygame里面做些什么来让它不具攻击性吗?(目前,它实际上只是为滚动的正弦波动画.)

我可以让臀部回调功能起作用吗?目前,无论在何处或如何调用它,它都没有做任何事情.

(不幸的是,这在Mac上,因为pyhk3仅用于Windows,而wx.Window(可以有热键)也仅适用于Windows)

进一步失败:无法让它与Keyboard Maestro一起运行 - 我之前从未使用过它,所以可能错误地使用它,但它看起来也是一个非常简单的命令,只是扁平没有响应任何.

Aaand ...... Automator脚本运行,但是 - 不是热键!(编辑:显然采取了热键.但是另一个有效!见下文.)

one*_*ion 0

我接受我自己的答案,因为它是迄今为止唯一解决我最感兴趣的问题的答案,即让该东西使用全局快捷方式运行,但是,因为我理想地希望打包和分发它,所以我仍然会很高兴看到解决 python 中问题的答案,并且很乐意向任何这样做的答案授予赏金。

最后,最后,让它与 Automator 中的服务以及系统偏好设置 > 键盘 > 快捷方式一起使用。一路走来,我不得不

  • 显式调用我想要使用的 python 二进制文件,因为 Automator 在执行文本脚本时使用的 bash shell 与终端中的明显不同
  • 意识到系统偏好设置快捷方式不起作用是因为我首先选择的组合键,而不是它被阻止,因为当我调用它时没有错误或消息。
  • 可能还有各种各样的其他事情。好天啊。