I may have found a workaround, though: I've done some more investigation and I think the problem is having both a WxPython event loop and a Pygame event loop in the same process.
It turns out that it is actually possible to get Pygame working in a thread spawned from a WxPython process. But the thing to watch out for is to do the pygame initialisation (pygame.init() etc) in the thread context in which you'll check for pygame events. It seems that you can only collect the pygame events in the thread that did the pygame initialisation.
This rules out subclassing threading.Thread, and initialising pygame in the __init__ constructor, then checking for events in the run() loop. You can still subclass threading.Thread but make sure you put the pygame init in the run() loop.
This applies to Windows by the way, it doesn't seem to be a problem on Linux.
Cheers,
Kelvin.