Search code examples
pythonpygame

Pygame Passing from main to game file causing errors


I receive a "pygame.error: display Surface quit" when trying to run the main.py file.

from Asteroid import Asteroid
import neat
import pygame

pygame.init()
neat.config.Config

Screenw, Screenh = 500, 500
windo = pygame.display.set_mode((Screenw, Screenh))

game = Asteroidick.Game()
game.__init__(windo)

running = True

while running:
    game.loop()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            key = pygame.key.name(event.key)
            game.input(key)
        
    pygame.quit()

Here's the Asteroid file

import pygame
import random

pygame.init()

class Game:

    red = random.randrange(256)
    green = random.randrange(256)
    blue = random.randrange(256)
    userred = 0
    usergreen = 0
    userblue = 0

    userlist = [userred, usergreen, userblue]
    points = 0 #this number increases every time you input the right color value.
    teext = f"Points: {points}" # + points
    i = 0


    def __init__(self, screen):
        pygame.display.set_caption("Asteroiiid")
        self.screen = screen
        self.screen.fill((255, 255, 255))

    def checker(self):
        righty = True
        if(self.userlist[0] != self.red):
            righty = False
        else: 
            self.points += 1
        if(self.userlist[1] != self.green):
            righty = False
        else: 
            self.points += 1
        if(self.userlist[2] != self.blue):
            righty = False
        else: 
            self.points += 1
        if righty:
            self.points += 1
        self.red = random.randrange(256)
        self.green = random.randrange(256)
        self.blue = random.randrange(256)
        self.userlist[0] = 0
        self.userlist[1] = 0
        self.userlist[2] = 0 
        self.i = 0

    def loop(self):
        self.teext = f"Points: {self.points}"
        if self.i == 3:
            self.checker()      
#<----------ERROR OCCURS HERE----------------->  
        self.screen.fill((self.red, self.green, self.blue))
        font = pygame.font.SysFont("Arial", 24)
        score = font.render(self.teext, True, (0,0,0))
        redval = font.render(str(self.userlist[0]), True, (255,0,0))
        greenval = font.render(str(self.userlist[1]), True, (0, 255, 0))
        blueval = font.render(str(self.userlist[2]), True, (0,0,255))

        self.screen.blit(score,(0,0))
        self.screen.blit(redval,(400,100))
        self.screen.blit(greenval,(400,200))
        self.screen.blit(blueval,(400,300))
        pygame.display.flip()

    def input(self, key):
        if (key == 'up'):
            self.userlist[self.i] += 1
        if (key == 'return'):
            self.i = self.i + 1
        else:
            self.loop()
        #I think I'll just have the user enter values

pygame.quit()

If I comment out self.screen.fill((self.red,self.green,self.blue)) line, I receive a different error on the fonts.

I have been slowly building this file up and I've just moved the window to main. It worked before when I did not pass window to Asteroid. The init method also doesn't get errors, either.


Solution

  • When pygame.quit() is executed, all installed PyGame modules are deinstalled. All modules that were installed with the corresponding init call (or pygame.init()) are deinstalled. Every following call to a PyGame API function will cause an error. You must not call pygame.quit() in the application loop. Call it after the application loop.

    while running:
        game.loop()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                key = pygame.key.name(event.key)
                game.input(key)
    
    #<--|        
    pygame.quit()