首页 > 解决方案 > TIS/TSM 非主线程错误;由热键触发的 pygame 脚本(臀部、pygame、键盘)

问题描述

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

到目前为止,我可以开始整个事情,从状态栏下拉菜单中选择播放,它就可以工作了!伟大的。

但是,如果我尝试使用绑定的热键来运行 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,或者对底层系统执行一些深入而邪恶的黑客攻击?

我可以通过某种方式获得使用主线程环境的热键/游戏吗?如何?

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

我可以在 pygame 内部做点什么不让它变得冒犯吗?(目前,它实际上只是为滚动的正弦波设置动画。)

我可以让臀部回调函数工作吗?目前,它只是没有做任何事情,无论它在哪里或如何被调用。

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

进一步的失败:也无法让它与 Keyboard Maestro 一起运行——我以前从未使用过它,所以很可能用错了,但它也似乎是一个非常简单的命令,只是完全没有响应任何。

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

标签: pythonmacoskeyboard-shortcutshotkeyskeyboard-maestro

解决方案


此问题是 MacOS 10.13 Sierra 错误。Processing.org 3d 应用程序以及一个名为 Synergy 的程序正在报告它。


推荐阅读