Skip to content Skip to sidebar Skip to footer

Python Terminator Error

I'm working on a Python project with a friend of mine for school. We have imported Turtle and Math. My problem is that when I use the 'Esc' button to close the window, I get an er

Solution 1:

when I use the "Esc" button to close the window, I get an error saying "Terminator Error"

The problem is you're using while True: in an event-based world, effectively shutting out the event system and causing things to happen in non-synchronous ways. The Terminator Error occurs when the turtle screen has been closed but methods are still acting as if it's running.

One way around this is to make everything work within the event model. Below I've eliminated your while True: loop and replaced it with a function that's called whenever the player moves to a new position. And I've cleaned up lots of other stuff for efficiency and/or style:

from turtle import Turtle, Screen

IMAGES = ["right.gif", "left.gif", "face.gif", "back.gif", "tresor.gif", "mur.gif", "sol.gif"]

FONT = ('Arial', 18, 'bold')

classStylo(Turtle):
    def__init__(self):
        Turtle.__init__(self, "mur.gif")
        self.color("white")
        self.penup()
        self.speed('fastest')

classJoueur(Turtle):
    def__init__(self):
        Turtle.__init__(self, "face.gif")
        self.color("blue")
        self.penup()
        self.speed('fastest')

    defhaut(self):
        move_to_x = self.xcor()
        move_to_y = self.ycor() + 24
        self.shape("back.gif")
        if (move_to_x, move_to_y) notin murs:
            self.goto(move_to_x, move_to_y)
        scorefn()

    defbas(self):
        move_to_x = self.xcor()
        move_to_y = self.ycor() - 24
        self.shape("face.gif")
        if (move_to_x, move_to_y) notin murs:
            self.goto(move_to_x, move_to_y)
        scorefn()

    defgauche(self):
        move_to_x = self.xcor() - 24
        move_to_y = self.ycor()
        self.shape("left.gif")
        if (move_to_x, move_to_y) notin murs:
            self.goto(move_to_x, move_to_y)
        scorefn()

    defdroite(self):
        move_to_x = self.xcor() + 24
        move_to_y = self.ycor()
        self.shape("right.gif")
        if (move_to_x, move_to_y) notin murs:
            self.goto(move_to_x, move_to_y)
        scorefn()

    defcollision(self, other):

        return self.distance(other) < 5classTresor(Turtle):
    def__init__(self, x, y):
        Turtle.__init__(self, "tresor.gif")
        self.penup()
        self.speed('fastest')
        self.goto(x, y)

    defdestruction(self):
        self.hideturtle()
        self.goto(2000, 2000)

NIVEAUX = [[
    "XXXXXXXXXXXXXXXXXXXXXXXXX",
    "XJ X      X             X",
    "X  X XXX  X    XXXXXXX  X",
    "X  X  TX  X          X  X",
    "X  XXXXX  X  X XXXXXXX  X",
    "X           X  X        X",
    "XXXXXXXX    X  XT X X   X",
    "X X    X XXXXXXXXXXXXXX X",
    "X X X  X X            X X",
    "X X XT X   X X   X    XTX",
    "X X XXXX X X XXXXXX X XXX",
    "X X    X X X TX     X   X",
    "X XXX XX   XXXXXXXXXXXXXX",
    "X        X X            X",
    "XXXXXXXX   XTX  X X XXX X",
    "X      X X XXX  X X XT  X",
    "X  XXX X X      X X XXXXX",
    "X XXT  X X  XXXXXXX X X X",
    "X  XXXXX X              X",
    "X          XXXXXXXXXX X X",
    "XXXXX  XXXXX            X",
    "X          X X X XX XXXXX",
    "X XXXXXXXX X XXX  X    XX",
    "X     TX   X  XT X   X  X",
    "XXXXXXXXXXXXXXXXXXXXXXXXX"]]

defsetup_labyrinthe(niveau):
    for y inrange(len(niveau)):
        for x inrange(len(niveau[y])):
            caractere = niveau[y][x]
            ecran_x = -288 + (x * 24)
            ecran_y = 288 - (y * 24)

            if caractere == "X":
                stylo.goto(ecran_x, ecran_y)
                stylo.stamp()
                murs.append((ecran_x, ecran_y))
            elif caractere == "J":
                joueur.goto(ecran_x, ecran_y)
            elif caractere == "T":
                tresors.append(Tresor(ecran_x, ecran_y))

defscorefn():
    global score

    for tresor in tresors:
        if joueur.collision(tresor):
            tresor.destruction()
            score += 100# On associe les touches du clavier.
            marker.undo()
            marker.write(score, font=FONT)
            tresors.remove(tresor)

fn = Screen()
fn.bgcolor("black")
fn.title("No Escape!")
fn.setup(700, 700)

fn.tracer(False)  # turn off screen updatesfor image in IMAGES:
    # On ajoute l'image a notre labyrinthe.
    fn.addshape(image)

stylo = Stylo()
joueur = Joueur()

tresors = []
murs = []

setup_labyrinthe(NIVEAUX[0])

fn.onkeypress(joueur.gauche, "Left")
fn.onkeypress(joueur.droite, "Right")
fn.onkeypress(joueur.haut, "Up")
fn.onkeypress(joueur.bas, "Down")
fn.onkey(fn.bye, "Escape")
fn.listen()

score = 0

marker = Turtle(visible=False)
marker.penup()
marker.color('green')
marker.goto(180, 315)
marker.write(score, font=FONT)

fn.tracer(True)  # turn screen updates back on

fn.mainloop()

My next warning is that turtles wander a floating point plane. Comparing wall positions in a list directly against turtle positions might not always work (ponder 315.0 vs. 315.00003). Like treasures, consider using turtle's distance() method (which works with positions as well as other turtles) and a fudge factor to determine if you will be too close to a wall instead of exactly at one.

Post a Comment for "Python Terminator Error"