Get tkinter.tclerror when closing python turtle before it finished it's draw Get tkinter.tclerror when closing python turtle before it finished it's draw tkinter tkinter

Get tkinter.tclerror when closing python turtle before it finished it's draw


Paint the turtle on a Canvas object from which you can have access to the Tkinter root.Capture the WM_DELETE_WINDOW event of the root. When the event is captured, del the turtle object so that it can't keep trying to draw. The thread controlling the turtle events will throw a NameError because the turtle has been deleted. Catch the NameError exception and ignore it.

Here's code to do this. I tested it; it works & doesn't thrown any error:

import turtleimport Tkinterimport sysimport easygui as egdef isNum(s):    try:        int(s)        return True    except ValueError:        return Falserun = Truewhile run:    msg         = "Input"    title       = "Koch snowflake"    fieldNames  = ["Length","Depth"]    fieldValues = []  # we start with blanks for the values    fieldValues = eg.multenterbox(msg,title, fieldNames)    a=0    iterations=0# make sure that none of the fields was left blank    while 1:  # do forever, until we find acceptable values and break out        if fieldValues == None:             break        errmsg = ""        # look for errors in the returned values        for i in range(len(fieldNames)):            if fieldValues[i].strip() == "":                errmsg = errmsg + ('"%s" must be filled.\n\n' % fieldNames[i])            elif not (isNum(fieldValues[i].strip())):                errmsg = errmsg + ('"%s"  requires a number.\n\n' % fieldNames[i])        if (isNum(fieldValues[1])):            if float(fieldValues[1].strip()) > 13:                errmsg = errmsg + ('Depth cannot be more than 13!')         if errmsg == "":             break # no problems found        else:            # show the box again, with the errmsg as the message                fieldValues = eg.multenterbox(errmsg, title, fieldNames, fieldValues)    #a=float(input("Length: "))    if not fieldValues == None:        if isNum(fieldValues[0]) and isNum(fieldValues[1]):            a=float(fieldValues[0])            iterations=int(fieldValues[1])    else:        sys.exit(0)    root = Tkinter.Tk()    cv = turtle.Canvas(root, width=200, height=200)    cv.pack()    screen = turtle.TurtleScreen(cv)    screen.bgcolor("black")    myturtle = turtle.RawTurtle(screen)    def lastAction():        global myturtle        del myturtle        root.destroy()    root.protocol('WM_DELETE_WINDOW', lastAction)    try:#turtle settings        screen.bgcolor("black")        myturtle.reset()        myturtle.up()         myturtle.setpos(-a*1.5 ,a)        myturtle.down()        turtle.delay(0)        myturtle.speed(0)        myturtle.pencolor("white")        koch_flake = "EJEJE"        for i in range(iterations):            koch_flake = koch_flake.replace("E","EBEJEBE\n")        myturtle.down()        for move in koch_flake:            if move == "E":                myturtle.forward(a / (3 ** (iterations - 1)))            elif move == "B":                myturtle.left(60)            elif move == "J":                myturtle.right(120)        myturtle.hideturtle()    except NameError:        pass    image   = "KochSnowflake.gif"    msg = "Run it again?"    title = "Please Confirm"    if eg.ynbox(msg, title,('Yes', 'No'),image):     # show a Continue/Cancel dialog        run = True    else:  # user chose Cancel        sys.exit(0)