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

时间:2018-07-22 19:18:25

标签: 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!!!

显示四次,并被跟踪

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
)

但是它运行。但是,如果它连接到“播放”功能,则会中断(并产生上面的第一个错误)。

总结:

1)下拉菜单=>运行minigame:成功!

2)热键=>运行迷你游戏:不可理解的错误!

我已经搜索了这个错误,但是只看到了一些令人费解的解释;是否有办法通过使用不同的软件或不同的方法来解决此错误,而不必离开python或对基础系统进行一些深恶的黑客攻击?

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

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

我可以在pygame内做些不令人反感的事情吗? (此刻,它实际上只是在动画一个正弦波。)

我可以使rumps回调函数起作用吗?目前,无论在何处或如何调用它,它什么都没做。

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

进一步的失败:也无法使其与Keyboard Maestro一起运行-我以前从未使用过它,因此可能使用错误,但这似乎也非常简单,只不过是简单的命令没有任何反应。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我接受我自己的答案,因为到目前为止,它是唯一可以解决我最感兴趣的问题的答案,即让事情以全局快捷方式BUT运行,因为我理想地希望打包和分发对此,我仍然很高兴看到在python中解决了问题的答案,并很高兴将赏金奖励给所有这样做的人。

最后,最后使其与Automator中的“服务”和“系统偏好设置”>“键盘”>“快捷方式”一起使用。一路上,我不得不

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