pygame зависает, когда я пытаюсь выйти из него после запуска из IDLE! - PullRequest
1 голос
/ 22 июня 2011

Я запускаю его через упаковщик livewires, который просто тренирует колеса для pygame и других модулей python в целом;но каждый раз, когда я запускаю его, он запускается, а когда я пытаюсь выйти, он не отвечает, а затем вылетает.

Любой вклад в то, как я мог бы исправить это, было бы замечательно.В моем учебнике нет никаких данных, и, похоже, все, что дает Google, - это результаты этой проблемы с использованием самой pygame.

Очевидно, что Pygame и Tkinter, кажется, конфликтуют?

Заранее спасибо!

Добавление - код, который я пытался запустить:

from livewires import games

screen_w = 640
screen_h = 480

my_screen = games.Screen (wid, heit)
my_screen.mainloop()

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Аналогичный вопрос: Экран Pygame зависает при его закрытии

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

Эти результаты, вероятно, решают ту же проблему, что и у вас. Это релевантная часть файла games.py от livewires, и он нигде не вызывает pygame.quit():

def handle_events (self):
    """
    If you override this method in a subclass of the Screen
    class, you can specify how to handle different kinds of
    events.  However you must handle the quit condition!
    """
    events = pygame.event.get ()
    for event in events:
        if event.type == QUIT:
            self.quit ()
        elif event.type == KEYDOWN:
            self.keypress (event.key)
        elif event.type == MOUSEBUTTONUP:
            self.mouse_up (event.pos, event.button-1)
        elif event.type == MOUSEBUTTONDOWN:
            self.mouse_down (event.pos, event.button-1)

def quit (self):
    """
    Calling this method will stop the main loop from running and
    make the graphics window disappear.
    """

    self._exit = 1

def mainloop (self, fps = 50):
    """
    Run the pygame main loop. This will animate the objects on the
    screen and call their tick methods every tick.

    fps -- target frame rate
    """

    self._exit = 0

    while not self._exit:
        self._wait_frame (fps)

        for object in self._objects:
            if not object._static:
                object._erase ()
                object._dirty = 1

        # Take a copy of the _objects list as it may get changed in place.
        for object in self._objects [:]:
            if object._tickable: object._tick ()

        self.tick ()

        if Screen.got_statics:
            for object in self._objects:
                if not object._static:
                    for o in object.overlapping_objects ():
                        if o._static and not o._dirty:
                            o._erase ()
                            o._dirty = 1

        for object in self._objects:
            if object._dirty:
                object._draw ()
                object._dirty = 0

        self._update_display()

        self.handle_events()

    # Throw away any pending events.
    pygame.event.get()

Событие QUIT просто устанавливает флаг, который исключает вас из цикла while в функции mainloop. Я предполагаю, что если вы найдете этот файл в своем каталоге Python и вставите pygame.quit() после последней строки в mainloop, это решит вашу проблему.

0 голосов
/ 07 апреля 2013

Я согласен. Вы должны поместить всю программу (часть, которая должна быть выполнена, а не определения и тому подобное) в цикл while. Проблема в том, что pygame не велит закрываться при выходе из IDLE, но вне IDLE закрытие программы переопределяет необходимость закрытия пигмея.

вот цикл:

done = False
while done==False:
    # ALL EVENT PROCESSING SHOULD GO BELOW THIS COMMENT
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
           done=True # Flag that we are done so we exit this loop

    #Main program here

pygame.quit()
...