diff -r c69be794a9c6 Lib/turtle.py --- a/Lib/turtle.py Wed Sep 03 19:54:06 2014 -0400 +++ b/Lib/turtle.py Thu Sep 04 11:04:03 2014 +0300 @@ -1287,7 +1287,7 @@ def _incrementudc(self): """Increment update counter.""" if not TurtleScreen._RUNNING: - TurtleScreen._RUNNNING = True + TurtleScreen._RUNNING = True raise Terminator if self._tracing > 0: self._updatecounter += 1 @@ -3753,7 +3753,7 @@ Turtle._screen = None _Screen._root = None _Screen._canvas = None - TurtleScreen._RUNNING = True + TurtleScreen._RUNNING = False root.destroy() def bye(self): @@ -3794,7 +3794,6 @@ except AttributeError: exit(0) - class Turtle(RawTurtle): """RawTurtle auto-creating (scrolled) canvas. @@ -3817,18 +3816,6 @@ Pen = Turtle -def _getpen(): - """Create the 'anonymous' turtle if not already present.""" - if Turtle._pen is None: - Turtle._pen = Turtle() - return Turtle._pen - -def _getscreen(): - """Create a TurtleScreen if not already present.""" - if Turtle._screen is None: - Turtle._screen = Screen() - return Turtle._screen - def write_docstringdict(filename="turtle_docstringdict"): """Create and write docstring-dictionary to file. @@ -3951,14 +3938,29 @@ ## as functions. So we can enhance, change, add, delete methods to these ## classes and do not need to change anything here. +__func_body = """\ +def {name}{paramslist}: + if {obj} is None: + if not TurtleScreen._RUNNING: + TurtleScreen._RUNNING = True + raise Terminator + {obj} = {init} + try: + return {obj}.{name}{argslist} + except TK.TclError: + if not TurtleScreen._RUNNING: + TurtleScreen._RUNNING = True + raise Terminator + raise +""" for methodname in _tg_screen_functions: pl1, pl2 = getmethparlist(eval('_Screen.' + methodname)) if pl1 == "": print(">>>>>>", pl1, pl2) continue - defstr = ("def %(key)s%(pl1)s: return _getscreen().%(key)s%(pl2)s" % - {'key':methodname, 'pl1':pl1, 'pl2':pl2}) + defstr = __func_body.format(obj='Turtle._screen', init='Screen()', + name=methodname, paramslist=pl1, argslist=pl2) exec(defstr) eval(methodname).__doc__ = _screen_docrevise(eval('_Screen.'+methodname).__doc__) @@ -3967,8 +3969,8 @@ if pl1 == "": print(">>>>>>", pl1, pl2) continue - defstr = ("def %(key)s%(pl1)s: return _getpen().%(key)s%(pl2)s" % - {'key':methodname, 'pl1':pl1, 'pl2':pl2}) + defstr = __func_body.format(obj='Turtle._pen', init='Turtle()', + name=methodname, paramslist=pl1, argslist=pl2) exec(defstr) eval(methodname).__doc__ = _turtle_docrevise(eval('Turtle.'+methodname).__doc__) diff -r c69be794a9c6 Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py Wed Sep 03 19:54:06 2014 -0400 +++ b/Lib/turtledemo/__main__.py Thu Sep 04 11:04:03 2014 +0300 @@ -342,6 +342,8 @@ else: self.state = DONE except turtle.Terminator: + if self.root is None: + return self.state = DONE result = "stopped!" if self.state == DONE: @@ -367,7 +369,9 @@ turtle.TurtleScreen._RUNNING = False def _destroy(self): + turtle.TurtleScreen._RUNNING = False self.root.destroy() + self.root = None def main():