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