我正在编写一个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脚本,但是-不能使用热键! (编辑:该热键显然已被使用。但是另一种有效!见下文。)
答案 0 :(得分:1)
此问题是MacOS 10.13 Sierra错误。正在使用Processing.org 3d应用程序以及名为Synergy的程序进行报告。
答案 1 :(得分:0)
我接受我自己的答案,因为到目前为止,它是唯一可以解决我最感兴趣的问题的答案,即让事情以全局快捷方式BUT运行,因为我理想地希望打包和分发对此,我仍然很高兴看到在python中解决了问题的答案,并很高兴将赏金奖励给所有这样做的人。
最后,最后使其与Automator中的“服务”和“系统偏好设置”>“键盘”>“快捷方式”一起使用。一路上,我不得不