Pygame错误:显示表面退出:为什么?

时间:2010-01-04 05:49:04

标签: python pygame

任何人都可以告诉我为什么我的应用程序退出:

  

pygame错误:显示Surface退出。

9 个答案:

答案 0 :(得分:10)

我有类似的问题,发现Surface对象不喜欢被深度复制。当我在这样的对象上使用copy.deepcopy()然后访问副本时,我得到了那个奇怪的错误消息(没有调用pygame.quit())。也许你会遇到类似的行为?

答案 1 :(得分:1)

来自http://archives.seul.org/pygame/users/Nov-2006/msg00236.html

On Thu,2006-11-30 at 21:27 -0300,Nicolas Bischof写道:

  

pygame.error:显示Surface退出   这是什么意思?,我无法解决它

这意味着调用了pygame.display.quit()或pygame.quit()。如果 退出后你会尝试对显示器表面做任何事情 这个错误。

答案 2 :(得分:1)

我在一段非常简单的代码中遇到了类似的问题:

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

正在退出模块,而不是正在运行的程序,所以你需要 break 来摆脱这个简单的程序。 ]

仅供记录,这意味着好的版本是

    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)

答案 3 :(得分:1)

请确保您写的是pygame.QUIT:,而不是pygame.quit(): 我知道这听起来很奇怪,但是我遇到了同样的问题。

答案 4 :(得分:1)

我刚刚遇到了类似的问题,我已经找到了解决方案。

因为看起来 pygame.quit() 只会退出 pygame 模块而不是整个程序,所以在下一行使用 sys.exit() 方法。

之后:

pygame.quit()

放置这个:

sys.exit()

完整片段:

pygame.quit()
sys.exit()

答案 5 :(得分:0)

我也有这个问题,类似于MaciejMią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)

然后一切正常。

答案 6 :(得分:0)

我也有这个问题,但是从另一个来源得到了它。

我有一个像这样定义的类:

class PauseMenu(pygame.Surface)

我忘记初始化pygame.Surface并尝试blit时出错,使pygame.screen崩溃并给了我这个错误。

所以我刚刚添加了这个

pygame.Surface.__init__(self, (width, height))

答案 7 :(得分:0)

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后不能更改曲面而不会出现错误

答案 8 :(得分:0)

将if event.type == pygame.quit()替换为if event.type == pygame.QUIT: