Probleme mit Multithreading mit dem turtle Modul

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Hi ich hab ne Frage wegen dem Turtle Modul.
Ich hab folgendes programmiert:

Code: Alles auswählen

import threading as th

import sys



############################################################################## VORBEREITUNG ########################################################################################################################################
sys.setrecursionlimit(90000)

screen=Screen()
turtle=Turtle()
screen.setup(1200,640)

turtle.begin_poly()
turtle.fd(5)
turtle.end_poly()
new=turtle.get_poly()
screen.register_shape("Schuss",new)


speicher=set()


############################################################################## VORBEREITUNG ########################################################################################################################################



#######SchussKlasse

class Schuss(th.Thread,Turtle):
    def __init__(self,speicher,instanz):
        self.instanz=instanz
        
        
        
        th.Thread.__init__(self)
        Turtle.__init__(self)
        self.speicher=speicher
        self.speicher.add(self)
        print(self.speicher)
        self.pu()
        
        
        self.shape("Schuss")
        self.leben=False
        self.speed(0)
        self.start()
    def spawn(self,instanz):
        self.ht() # verstecke Turtle
        self.goto(instanz.pos())
        self.setheading(instanz.heading())


        self.st() # Turtle wird sichtbar
        

        

    def streckeVor(self):
        self.leben=True
        self.speed(3)
        for i in range(100):
            self.fd(1) # Turtle geht um 1 Pixel vor, for schleife deswegen, weil ich nach jedem schuss später noch eine K
                        # Kollisionsabfragen machen will

    def run(self):
        self.spawn(self.instanz)
        self.streckeVor()
            
        
                  
        
        
        
    


class Spielfigur(Turtle):
    def __init__(self,spieler,screen,speicher):
        Turtle.__init__(self)
        
        self.speicher=speicher
        self.speicher.add(self)
        self.screen=screen
        self.pu()
        
        print(self,"spawnt an Punkt",self.pos())
        if spieler==True:
            self.interactive()


    def pos_(self):
        
        self.x0=self.xcor()-11
        self.y0=self.ycor()-11
        self.x1=self.xcor()+11
        self.y1=self.ycor()+11
        return ((self.x0,self.y0),(self.x1,self.y1))

    def fd_(self,distance=1):
        self.fd(distance)
        self.pos_()
        print(self.pos_())


    def lt_(self,degree=90):
        self.lt(degree)
        self.pos_()
        print(self.pos_())


    def rt_(self,degree=90):
        self.rt(degree)
        self.pos_()
        print(self.pos_())

        
    def bk_(self,distance=1):
        self.bk(distance)
        self.pos_()
        print(self.pos_())

    def schuss(self):
        schuss=Schuss(self.speicher,self)
        
        
        
        

    def interactive(self):
        self.screen.onkeypress(self.fd_,"w")
        self.screen.onkeypress(self.bk_,"s")
        self.screen.onkeypress(self.rt_,"d")
        self.screen.onkeypress(self.lt_,"a")
        self.screen.onkeypress(self.schuss,"space")
        
        
    
        
screen=Screen()
screen.listen()
a=Spielfigur(True,screen,speicher)
        

Das Problem bei der Sache ist, dass die SchussObjekte sich nicht gleichzeitig bewegen, sondern nur eins nach dem anderen. Außerdem stoppt die Spielfigur für ne kurze Zeit im Laufen. Dies wollte ich lösen indem ich die objekte gleichzeitig laufen lass, ich hab mir ein Paar tutorials von galieo computing über threading modul durchgelesen und wollte das jetzt anwenden. Es klappt aber nicht, denn wenn ich zweimal hintereinander schießen will bekomme ich (nicht von der IDLE) folgende Feherlmeldung: Microsoft Visual C++ Runtime Library: Runtime Error... this application has requested the runtime to terminate it in an unusual way... nervt halt ein wenig, denn sonst kanns nicht nach meinen Vorstellungen laufen. Ich habs auch schon mit dem Modul _thread probiert, allerdings klappt es da auch nicht.

Was soll ich machen, damit es funzt? Könnt ihr mir das sagen?? Und was hat es mit dieser Fehlermeldung auf sich
BlackJack

@Newcomer: GUIs und Threads vertragen sich nicht. Konkret darf auf die GUI nur aus dem Thread zugegriffen werden, in dem auch die Hauptschleife des GUI-Toolkits läuft. Sonst kann alles mögliche passieren — bis hin zu harten Programmabstürzen, wie Du sie ja gesehen hast.

Ebenfalls die Finger lassen sollte man vom Rekursionslimit. Wenn man das hinauf setzt, kann es auch zu harten Abstürzen kommen.

Lösung wäre wohl die `after()`-Methode auf `Tkinter`-Widgets um damit eine Funktion/Methode periodisch aufzurufen, welche die Aktualisierung des Spielgeschehens übernimmt.
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

ah jaa.. Danke :D :D
Antworten