8

Can anyone tell me why my app quits with:

pygame error: display Surface quit.

Mogsdad
  • 44,709
  • 21
  • 151
  • 275
Devo
  • 129
  • 1
  • 1
  • 3
  • 4
    Post the entire traceback, and at the very least the code for the function where the exception is raised. – Kylotan Jan 04 '10 at 11:42
  • 3
    Really, without a [mcve], this question should be closed. However, it's got some valuable answers worth keeping around. – Mogsdad Jan 18 '18 at 21:46

10 Answers10

11

I had similar problem and discovered that Surface objects don't like to be deepcopied. When I used copy.deepcopy() on such object and then accessed the copy, I got that strange error message (without calling pygame.quit()). Maybe you experience similar behavior?

Maciej Miąsik
  • 425
  • 4
  • 11
5

Replace if event.type == pygame.quit(): by if event.type == pygame.QUIT:

charlesreid1
  • 4,360
  • 4
  • 30
  • 52
Thomas Edison
  • 207
  • 2
  • 7
5

I had a similar problem in a very simple piece of code:

    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)

Error message was:

    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

So I put

    import pdb

at the top after

    pygame.init()

and used

    pdb.set_trace()

after the line with

    pygame.quit()

Now I ran the program, clicked to close the window and was actually a bit surprised to see that I fell into the debugger (after all, I expected the quit to completely take me out immediately). So I concluded that the quit doesn't actually stop everything at that point. Looked like the program was continuing beyond the quit, was reaching

    screen.fill(black)

and this was causing the problem. So I added

    break

after the

    pygame.quit()

and all works happily now.

[ Added later: It occurs to me now that

    pygame.quit()

is quitting the module, and not the program that is running, so you need the break to get out of this simple program. ]

Just for the record, this means the good version is

    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)
Robert
  • 1,530
  • 1
  • 16
  • 24
3

Make sure if you write pygame.QUIT: and not pygame.quit(): I know it sounds weird, but I had the same problem.

Yayati Sule
  • 1,601
  • 13
  • 25
2
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()

call sys.exit() after pygame.quit() to stop the program so you can not change the surface after you have quit pygame and not get the error

cCe.jbc
  • 107
  • 1
  • 9
2

I had the similar problem just right now and I have found a solution to it.

Because it seems like pygame.quit() will just quit the pygame module and not the entire program, use sys.exit() method on the following line.

After this:

pygame.quit()

Place this:

sys.exit()

Complete snippet:

pygame.quit()
sys.exit()
Eve
  • 104
  • 3
1

I had this problem too, but got it from another origin.

I had a class defined like this:

class PauseMenu(pygame.Surface)

i got the error when forgetting to initialize the pygame.Surface and trying to blit it, making pygame.screen crash and gave me this error.

so i just added this obviously

pygame.Surface.__init__(self, (width, height))
Johan Bjäreholt
  • 731
  • 1
  • 11
  • 24
1

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

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

pygame.error: display Surface quit what does that mean?, i can't fix it

This means a call was made to pygame.display.quit() or pygame.quit(). If you try to do anything to the display surface after quit you will get this error.

Hamish Grubijan
  • 10,562
  • 23
  • 99
  • 147
0

I too had this problem, and similar to Maciej Miąsik's answer mine had to do with copy.deepcopy()-ing an image.

I had:

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)

And I got the same error.

I simply changed the copy.deepcopy(EMPTY_IMG) to just 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)

Then it all worked fine.

hammythepig
  • 947
  • 2
  • 8
  • 30
-1

Just update the display in the infinite loop.

Type this:

pygame.display.update()