8

I don't seem to able to get rid of this error, when I try to exist the game. the game runs fine but only get the error when I try to exist the game.

import pygame
from pygame import *
import random
import time
import os
import sys
from pygame.locals import *


black = (0,0,0)
white = (255,255,255)

pygame.init()

def game():

 os.environ['SDL_VIDEO_CENTERED'] = '1'
 mouse.set_visible(False)

#screen
screen_width = 800
screen_height = 500
screen = pygame.display.set_mode([screen_width,screen_height])
#load images etc.
backdrop = pygame.image.load('bg.jpg').convert_alpha()
menu = pygame.image.load('green.jpg').convert_alpha()
ballpic = pygame.image.load('ball.gif').convert_alpha()
mouseball = pygame.image.load('mouseball.gif').convert_alpha()
display.set_caption('Twerk')
back = pygame.Surface(screen.get_size())

def text(text,x_pos,color,font2=28):
    tfont = pygame.font.Font(None, font2)

    text=tfont.render(text, True, color)
    textpos = text.get_rect(centerx=back.get_width()/2)
    textpos.top = x_pos
    screen.blit(text, textpos)

start = False
repeat = False
while start == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            start = True
            #falling = True
            #finish = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                start = True
    #game over screen
    screen.blit(menu,[0,0])
    pygame.display.set_caption("TWERK")

    #Text
    #"Welcome to Escape"
    #needs replacing with logo 
    text("Twerk",60,white,300)

    #"Instructions"
    text("Instructions",310,white)
    text("----------------------------------------------------------------------------------------",320,white)
    text("Avoid the the enemies",340,white)
    text("Last as long as you can!",360,white)
    text("Press space to start",420,white)
    pygame.display.flip()


while start == True:
positionx=[]
positiony=[]
positionxmove=[]
positionymove=[]
falling = False
finish = False
score=0
enemies=4
velocity=1

for i in range(enemies):
  positionx.append(random.randint(300,400)+random.randint(-300,200))
  positiony.append(random.randint(200,340)+random.randint(-200,100))
  positionxmove.append(random.randint(1,velocity))
  positionymove.append(random.randint(1,velocity))


font = pygame.font.Font(None, 28)
text = font.render('Starting Twerk... ', True, (100,100,100))
textRect = text.get_rect()
textRect.centerx = screen.get_rect().centerx
textRect.centery = screen.get_rect().centery

screen.blit(backdrop, (0,0))
screen.blit(text, textRect)
pygame.display.update()
game=time.localtime()

while start == True:
  end=time.localtime()
  score= (end[1]-game[1])*3600 + (end[4]-game[4])*60 + end[5]-game[5]
  if score > 1: break

first=True
strtTime=time.localtime()

while not finish or falling:
  screen.blit(backdrop, (0,0))
  for i in range(enemies):
    screen.blit(ballpic,(positionx[i],positiony[i]))
    (mousex,mousey)=mouse.get_pos()
    screen.blit(mouseball,(mousex,mousey))
    display.update()
    strt = time.localtime()

  if first:
    while True:
      end=time.localtime()
      score= (end[3]-strt[3])*3600 + (end[4]-strt[4])*60 + end[5]-strt[5]
      if score > 3: break
    first = False

  if falling:
    for i in range(enemies):
      positionymove[i]=1000
      positionxmove[i]=0


  for i in range(enemies): positionx[i]=positionx[i]+positionxmove[i]
  for i in range(enemies): positiony[i]=min(600,positiony[i]+positionymove[i])

  if falling:
    falling=False
    for posy in positiony:
      if posy<600: falling=True


  if not falling:
    for i in range(enemies):
      for j in range(i+1,enemies):
        if abs(positionx[i]-positionx[j])<20 and abs(positiony[i]-positiony[j])<20:
          temp=positionxmove[i]
          positionxmove[i]=positionxmove[j]
          positionxmove[j]=temp
          temp=positionymove[i]
          positionymove[i]=positionymove[j]
          positionymove[j]=temp

    for i in range(enemies):  
      if positionx[i]>600: positionxmove[i]*=-1
      if positionx[i]<0: positionxmove[i]*=-1
      if positiony[i]>440: positionymove[i]*=-1
      if positiony[i]<0: positionymove[i]*=-1

    for i in range(enemies):
      if abs(positionx[i]-mousex)<40 and abs(positiony[i]-mousey)<40:
        falling = True
        finish = True
        #start = False
        endTime=time.localtime()
        score= (endTime[3]-strtTime[3])*3600 + (endTime[4]-strtTime[4])*60 + endTime[5]-strtTime[5]
        break

      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          pygame.quit()

          if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
              pygame.quit()




game()

This is the error I get, I've changed quit() to QUIT but still no luck.

Traceback (most recent call last):
File "C:\Users\MO\Desktop\Twerk\ballbounce_changed.py", line 171, in <module>
 game()
File "C:\Users\MO\Desktop\Twerk\ballbounce_changed.py", line 160, in game
 for event in pygame.event.get():
 pygame.error: video system not initialized

thank you :)

Ben Brocka
  • 2,006
  • 4
  • 34
  • 53
ErHunt
  • 311
  • 2
  • 9
  • 18
  • Possible duplicate of [pygame.error: video system not initialized](https://stackoverflow.com/questions/26767591/pygame-error-video-system-not-initialized) –  Nov 16 '18 at 09:59

5 Answers5

8

You should stop your main loop when you want to exit the game.

My suggestions, either of

  • call exit() after pygame.quit()
  • set finish = True and start = False (though due to some indentation issues with your pasted code it's not possible to tell that this would actually work)

You should call pygame.quit() only when you want to terminate your Python session.

My suggestion: if you want to call game() more than once, e.g. in an interactive session, you should remove the call to pygame.quit() inside game(). This function uninitializes pygame and naturally all attempts to call its functionality will fail then.

moooeeeep
  • 31,622
  • 22
  • 98
  • 187
  • Traceback (most recent call last): File "C:\Users\MO\Desktop\Twerk\ballbounce_changed.py", line 180, in game() File "C:\Users\MO\Desktop\Twerk\ballbounce_changed.py", line 109, in game screen.blit(backdrop, (0,0)) pygame.error: display Surface quit >>> – ErHunt Apr 21 '12 at 20:45
  • @mooeeeep , I changed the indentation now I'm getting the above error when I try to exist, it does exist. – ErHunt Apr 21 '12 at 20:46
  • @Badr I don't see any changes to indentation. You should split your code to far more functions. That'd make the code more readable and add information to the Traceback when it fails. – moooeeeep Apr 21 '12 at 20:53
  • @Badr are these >>> at the end of the Traceback the prompt of the python shell? See my edit then. – moooeeeep Apr 21 '12 at 20:58
  • http://pastebin.com/n7EnNyGW , all I want it to do is when finish == true it goes to end screen but instead it just restarts the game. also when I close i still get the above error, Yes I agree it should be split into different function but I'm on this a partner and this is his style :( – ErHunt Apr 21 '12 at 21:12
  • @Badr You might need also set `start = False`? You should really have an eye on the indentation, your indentation widths are inconsistent. This can be an evil source of error. Probably you also mix tab indentation and spaces indentation? Especially when you are team-developing this is crucial to be consistent on. See also [PEP8](http://www.python.org/dev/peps/pep-0008/) – moooeeeep Apr 21 '12 at 21:20
  • @moooeeep thank u start = false does take it to another screen. I'm used to c and java, try to get the hang of the indentation, yes i tend to mix space and tab. – ErHunt Apr 21 '12 at 21:31
  • @Badr then the indentation is probably the highest priority thing you need to fix. – moooeeeep Apr 25 '12 at 09:43
2

You called pygame.quit(), but I think you need to also call sys.exit().

for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()

This is what I do in all of my games.

Da-Jin
  • 221
  • 5
  • 16
1

I think it's because you call pygame.quit() manually. Pygame will auto-quit itself, when your script ends.

To double check pygame is working, you can run this boilerplate: http://ninmonkey.googlecode.com/hg/boilerplate/pygame/1.%20blank%20screen/1%20-%20basic.%20pygame%20--nocomments.py

When you want to quit, set done=True. ( See line 37 and line 64 in the above example. )

ninMonkey
  • 7,211
  • 8
  • 37
  • 66
0

I had this issue trying some Kivy test files using Spyder. In my case, because I was just trying out demo files, what quickly worked was restarting the kernel.

I know it's a blunt solution, but if you are on an IDE and you don't mind doing it, it's faster than typing commands.

raggot
  • 992
  • 15
  • 38
0

You can do :

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False # Here we exit the Loop and execute what after.
pygame.quit()

and It works fine !

Adam
  • 1