[英]Pygame error: display surface quit: Why?
誰能告訴我為什么我的應用程序退出:
pygame 錯誤:顯示 Surface 退出。
我有類似的問題,發現 Surface 對象不喜歡被深度復制。 當我在這樣的對象上使用 copy.deepcopy() 然后訪問副本時,我收到了那個奇怪的錯誤消息(沒有調用 pygame.quit())。 也許你遇到過類似的行為?
我在一段非常簡單的代碼中遇到了類似的問題:
import sys, pygame
pygame.init()
size = width, height = 640, 480
speed = [2, 2]
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("Golfball.png")
ballrect = ball.get_rect()
while 1:
event = pygame.event.poll()
if event.type == pygame.QUIT:
pygame.quit()
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
pygame.time.delay(5)
錯誤消息是:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "bounce.py", line 22, in <module>
screen.fill(black)
pygame.error: display Surface quit
所以我把
import pdb
在頂部之后
pygame.init()
並使用
pdb.set_trace()
在行之后
pygame.quit()
現在我運行程序,點擊關閉窗口,看到我掉進調試器實際上有點驚訝(畢竟,我預計退出會立即將我完全帶出)。 所以我得出結論,退出實際上並沒有在那時停止一切。 看起來程序在退出之后還在繼續,正在到達
screen.fill(black)
這導致了問題。 所以我加了
break
之后
pygame.quit()
現在一切都很愉快。
[后來補充:我現在想到的是
pygame.quit()
正在退出模塊,而不是正在運行的程序,因此您需要休息一下才能退出這個簡單的程序。 ]
只是為了記錄,這意味着好的版本是
import sys, pygame
pygame.init()
size = width, height = 640, 480
speed = [2, 2]
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("Golfball.png")
ballrect = ball.get_rect()
while 1:
event = pygame.event.poll()
if event.type == pygame.QUIT:
pygame.quit()
break
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
pygame.time.delay(5)
替換if event.type == pygame.quit():
by if event.type == pygame.QUIT:
import pygame, sys
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit() # quit the screen
running = False
sys.exit()
在 pygame.quit() 之后調用 sys.exit() 來停止程序,這樣你就不能在退出 pygame 后改變表面並且不會得到錯誤
確保你寫的是pygame.QUIT:
而不是pygame.quit():
我知道這聽起來很奇怪,但我遇到了同樣的問題。
我也有這個問題,但它是從另一個來源得到的。
我有一個這樣定義的類:
class PauseMenu(pygame.Surface)
我在忘記初始化 pygame.Surface 並嘗試對其進行 blit 時出現錯誤,使 pygame.screen 崩潰並給了我這個錯誤。
所以我只是明顯地添加了這個
pygame.Surface.__init__(self, (width, height))
來自http://archives.seul.org/pygame/users/Nov-2006/msg00236.html :
2006 年 11 月 30 日星期四,21:27 -0300,Nicolas Bischof 寫道:
pygame.error: display Surface quit 這意味着什么?,我無法修復
這意味着調用了 pygame.display.quit() 或 pygame.quit()。 如果您在退出后嘗試對顯示表面執行任何操作,您將收到此錯誤。
我現在遇到了類似的問題,我已經找到了解決方案。
因為看起來pygame.quit()只會退出 pygame 模塊而不是整個程序,所以在下一行使用sys.exit()方法。
在這之后:
pygame.quit()
放置這個:
sys.exit()
完整片段:
pygame.quit()
sys.exit()
我也有這個問題,類似於 Maciej Miąsik 的回答,我的答案與 copy.deepcopy() 圖像有關。
我有:
import copy,pygame,sys
from pygame.locals import *
EMPTY_IMG= pygame.image.load('C:super/fancy/file/path/transparent.png')
held_image=copy.deepcopy(EMPTY_IMG)
my_rect=held_image.get_rect()
my_rect.center = (50,50)
screen.blit(held_image,my_rect)
我得到了同樣的錯誤。
我只是將 copy.deepcopy(EMPTY_IMG) 更改為 EMPTY_IMG。
import copy,pygame,sys
from pygame.locals import *
EMPTY_IMG= pygame.image.load('C:super/fancy/file/path/transparent.png')
held_image=EMPTY_IMG
my_rect=held_image.get_rect()
my_rect.center = (50,50)
screen.blit(held_image,my_rect)
然后一切正常。
只需在無限循環中更新顯示。
輸入這個:
pygame.display.update()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.