Wednesday, 25 July 2018

TIS/TSM non-main thread error; pygame script triggered by hotkey (rumps, pygame, keyboard)

I'm writing a python app, whose main purpose is to run a minigame (using the 'pygame' library), whenever I use a hotkey (which currently uses the 'keyboard' library). I want this hotkey to be recognized universally, so I'm packaging the whole thing as a status bar app (using the 'rumps' library).

So far, I can start the whole thing, select Play from the status bar dropdown, and it works! Great.

HOWEVER, if I attempt to use the bound hotkey, to run the same function that Play triggers, I get:

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!!!

This shows up four times, and is followed up

python[58226:599749] WARNING: nextEventMatchingMask should only be
called from the Main Thread! This will throw an exception in the future.

To check that it wasn't the hotkey itself, I did a test: If I connect the hotkey to a simpler function, like setting an alert, it works fine. It still complains, and gives me the error:

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
)

but it does RUN. However if it connects to the Play function, it breaks (and produces the first error, above).

To summarize:

1) Dropdown => run minigame: Success!

2) Hotkey => run minigame: Incomprehensible errors!

I've googled this error, but have only seen explanations that are way over my head; is there a way that I could get around this error, by using different software, or a different approach -- but without having to leave python, or performing some deep and evil hack to an underlying system?

Could I get the hotkey/game to USE the Main Thread environment, somehow? How?

Could I use a vehicle other than a status bar app to listen for the hotkey?

Could I do something inside of pygame to not make it as offensive? (At the moment, it's literally just animating a rolling sine wave.)

Could I get the rumps callback function to work? At the moment, it's just not doing ANYTHING, and seems to have a number of issues. When I try to bind it to 'cmd+y' it comes out as 'cmd+C'



from TIS/TSM non-main thread error; pygame script triggered by hotkey (rumps, pygame, keyboard)

No comments:

Post a Comment