pyGame en un hilo

Quiero usar un progtwig pyGame como parte de otro proceso. Usando el siguiente código, pyGame no parece estar procesando eventos; no responde a la tecla ‘q’ ni dibuja la barra de título de la ventana. Si go() no se ejecuta como un hilo, funciona bien. Esto está bajo OSX; No estoy seguro de si ese es el problema o no.

 import pygame, threading, random def go(): pygame.init() surf = pygame.display.set_mode((640,480)) pygame.fastevent.init() while True: e = pygame.fastevent.poll() if e.type == pygame.KEYDOWN and e.unicode == 'q': return surf.set_at((random.randint(0,640), random.randint(0,480)), (255,255,255)) pygame.display.flip() t = threading.Thread(target=go) t.start() t.join() 

Es mejor hacer el manejo del evento y los gráficos en el hilo principal. A algunos entornos realmente no les gusta que intentes renderizar desde otros subprocesos, y a otros no les gusta que intentes vaciar la cola de eventos.

Es posible que ni siquiera sea posible hacer lo que espera hacer, ya que el proceso que está ejecutando puede tener sus propias ideas acerca de quién es el propietario de la cola de mensajes y la ventana a la que está procesando.

Pygame no es seguro para subprocesos y se requiere el eventloop para ejecutarse en el hilo principal. De lo contrario, el problema que usted describe puede ocurrir.

Una solución es llamar a pygame.mainloop() desde el hilo principal.

Sin embargo, quizás esté usando otros módulos que también requieren ejecutar desde el hilo principal. Hay en este caso una solución pythonica. Tienes la posibilidad de ejecutar pygame mainloop con un argumento. Este argumento significa: ejecuta el mainloop por solo unos segundos. Por lo tanto, lo que puede hacer es crear un generador que ejecute mainloop durante un 0.1 segundo al que llame periódicamente desde el hilo principal. Por ejemplo:

 def continue_pygame_loop(): pygame.mainloop(0.1) yield 

luego simplemente llame a continue_pygame_loop() periódicamente desde el hilo principal

Tkinter sufre el mismo problema, pero no tiene forma de especificar runloop() con un tiempo de espera. Para mí, esta es la razón por la que Pygame es genial!

No es realmente una respuesta, solo una afirmación del hecho de que este problema sí ocurre en Mac OS X y no en Linux. Desarrollé mi progtwig en Ubuntu y este tipo de código funcionó bien allí, pero falló como lo describiste cuando intenté ejecutarlo en una Mac. Ejecutar el código de dibujo en el hilo principal funciona bien.

Si esto es realmente una limitación del módulo de subprocesamiento o de pygame (en Mac), supongo que la única forma es reestructurar su progtwig para que el subproceso principal maneje todos los dibujos. Alternativamente, presente un informe de error y vea qué sucede.

EDITAR: Otra opción, mucho mejor, sería utilizar el módulo de multiprocessing . Podría generar un proceso de Python separado solo para renderizar en pantalla. Los procesos pueden entonces comunicarse información entre ellos. Estoy buscando en usar esto yo mismo.

Posiblemente sea una posibilidad muy remota, pero intenta asegurarte de no importar Pygame hasta que estés en el hilo. Es casi posible que el problema sea que estás importando Pygame en un hilo y luego usándolo en otro. Sin embargo, la importación en varios subprocesos puede tener otros problemas. En particular, asegúrese de que una vez que inicie el subproceso de Pygame, espere a que finalice la importación antes de hacer cualquier cosa que pueda hacer que el proceso de Python se apague, o podría obtener un interlocking.