Search code examples
pythonpygamewith-statementgeometry-surface

Pygame: <Surface: (Dead Display)> and Python's "with statement"


So I'm developing a game using Pygame and trying to abstract away a lot of the code. In the process though, I'm getting some weird errors. Namely, when I run main.py, I get this trace:

>>> 
initializing pygame...
initalizing screen...
initializing background...
<Surface(Dead Display)> #Here I print out the background instance
Traceback (most recent call last):
  File "C:\Users\Ceasar\Desktop\pytanks\main.py", line 19, in <module>
    background = Background(screen, BG_COLOR)
  File "C:\Users\Ceasar\Desktop\pytanks\background.py", line 8, in __init__
    self.fill(color)
error: display Surface quit

I imagine it has something to do with me using a context in my main to manage the screen.

#main.py
import math
import sys

import pygame
from pygame.locals import *

...

from screen import controlled_screen
from background import Background

BATTLEFIELD_SIZE = (800, 600)
BG_COLOR = 100, 0, 0
FRAMES_PER_SECOND = 20

with controlled_screen(BATTLEFIELD_SIZE) as screen:
    background = Background(screen, BG_COLOR)

    ...

#screen.py
import pygame.display
import os

#The next line centers the screen
os.environ['SDL_VIDEO_CENTERED'] = '1'

class controlled_screen:
    def __init__(self, size):
        self.size = size

    def __enter__(self):
        print "initializing pygame..."
        pygame.init()
        print "initalizing screen..."
        return pygame.display.set_mode(self.size)

    def __exit__(self, type, value, traceback):
        pygame.quit()

#background.py
import pygame

class Background(pygame.Surface):
def __init__(self, screen, color):
    print "initializing background..."
    print screen
    super(pygame.Surface, self).__init__(screen.get_width(),
                                         screen.get_height())
    print self
    self.fill(color)
    self = self.convert() 
    screen.blit(self, (0, 0))

Any thoughts on what is causing the error here?


Solution

  • Not technically my answer here, but the problem is that Surface cannot be extended with Python's super. Rather, it should be referred to as a Python old style class like so:

    class ExtendedSurface(pygame.Surface):
       def __init__(self, string):
           pygame.Surface.__init__(self, (100, 100))
           self.fill((220,22,22))
           # ...
    

    SOURCE: http://archives.seul.org/pygame/users/Jul-2009/msg00211.html