Seite 1 von 1

pygame problem: video system not initialized

Verfasst: Freitag 4. Dezember 2009, 17:48
von Lerikson
hi,
ich habe gerade angefangen eine kleine Demoanwendung in Python zu schreiben und alles lief auch gut, bis ich versuchte einen Colorkey bei einem Bild zu setzen... Das ist ja nicht das Problem, jetzt mault IDLE nämlich an einer Zeile die sonst immer funktioniert hat rum:
Hier mal der gesamte code:

Code: Alles auswählen

# import pygame (all)
import pygame
from pygame.locals import *

# path to the images
bif = "background.jpg"
mif = "crosshair.png"
baif = "ballon.png"

# initialise pygame/screen
pygame.init()
screen = pygame.display.set_mode((640,480),0,32)

# loading the images
background = pygame.image.load(bif).convert()
crosshair = pygame.image.load(mif).convert_alpha()
ballon = pygame.image.load(baif).convert_alpha()

# making the normal cursor disappear
pygame.mouse.set_visible(False)

# setting colorkey for baloon image
#colorkey = ballon.get_at((0,0))
ballon.set_colorkey((255,255,255))

# the Gameloop
while True:
    for event in pygame.event.get():
        # if "exit" event close application
        if event.type == QUIT:
            pygame.quit()

    # variables for the ballon coordinates
    ballon_x,ballon_y = 100,100
    
    # get mouse position
    crosshair_x,crosshair_y = pygame.mouse.get_pos()

    # correct to the middle of the image
    crosshair_x -= crosshair.get_width()/2
    crosshair_y -= crosshair.get_height()/2

    # blitting all on the screen (first background, than baloon than crosshair)
    screen.blit(background, (0,0))
    screen.blit(ballon,(ballon_x,ballon_y))
    screen.blit(crosshair, (crosshair_x,crosshair_y))

    # update
    pygame.display.update()
    
und der Fehler:
Traceback (most recent call last):
File "C:\Users\Lennart\Desktop\shooter.py", line 37, in <module>
crosshair_x,crosshair_y = pygame.mouse.get_pos()
error: video system not initialized
...ich werde daraus nicht schlau, erkennt ihr dort einen Fehler??

mfg,
Lennart

Verfasst: Freitag 4. Dezember 2009, 18:30
von BlackJack
Versuch's mal ohne IDLE. Verschiedene GUI-Toolkits sollte man nicht mischen.

Verfasst: Sonntag 6. Dezember 2009, 12:56
von Lerikson
also die Fehlermeldung kommt zwar immer noch, allerdings funktioniert die Demo sonst einwandfrei (habe max. 500FPS), gibt es eigentlich Pygame benchmarks (im Vergleich zur C++/SDL oder zu Rubygame)?

Verfasst: Montag 7. Dezember 2009, 10:29
von mkesper
Du rufst die Abfrage erst nach der Gameloop auf, d.h. pygame hat schon den QUIT-Event erhalten. Sonst stimmt die Einrückung deines Codes mit Sicherheit nicht.

Verfasst: Montag 7. Dezember 2009, 20:03
von Lerikson
hmm dake für den tipp, aber warum läuft das ganze wie "geschmiert", wenn es einen Fehler gibt?

Verfasst: Montag 7. Dezember 2009, 20:38
von yipyip
Das Ganze laeuft dehalb wie geschmiert, weil der Fehler erst beim Beenden des Programmes auftritt.
Beim Schliessen des Fensters wird in Zeile 31 zwar 'pygame.quit()' aufgerufen, die Gameloop laeuft danach aber weiter. In Zeile 37 wird dann auf 'pygame' zugegriffen, obwohl dieses Objekt schon nicht mehr existiert. Also musst Du dafuer sorgen (z.B. mit einer Kontrollvariable), dass die Gameloop nach Zeile 31 verlassen wird, wenn das Fenster geschlossen wird.

:wink:
yipyip

Verfasst: Dienstag 8. Dezember 2009, 17:38
von Lerikson
danke für den Hinweis, ich habe das ganze jetzt wie vorgeschlagen umgesetzt und es funktioniert nun auch ohne Fehler

Hier mal der betreffende Code:

Code: Alles auswählen

# gameloop variable
running = True
# the Gameloop
while running == True:
    # start clock (allow just 50 fps)
    clock.tick(50)
    
    for event in pygame.event.get():
        # if "exit" event close application
        if event.type == QUIT:
            pygame.quit()
            running = False
            
    # check gameloop variable
    if running == False:
        break
Danke für die hilfe

Verfasst: Dienstag 8. Dezember 2009, 19:21
von BlackJack
@Lerikson: Bei `running` sind aber ein paar Anmerkungen nötig: Es ist sinnlos die Bedingung sowohl in der ``while``-Bedingung als auch in dem ``if`` innerhalb der Schleife zu überprüfen. Dann sollte man keine Vergleiche auf `True` und `False` durchführen, wenn das andere beteiligte Objekt bereits *selbst* `True` oder `False` ist. Also ``while running:`` und ``if not running:``. Last but not least ist `running` hier überflüssig, wenn man einfach eine "Endlosschleife" mit ``while True:`` schreibt, und an der Stelle wo `running` an `False` gebunden wird, diese Schleife direkt mit einem ``break`` verlässt.

Verfasst: Dienstag 8. Dezember 2009, 20:44
von yipyip
@BlackJack:
Wenn in Zeile 12 'running = False' durch ein 'break' ersetzt wird, wird doch aber nur die innere for-Schleife beendet und nicht wie gewuenscht, die aeussere while-Schleife.

Verfasst: Mittwoch 9. Dezember 2009, 14:40
von Lerikson
ok, mit dem auf True und False prüfen hast du recht das ist echt ein bissl überflüssig, allerdings dachte ich das wäre so besser, und bei der Stelle

Code: Alles auswählen

running = False
würde ein

Code: Alles auswählen

break
wie schon gesagt nur die For Schleife beenden...darum habe ich es dort unten eingebaut

Verfasst: Mittwoch 9. Dezember 2009, 17:30
von BlackJack
Ups, das hatte ich übersehen. Naja, dann packt man das ganze in eine Funktion und an der Stelle ein ``return``. Code auf Modulebene ist ja sowieso nicht schön.