Экран Pygame зависает при закрытии - PullRequest
3 голосов
/ 11 апреля 2011

Код загружает окно экрана Pygame, но когда я нажимаю X, чтобы закрыть его, он перестает отвечать на запросы.Я работаю в 64-битной системе, использую 32-битный Python и 32-битный Pygame.

from livewires import games, color

games.init(screen_width = 640, screen_height = 480, fps = 50)

games.screen.mainloop()

Ответы [ 5 ]

8 голосов
/ 11 апреля 2011

Mach1723's ответ правильный, но я хотел бы предложить другой вариант основного цикла:

while 1:
    for event in pygame.event.get():
        if event.type == QUIT: ## defined in pygame.locals
            pygame.quit()
            sys.exit()

        if event.type == ## Handle other event types here...

    ## Do other important game loop stuff here.
4 голосов
/ 20 апреля 2011

Я бы порекомендовал следующий код. Во-первых, он включает Clock, поэтому ваша программа не использует процессор, делая только опрос событий. Во-вторых, он вызывает pygame.quit (), который предотвращает зависание программы при запуске под IDLE в Windows.

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://cs.simpson.edu/?q=python_pygame_examples

import pygame

# Define some colors
black    = (   0,   0,   0)
white    = ( 255, 255, 255)
green    = (   0, 255,   0)
red      = ( 255,   0,   0)

pygame.init()

# Set the height and width of the screen
size=[700,500]
screen=pygame.display.set_mode(size)

pygame.display.set_caption("My Game")

#Loop until the user clicks the close button.
done=False

# Used to manage how fast the screen updates
clock=pygame.time.Clock()

# -------- Main Program Loop -----------
while done==False:
    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

    # Set the screen background
    screen.fill(black)

    # Limit to 20 frames per second
    clock.tick(20)

    # Go ahead and update the screen with what we've drawn.
    pygame.display.flip()

# Be IDLE friendly. If you forget this line, the program will 'hang'
# on exit.
pygame.quit ()
2 голосов
/ 11 апреля 2011

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

import sys
import pygame
from pygame.locals import *

def main():
    running = True
    while running:
        for event in pygame.event.get():
            if event.type==QUIT: #QUIT is defined at pygame.locals 
                runnning = False
    #other game stuff to be done

if __name__=='__main__':
    pygame.init()
    pygame.display.set_mode((640,480))
    main()
2 голосов
/ 11 апреля 2011

Это довольно простая проблема, вам нужно обработать событие "QUIT", см. Документацию по событию: http://www.pygame.org/docs/ref/event.html

EDIT: Теперь мне пришло в голову, что вы можете обрабатывать событие «QUIT» и оно не работает но без подробностей вашего кода я не знаю.

Быстрый пример простого способа обработки события «QUIT»:

import sys
import pygame

# Initialize pygame
pygame.init()
pygame.display.set_mode(resolution=(640, 480))

# Simple(ugly) main loop
curEvent = pygame.event.poll()

while curEvent.type != pygame.QUIT:
      # do something
      curEvent = pygame.event.poll()
1 голос
/ 18 января 2014

Чтобы сделать закрываемое окно в Pygame простым, создайте игровой цикл с функцией while True:, затем используйте функцию for event in pygame.event.get(): для создания цикла for, затем добавьте код if event.type == QUIT:, если вы уже создали цикл 'while True' нужно добавить только в последний фрагмент кода. Теперь добавьте pygame.quit() и sys.exit(), вот готовый код:

while True:
for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit()
        sys.exit()

Обратите внимание, что сначала вам нужно импортировать pygame и sys.

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