ошибка неосновного потока TIS/TSM; Скрипт pygame, запускаемый горячей клавишей (Rumps, pygame, keyboard)

Я пишу приложение на 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 запускается, но -- не с помощью горячей клавиши! (РЕДАКТИРОВАТЬ: Горячая клавиша, по-видимому, была занята. Но сработала другая! См. Ниже.)


person one_observation    schedule 22.07.2018    source источник


Ответы (2)


Эта проблема связана с ошибкой MacOS 10.13 Sierra. Об этом сообщается с помощью 3D-приложений Processing.org, а также программы под названием Synergy.

person Scott Parris    schedule 28.07.2018
comment
Я видел, что это вызывает проблемы в ряде мест — к сожалению, это никоим образом не решает мою проблему. Обновление ОС решает проблему? Это проверено? Есть ли другой способ обойти это? - person one_observation; 30.07.2018

Я принимаю свой собственный ответ, потому что пока он единственный, который решает проблему, которая меня больше всего интересовала, то есть запуск этой вещи с помощью глобального ярлыка, НО, поскольку в идеале я хотел бы упаковать и распространить это, я все равно был бы очень рад увидеть ответы, которые решили проблему в python, и с радостью присудил бы награду за любой ответ, который это сделал.

Наконец-то, наконец, заставил его работать с Сервисом в Automator и Системными настройками> Клавиатура> Ярлыки. По пути мне пришлось

  • Явно вызовите двоичный файл python, который я хотел использовать, потому что оболочка bash, которую Automator использует при выполнении текстового скрипта, очевидно, отличается от оболочки в терминале.
  • Поймите, что ярлык «Системные настройки» не работал из-за комбинации клавиш, которую я сначала выбрал, а НЕ из-за того, что он был заблокирован, потому что при его вызове не было ошибок или сообщений.
  • Наверное, все остальное. Боже.
person one_observation    schedule 31.07.2018