2010-01-08 54 views
10

Tôi đang loanh quanh với pygame ngay bây giờ, và có vẻ như tất cả các chương trình nhỏ mà tôi thực hiện với nó treo khi tôi cố gắng để đóng chúng.Chương trình Pygame treo trên lối ra

Đi đoạn mã sau, ví dụ:

from pygame.locals import * 
pygame.init() 
# YEEAAH! 
tile_file = "blue_tile.bmp" 
SCREEN_SIZE = (640, 480) 
SCREEN_DEPTH = 32 

if __name__ == "__main__": 
    screen = pygame.display.set_mode(SCREEN_SIZE, 0, SCREEN_DEPTH) 
    while True: 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       break 

    tile = pygame.image.load(tile_file).convert() 
    colorkey = tile.get_at((0,0)) 
    tile.set_colorkey(colorkey, RLEACCEL) 

    y = SCREEN_SIZE[1]/2 
    x = SCREEN_SIZE[0]/2 

    for _ in xrange(50): 
     screen.blit(tile, (x,y)) 
     x -= 7 
     y -= 14 

tôi không thấy bất cứ điều gì sai trái với mã này, nó hoạt động (bỏ qua một thực tế là gạch không blit trong những điểm đúng), nhưng không có traceback và cách duy nhất để đóng nó là giết quá trình python trong Task Manager. Bất cứ ai có thể phát hiện một vấn đề với mã của tôi?

Trả lời

13

Nếu bạn đang chạy nó từ IDLE, thì bạn đang thiếu pygame.quit().

Điều này là do trình thông dịch python IDLE, dường như giữ tham chiếu xung quanh bằng cách nào đó. Hãy chắc chắn rằng, bạn gọi pygame.quit() khi thoát khỏi ứng dụng hoặc trò chơi của bạn.

Xem: In IDLE why does the Pygame window not close correctly?

Và cũng: Pygame Documentation - pygame.quit()

+0

+1 để đoán rằng đó là sự cố IDLE. –

+0

Điều tương tự đối với PyScripter. Cảm ơn rất nhiều! – Altaisoft

12

Nơi nào bạn thoát khỏi vòng lặp bên ngoài?

while True: # outer loop 
    for event in pygame.event.get(): # inner loop 
     if event.type == QUIT: 
      break # <- break inner loop 
+1

Vâng, cấu trúc của chương trình có vẻ bị hỏng. Tôi khá ngạc nhiên rằng một chương trình như vậy sẽ tạo ra bất kỳ đầu ra nào cả. Trong thực tế, tôi nghi ngờ đây là mã thực tế của OP. – Kylotan

0

Tôi đã có một vấn đề tương tự trên biết lý do tại sao tôi có thể cửa sổ pygame không gần .. và đã tìm kiếm .. và đi qua này ..

Tôi nghĩ rằng điều này giải thích tất cả mọi thứ .. và ý tưởng tốt quá. .

như đã thấy trong: http://bytes.com/topic/python/answers/802028-pygame-window-not-closing-tut-not-helping

tôi nghĩ vấn đề là bạn đang chạy nó từ bên trong IDLE. Có vẻ như giống như vòng lặp sự kiện của PyGame và vòng lặp sự kiện của Tkinter can thiệp lẫn nhau. Nếu bạn chạy tập lệnh từ dòng lệnh , nó hoạt động.

3

tôi đã cùng một vấn đề, nhưng giải quyết nó bằng cách làm như sau:

try: 
    while True: 
     for event in pygame.event.get(): 
     if event.type==QUIT or pygame.key.get_pressed()[K_ESCAPE]: 
      pygame.quit() 
      break 
finally: 
    pygame.quit() 
3

'nếu event.type == QUIT' tạo ra một lỗi cú pháp. Nên là == pygame.QUIT Ngoài ra, phần còn lại của dòng là không chính xác nhưng tôi không thể thấy như thế nào. Có một biến thể sạch hơn here:

running = True 
    while running: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
      running = False 
    pygame.quit() 
+0

Với 'từ pygame.locals import *', OP có 'QUIT' trong không gian tên chung nên không có lỗi cú pháp. – bstpierre

Các vấn đề liên quan