pyGame в теме - PullRequest
       30

pyGame в теме

5 голосов
/ 04 июня 2010

Я хочу использовать программу pyGame как часть другого процесса. Используя следующий код, pyGame, похоже, не обрабатывает события; он не отвечает на клавишу 'q' и не рисует заголовок окна. Если go() не запущен как поток, он работает нормально. Это под OSX; Я не уверен, в этом ли проблема или нет.

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()

Ответы [ 4 ]

5 голосов
/ 09 сентября 2011

Pygame не является потокобезопасным, и EventLoop требуется для запуска в главном потоке! В противном случае проблема, которую вы описываете, может возникнуть.

Одним из решений является вызов pygame.mainloop() из основного потока.

Однако, возможно, вы используете другие модули, которые также требуют запуска из основного потока. В этом случае есть одно питоническое решение. у вас есть возможность запустить Pygame Mainloop с аргументом. Этот аргумент означает: запустить mainloop всего за несколько секунд. Следовательно, вы можете создать генератор, который запускает mainloop в течение 0,1 секунды, который вы периодически вызываете из основного потока. Например:

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

, тогда просто периодически звоните continue_pygame_loop() из основного потока

Tkinter страдает от той же проблемы, но не может указать runloop() с таймаутом. Для меня вот почему Pygame великолепен!

5 голосов
/ 09 июня 2010

Лучше всего делать обработку событий и графику в основном потоке. Некоторым средам действительно не нравится, когда вы пытаетесь визуализировать из других потоков, а некоторым не нравится, когда вы пытаетесь удалить из них очередь событий.

Возможно, даже невозможно сделать то, что вы надеетесь сделать, поскольку процесс, в котором вы работаете, вполне может иметь свои собственные представления о том, кому принадлежит очередь сообщений и окно, к которому вы обращаетесь.

4 голосов
/ 03 марта 2012

Возможно длинный выстрел, но постарайтесь не импортировать Pygame, пока не попадете в поток. Возможно, проблема в том, что вы импортируете Pygame в один поток, а затем используете его в другом. Однако при импорте в несколько потоков могут возникнуть другие проблемы. В частности, убедитесь, что после запуска потока Pygame вы ожидаете, пока он завершит импорт, прежде чем делать что-либо, что может привести к завершению процесса Python или к тупику.

4 голосов
/ 21 декабря 2010

Не совсем ответ, просто подтверждение того факта, что эта проблема действительно возникает в Mac OS X, а не в Linux. Я разработал свою программу на Ubuntu, и этот вид кода работал там хорошо, но она не удалась, как вы описали, когда я пытался запустить ее на Mac. Вместо этого работает код рисования в основном потоке.

Если это действительно ограничение модуля потоков или pygame (на Mac), то я думаю, что единственный способ - это реструктурировать вашу программу так, чтобы весь рисунок обрабатывался основным потоком. Либо подайте отчет об ошибке и посмотрите, что произойдет.

РЕДАКТИРОВАТЬ: Другой, гораздо лучший вариант будет использовать модуль multiprocessing. Вы можете создать отдельный процесс Python только для рендеринга на экран. Затем процессы могут передавать информацию друг другу. Я пытаюсь использовать это сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...