[Python-de] Das Modul pygame

Gregor Lingl glingl at aon.at
Fri Jan 31 00:15:10 EST 2003


Kathleen Dennler schrieb:

>hallo liste
>
>über python.org und einige links bin ich auf das modul pygame
>(www.pygame.org) gestoßen. es wurde beschrieben, dass sich damit nicht nur spiele
>programmieren lassen sondern dass das modul allgemein für kleinere animationen
>geeingnet ist. meine freude war zunächst groß, da das genau das ist, was ich
>momentan benötige. die ersten probleme traten jedoch schon beim schließen eines
>einfachen fensters auf. mir stürzt das gesamte python jedesmal ab. gibt es
>jemanden, der mir hierbei helfen könnte? Die zeilen sind eingentlich recht einfach:
>  
>
Hallo Kathleen!
Ich bin ja auch nicht gerade ein pygame-Spezialist (sondern eher neugierig
darauf, was andere damit anfangen ...), aber ich will trotzdem hier eine
kleine Hilfestellung versuchen:

zunächst enthält dein Code neben dem von Stefan erwähnten Fehler noch zwei
weitere einfache:

(1) MOUSEBUTTONDOWN,KEYBUTTONDOWN ... was soll denn das
bedeuten? Meintest du etwa pygame.MOUSEBUTTONDOWN ... ?
Gibt's nicht. Vielmehr sind diese "Konstanten" in pygame.constants 
definiert, und
du kannst alle diese Konstanten mit der from ... import *  Anweisung 
bekannt machen.

(2) KEYBUTTONDOWN heißt in Wahrheit KEYDOWN

>
>import pygame
>
>pygame.display.init()    #Erstellt das Fenster
>
>if pygame.event.peek([MOUSEBUTTONDOWN,KEYBUTTONDOWN]: 
>
                              #=1 wenn maus/taste betätigt wird

>        pygame.display.quit()
>
(3) ... und der dritte Fehler ist grundsätzlicher: Ein event muss in der 
Regel immer
          wiedern abgefragt werden, wobei es meistens ja gerade nicht 
eingetreten ist,
          manchmal aber eben doch. Dann kann darauf reagiert werden.

Sowas macht man in einer Schleife.

Ein einfacher Test in deinem Sinn, bei dem sich das Fenster nach drei Klicks
oder Tasten schließt, könnte etwa so aussehen:

import pygame
from pygame.constants import *

pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Kathleen's Test")
klicks = 0
while 1:  # für immer ...
    if pygame.event.get([MOUSEBUTTONDOWN,KEYDOWN]):
        klicks = klicks + 1
        print "Ups", klicks
        if klicks == 3:   # ... d. h. bis hierher
            break

Nicht gerade das Gelbe vom Ei, aber hoffentlich ausreichend um
zu erklären, wie es geht.

Eine sehr gute Idee ist übrigens, das Chimp-Tutorial von der Pygame-Website
zu lesen. "ChimpsLineByLine" ... Sollte nach der Installation von Pygame 
auch
auf deinem Computer zu finden sein:  im Ordner  
(Python22)\Pygame-Docs\docs\tut

>
>weiterhin würde mich auch interessieren, ob man Tkinter und pygame
>gleichzeitig verwenden könnte. 
>
Ich *weiß* das nicht, aber es würde mich *sehr* wundern, da sich 
verschiedene
Grafik-Bibliotheken in Python meiner Erfahrung nach fast nie vertragen.

>Es wäre ja ganz praktisch, nur die zu animierenden
>Objekte mit pygame zu bearbeiten und dann in ein tkinter-fenster einzufügen. Oder
>gibt es vielleicht ein mit pygame vergleichbares Modul?
>
Mit Tkinter alleine lassen sich auch ganz nette Animationen
machen. Ob es für dich ausreicht, weiß ich natürlich nicht,
weil ich ja nicht weiß, was du vor hast. Ein Beispiel schicke
ich dir als attachment: eine Animation der "Türme von Hanoi".

Das Beispiel ist aus dem gerade erschienen Buch "Python für Kids",
wo auch genau erklärt wird, *wie* man sowas mit Tkinter macht.
("Bonuskapitel 4, auf der CD") Wenn du Python installiert hast, einfach mit

python hanoig.py

starten.

Das Buch ist übrigens für Schüler/innen und Lehrer/innen gedacht,
ob sie nun am Albert Schweitzer Gymnasium in Erfurt oder an der
Theresianischen Akademie in Wien oder an irgend einer anderen
Schule sind ... Ein bisschen Interesse für Formales (Mathe, Chemie,
Informatik ...) ist gut, aber keineswegs Voraussetzung. Weil es
nämlich ohnehin durch das Buch geweckt wird ;-)

Liebe Grüße

Gregor

>Danke für die Hilfe
>
>Kathleen
>
>  
>
-------------- next part --------------
### Python für Kids - Kapitel B4 ###
# Autor: Gregor Lingl
# Datum: 29. 9. 2002
# hanoig.py
from Tkinter import Tk, Canvas
from Canvas import Rectangle
# from scheibe import Scheibe

usingIDLE = 0

class Scheibe(Rectangle):
    "Bewegliches Rechteck auf einem Tkinter-Canvas"
    def __init__(self,cv,pos,laenge,hoehe):
        x0, y0 = pos
        x1, x2 = x0-laenge/2.0, x0+laenge/2.0
        y1, y2 = y0-hoehe, y0
        Rectangle.__init__(self,cv,x1,y1,x2,y2,
                           fill = "red")
    def bewege_nach(self, x, y):
        from math import sqrt
        x1,y1,x2,y2 = self.coords()
        x0, y0 = (x1 + x2)/2, y2
        dx, dy = x-x0, y-y0
        d = sqrt(dx**2+dy**2)
        schritte = int(d/10) + 1
        dx, dy = dx/schritte, dy/schritte
        for i in range(schritte):
            self.move(dx,dy)
            self.canvas.update()
            self.canvas.after(20)

class Turm(list):
    def __init__(self, x, y, h):
        self.x = x
        self.y = y
        self.h = h
    def top(self):
        return self.x, self.y - len(self)*self.h

def hanoi(n,von,nach,hilf):
    if n==1:
        move(von,nach)
    else:
        hanoi(n-1,von,hilf,nach)
        hanoi(1,von,nach,hilf)
        hanoi(n-1,hilf,nach,von)

def move(von_turm, nach_turm):
    scheibe = von_turm.pop()
    x1, y1 = von_turm.top()
    x2, y2 = nach_turm.top()
    scheibe.bewege_nach(x1,20)
    scheibe.bewege_nach(x2,20)
    scheibe.bewege_nach(x2,y2)
    nach_turm.append(scheibe)

def hanoispiel(n):
    """Führt ein Hanoi-Spiel mit n Scheiben aus:"""
    root = Tk()                            # ein Fenster
    root.title("Türme von Hanoi")          # mit Titel,
    cv = Canvas(root,width=440,height=210) # eine Leinwand -
    cv.pack()                              # - aufspannen

    pflock1 = Rectangle(cv, 75, 40, 85,190,fill='blue')
    pflock2 = Rectangle(cv,215, 40,225,190,fill='blue')
    pflock3 = Rectangle(cv,355, 40,365,190,fill='blue')
    boden   = Rectangle(cv,  5,190,435,200,fill='black')

    turm_a = Turm( 80, 190, 15)
    turm_b = Turm(220, 190, 15)
    turm_c = Turm(360, 190, 15)

    for i in range(n):              # turm_a aufbauen
        laengen_differenz = 100 // n
        laenge = 120 - i * laengen_differenz
        s = Scheibe( cv, turm_a.top(), laenge, 13)
        turm_a.append(s)
    hanoi(n, turm_a, turm_b, turm_c)
    if not usingIDLE:
        root.mainloop()

if __name__ == '__main__':
    hanoispiel(7)


More information about the Python-de mailing list