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)