Я пишу приложение на Python, основной целью которого является запуск мини-игры (с использованием библиотеки «pygame») всякий раз, когда я использую горячую клавишу (которая в настоящее время использует библиотеку «клавиатура»). Я хочу, чтобы эта горячая клавиша распознавалась повсеместно, поэтому я упаковываю все это как приложение строки состояния (используя библиотеку 'rumps').
Пока что я могу запустить все это, выбрать Play в раскрывающемся списке строки состояния, и это работает! Большой.
ОДНАКО, если я попытаюсь использовать привязанную горячую клавишу для запуска той же функции, которую запускает 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) Выпадающий список => запустить мини-игру: Успех!
2) Горячая клавиша => запустить мини-игру: Непонятные ошибки!
Я гуглил эту ошибку, но видел только объяснения, которые мне не по плечу; есть ли способ обойти эту ошибку, используя другое программное обеспечение или другой подход, но без необходимости покидать python или выполнять какой-то глубокий и злой взлом базовой системы?
Могу ли я каким-то образом заставить горячую клавишу/игру ИСПОЛЬЗОВАТЬ среду основного потока? Как?
Могу ли я использовать транспортное средство, отличное от приложения строки состояния, для прослушивания горячей клавиши? (Обновление: я попробовал pynput и получил ту же ошибку, не связанную с основным потоком.)
Могу ли я сделать что-то внутри pygame, чтобы это не было оскорбительным? (На данный момент это буквально просто анимация бегущей синусоиды.)
Могу ли я заставить работать функцию обратного вызова rumps? На данный момент он просто НИЧЕГО не делает, неважно где и как он называется.
(И, к сожалению, это на Mac, потому что pyhk3 предназначен только для Windows, а wx.Window (который может иметь горячие клавиши) также только для Windows)
ДОПОЛНИТЕЛЬНЫЙ сбой: Не могу заставить его работать с Keyboard Maestro - я никогда не использовал его раньше, поэтому, возможно, использую его неправильно, но это также похоже на ОЧЕНЬ простую команду, которая просто не имеет никакого ответа. что угодно.
Аааа... скрипт Automator запускается, но -- не с помощью горячей клавиши! (РЕДАКТИРОВАТЬ: Горячая клавиша, по-видимому, была занята. Но сработала другая! См. Ниже.)