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

TIS/TSM non-main thread error; pygame script triggered by hotkey (rumps, pygame, keyboard)

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

到目前为止,我可以开始整个过程​​了,select 从状态栏下拉菜单中播放,它成功了!太好了。

但是,如果我尝试使用绑定的热键,运行 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!!!

这个出现了四次,后续跟进

python[58226:599749] WARNING: nextEventMatchingMask should only be
called from the Main Thread! This will throw an exception in the future.

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

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
)

但确实如此 运行。但是,如果它连接到 Play 函数,它就会中断(并产生上面的第一个错误)。

总结:

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

2) 热键 => 运行 小游戏:无法理解的错误!

我用谷歌搜索了这个错误,但只看到了我无法理解的解释;有没有一种方法可以通过使用不同的软件或不同的方法来解决这个错误 - 但不必离开 python,或对底层系统进行一些深入而邪恶的黑客攻击?

我能否以某种方式让 hotkey/game 使用主线程环境?怎么样?

我可以使用状态栏应用以外的其他工具来监听热键吗? (更新:我尝试了 pynput,并得到了同样的非主线程错误。)

我可以在 pygame 内部做些事情来避免冒犯他人吗? (目前,它实际上只是为滚动的正弦波设置动画。)

我可以使用 rumps 回调函数吗?目前,无论在何处或如何调用它,它都没有做任何事情。

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

进一步失败:也无法使用 Keyboard Maestro 将其设置为 运行 -- 我以前从未使用过它,所以很可能使用错误,但它看起来也是一个非常简单的命令, 完全没有任何反应。

Aaand ... Automator 脚本 运行s,但是 -- 不使用热键! (编辑:热键显然已被占用。但另一个有效!见下文。)

此问题是 MacOS 10.13 Sierra 错误。据报道,它与 Processing.org 3d 应用程序以及名为 Synergy 的程序一起使用。

我接受我自己的答案,因为它是迄今为止唯一解决我最感兴趣的问题的答案,即使用全局快捷方式将事情送到 运行,但是,因为我会理想情况下喜欢打包和分发它,我仍然很高兴看到 python 内解决问题的答案,并且很乐意奖励任何这样做的答案。

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

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