Wo liegt der Fehler? (pygame)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Tac0
User
Beiträge: 6
Registriert: Sonntag 7. September 2008, 21:01

Sonntag 7. September 2008, 21:17

Hallo,
Ich habe vor kurzem angefangen mich mit pygame zu beschäftigen und war gleich am Anfang ziemlich verwirrt, da das ganze ziemlich kompliziert war und so ziemlich kein Tutorial wirklich Anfängerfreundlich war. Im Moment ist das einzige was ich vorzeigen kann dieses unvollständige Script, welches ich von dieser Seite auswendig gelernt habe. Das meiste leuchtet mir ein, aber ich verstehe nicht warum es nur ein schwarzes Fenster anzeigt, wenn ich versuche es zu starten. (Die Datei stars.bmp liegt im Ordner "data", welches im selben Ordner liegt wie die Datei spacegame2.py)

Code: Alles auswählen

import pygame, os, random
from pygame.locals import *
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption("Space Game")
pygame.mouse.set_visible(True)
def main():
    pygame.init()
    random.seed()

def load_image(file_name, colorkey=None):
    full_name = os.path.join("data", file_name)

    try:
        image = pygame.image.load(full_name)
    except pygame.error, message:
        print "Cannot load image", file_name
        raise SystemExit, message

    image = image.convert()

    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)

    return image, image.get_rect()

if __name__ == "__main__": main()

background_image = load_image("stars.bmp", colorkey=None)
screen.blit(background, (0,0))
Zuletzt geändert von Tac0 am Samstag 13. September 2008, 22:04, insgesamt 2-mal geändert.
BlackJack

Sonntag 7. September 2008, 21:29

Äh, Du bist nicht nur bei Pygame neu, sondern bei Python bzw. Programmieren im allgemeinen, oder!?

Vielleicht solltest Du erst einmal die Grundlagen von Python lernen. IMHO sollte man auf jeden Fall das Tutorial aus der Python-Dokumentation durchgearbeitet haben.

Und keinen fremden Quelltext "auswending lernen" was wohl eine Umschreibung von "abgeschrieben ohne ihn verstanden zu haben" ist.
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Donnerstag 11. September 2008, 10:33

Erlich gesagt wunder es mich nicht das dort nichts kommt.
Loadimage und blit sind in der gleichen Funktion aber hinter ein Return ...
also springt Python zurück bevor es dort ankommt.

Solltest die zwei Linien richtig einrücken bzw. in eine Funktioni packen oder unter dein if __name__.

Und um das ganze zu 100% anzeigen zu lassen solltest Du auch mal die Pygame.display.update() bzw update(rect) benutzen.
Alternativ für Doublebuffer wäre das dann pygame.display.flip()
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 11. September 2008, 13:38

Die Funktion load_image() wird doch auch garnicht aufgerufen von daher ist es egal wo das return sitzt.
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Freitag 12. September 2008, 07:25

@Sr4l, Jepp, aber hast gelesen was ich geschrieben habe ?
Soll doch die Zwei zeilen unter dem Return richtig einrücken..aber da es schon ein if __name__ gibt würde es unschön aussehen und daher doch lieber in eine eigene Funktion packen oder unter if __name__.

Dann macht das mit dem Return auch sinn ^^
Tac0
User
Beiträge: 6
Registriert: Sonntag 7. September 2008, 21:01

Samstag 13. September 2008, 18:59

Also erstmal entschuldigung dass ich so lange nicht zurück schreiben konnte...
Äh, Du bist nicht nur bei Pygame neu, sondern bei Python bzw. Programmieren im allgemeinen, oder!?

Vielleicht solltest Du erst einmal die Grundlagen von Python lernen. IMHO sollte man auf jeden Fall das Tutorial aus der Python-Dokumentation durchgearbeitet haben.

Und keinen fremden Quelltext "auswending lernen" was wohl eine Umschreibung von "abgeschrieben ohne ihn verstanden zu haben" ist.
Ich bin neu beim programmieren, wenn man von HTML und CSS mal absieht, ja.
Aber ich habe die Python-Grundlagen schon im Kopf und kann damit auch schon recht nützliche Sachen machen.
Ich schreibe es ja ab, um es zu verstehen. Wenn das Script fertig ist, würde ich versuchen es mit dem erworbenen Wissen zu erweitern, und wenn ich denke ich wär so weit würde ich ohne Hilfe versuchen etwas zu machen... das ist meine Art so etwas zu lernen.

Also ich habe jetzt jedenfalls die beiden Zeilen (25 und 26) unters if __name__ gesetzt, aber es tut sich nichts. Ich denke, es könnte an pygame an sich liegen, da es zb. Test-Skripte auch nur fehlerhaft lädt. deswegen werde ich es jetzt mal deinstallieren und noch mal neu installieren.
BlackJack

Samstag 13. September 2008, 19:28

HTML und CSS ist kein Programmieren.

Wenn ich mir den Quelltext da anschaue dann hast Du die Python-Grundlagen keineswegs im Kopf. Du scheinst keine Vorstellung davon zu haben welche Bedeutung die einzelnen Syntax-Elemente haben und wie der Kontrollfluss bei der Ausführung aussieht. Das ist einfach nur irgendetwas zusammen gehacktes was vielleicht Quelltext ähnlich sieht, den Du schon mal woanders gesehen hast. Von Verständnis was Du da machst, kann ich jedenfalls nichts entdecken. Das ist "programming by accident".
Tac0
User
Beiträge: 6
Registriert: Sonntag 7. September 2008, 21:01

Samstag 13. September 2008, 20:35

HTML und CSS ist kein Programmieren.
mein ich ja.

Zum Thema Python Grundlagen: Was müsste ich denn deiner Meinung nach beherrschen, um mich an pygame "heranwagen" zu können? "Grundlagen" ist ein wenig schwammig.
Wie schon gesagt, ich verstehe einiges, aber nicht alles. Und im Moment will ich auch nicht alles verstehen. Ich will erstmal dieses dämliche, nicht funktionierende Script zum laufen bringen. Dann sehe ich weiter.
Und der Text ist von der oben genannten Seite übernommen, und müsste so stimmen.
BlackJack

Samstag 13. September 2008, 20:51

Du müsstest verstehen wie Quelltext von Python interpretiert wird. In welcher Reihenfolge was und warum ausgeführt wird. Halt wie der Kontrollfluss bei einem Programmablauf aussieht.

So steht der Quelltext übrigens nicht in dem Artikel. Beziehungsweise sollte man den Text dazu auch lesen, wo steht was wo hin gehört.
Tac0
User
Beiträge: 6
Registriert: Sonntag 7. September 2008, 21:01

Samstag 13. September 2008, 21:08

Was ich weiß ist, dass die Module erst interpretiert werden wenn sie aufgerufen werden. Das sollte eigentlich reichen?
Dass der Text nicht so aussieht wie auf der Seite könnte daran liegen dass ich ein paar kleine Änderungen gemacht habe (Programm läuft im Fenster, Maus sichtbar) und dass eine Zeile fehlt:

image = image.convert()

Was mir im übrigen erst beim schreiben dieses Beitrags aufgefallen ist.
Viel schlauer bin ich jetzt aber trotzdem nicht, aber ich glaube die Fehlermeldung versucht mir was mitzuteilen:
Traceback (most recent call last):
File "C:\Python25\spacegame", line 30, in <module>
background_image, background_rect = load_image("stars.bmp")
TypeError: 'NoneType' object is not iterable
Ich hab das neue Skript mal in meinen ersten Post reineditiert.
BlackJack

Samstag 13. September 2008, 21:26

Nein, das Module erst interpretiert werden, wenn sie aufgerufen werden reicht eindeutig *nicht*.

Du musst verstehen und nachvollziehen können wann welche Zeile warum ausgeführt wird.

Die Fehlermeldung will Dir mitteilen, dass man `None` nicht an zwei Namen binden kann. Wenn auf der linken Seite einer Zuweisung ein Tupel von Namen steht, dann müssen von der rechten Seite genau so viele Objekte kommen, wie links Namen stehen. *Ein* `None` reicht nicht für *zwei* Namen.

Code: Alles auswählen

In [440]: a, b = None
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: 'NoneType' object is not iterable
Deine `load_image()`-Funktion liefert `None` zurück. Wenn der Kontrollfluss das Ende einer Funktion erreicht, gibt diese Funktion `None` zurück. Grundlagenwissen über Funktionen. Und warum das ``return`` nicht ausgeführt wird, sollte eigentlich auch klar sein, wenn man verstanden hat wie Codeblöcke im allgemeinen und ``if`` im besonderen funktioniert. Und ``if``-Abfragen sind nun wirklich kein exotisches Spezialwissen.

Arbeite am besten mal das Tutorial in der Dokumentation durch um ein Gefühl und besseres verständnis für die Syntaxund Sprache zu bekommen.
Tac0
User
Beiträge: 6
Registriert: Sonntag 7. September 2008, 21:01

Samstag 13. September 2008, 22:03

Das mit return war ein wirklich dummer Fehler, da hast du recht...
Du beziehst das mit None an zwei Namen binden wohl auf diese Zeile:

background_image, background_rect = load_image("stars.bmp")

Wenn ich nun das "background_rect" lösche und die Return funktion an die richtige Stelle setze, steht da:
Traceback (most recent call last):
File "C:\Python25\spacegame", line 31, in <module>
screen.blit(background, (0,0))
NameError: name 'screen' is not defined
Screen hab ich vergessen zu definieren, das nun auch ausgebessert:
Traceback (most recent call last):
File "C:\Python25\spacegame", line 31, in <module>
screen.blit(background, (0,0))
NameError: name 'background' is not defined
Wie soll ich background nun definieren? ich habe es mit

background = background_image

versucht, aber das scheint nicht zu funktionieren.

Das von dir genannte Tutorial werde ich mir auf jeden fall ansehen, aber im Moment will mir diese Sache einfach nicht aus dem Kopf gehen.

Hab den ersten Post jedenfalls nochmal editiert.
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Freitag 19. September 2008, 08:26

Also , ich würde erstmal das Tutorial durch arbeiten bevor Du dir noch länger ein abbrechen tust und nicht weiter kommst.
Wenn Du schon über image.load etwas lädst als background_image, dann blitte auch genau mit den gleichen Namen und nicht mit background.
Danach solltes es so wie es aussieht funktionieren, nur das Du kein Bild sehen wirst. Wie weiter oben schon mal geschrieben brauchst du noch display.update oder display.flip.

Code: Alles auswählen

rect=screen.blit(background_image,(0,0))
pygame.display.update(rect)
Daher arbeite erstmal ein Paar Tuts durch, lies die Python doku.
Es bringt Dir absolut nichts wenn Du dir das Hirn zermarterst und am Ende nur mit halbwissen dastehst aus Erkentniss herraus die eventuell zufallsbedingt zu einem Ergebniss führten.

Ein gutes Tut auf Deutsch aus dem Orginal von python.org kannst Du hier finden : http://python.net/~gherman/publications ... nline/tut/

Auf Pygame.org selber findest Du auch Tutorials zum Thema Pygame, so wie eine Doku der Funktionen.

Viel Erfolg und viel Spass.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 19. September 2008, 09:22

KC25m hat geschrieben:Ein gutes Tut auf Deutsch aus dem Orginal von python.org kannst Du hier finden : http://python.net/~gherman/publications ... nline/tut/
Hint: Uralt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Tac0
User
Beiträge: 6
Registriert: Sonntag 7. September 2008, 21:01

Freitag 19. September 2008, 13:58

Danke für die Hilfe KC25m, aber ich bin bereits selbst drauf gekommen. Der Fehler war glaub ich, dass ich, wie du sagtest, display.flip() vergessen habe und "background" nicht definiert war, und etwas in der load_image funktion.
Antworten