Issue #6639: Module-level turtle functions no longer raise TclError after
closing the window.
This commit is contained in:
commit
4f38e483c2
|
@ -1288,7 +1288,7 @@ class TurtleScreen(TurtleScreenBase):
|
||||||
def _incrementudc(self):
|
def _incrementudc(self):
|
||||||
"""Increment update counter."""
|
"""Increment update counter."""
|
||||||
if not TurtleScreen._RUNNING:
|
if not TurtleScreen._RUNNING:
|
||||||
TurtleScreen._RUNNNING = True
|
TurtleScreen._RUNNING = True
|
||||||
raise Terminator
|
raise Terminator
|
||||||
if self._tracing > 0:
|
if self._tracing > 0:
|
||||||
self._updatecounter += 1
|
self._updatecounter += 1
|
||||||
|
@ -3754,7 +3754,7 @@ class _Screen(TurtleScreen):
|
||||||
Turtle._screen = None
|
Turtle._screen = None
|
||||||
_Screen._root = None
|
_Screen._root = None
|
||||||
_Screen._canvas = None
|
_Screen._canvas = None
|
||||||
TurtleScreen._RUNNING = True
|
TurtleScreen._RUNNING = False
|
||||||
root.destroy()
|
root.destroy()
|
||||||
|
|
||||||
def bye(self):
|
def bye(self):
|
||||||
|
@ -3795,7 +3795,6 @@ class _Screen(TurtleScreen):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
class Turtle(RawTurtle):
|
class Turtle(RawTurtle):
|
||||||
"""RawTurtle auto-creating (scrolled) canvas.
|
"""RawTurtle auto-creating (scrolled) canvas.
|
||||||
|
|
||||||
|
@ -3818,18 +3817,6 @@ class Turtle(RawTurtle):
|
||||||
|
|
||||||
Pen = Turtle
|
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"):
|
def write_docstringdict(filename="turtle_docstringdict"):
|
||||||
"""Create and write docstring-dictionary to file.
|
"""Create and write docstring-dictionary to file.
|
||||||
|
|
||||||
|
@ -3952,26 +3939,38 @@ def _screen_docrevise(docstr):
|
||||||
## as functions. So we can enhance, change, add, delete methods to these
|
## as functions. So we can enhance, change, add, delete methods to these
|
||||||
## classes and do not need to change anything here.
|
## 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:
|
def _make_global_funcs(functions, cls, obj, init, docrevise):
|
||||||
pl1, pl2 = getmethparlist(eval('_Screen.' + methodname))
|
for methodname in functions:
|
||||||
if pl1 == "":
|
method = getattr(cls, methodname)
|
||||||
print(">>>>>>", pl1, pl2)
|
pl1, pl2 = getmethparlist(method)
|
||||||
continue
|
if pl1 == "":
|
||||||
defstr = ("def %(key)s%(pl1)s: return _getscreen().%(key)s%(pl2)s" %
|
print(">>>>>>", pl1, pl2)
|
||||||
{'key':methodname, 'pl1':pl1, 'pl2':pl2})
|
continue
|
||||||
exec(defstr)
|
defstr = __func_body.format(obj=obj, init=init, name=methodname,
|
||||||
eval(methodname).__doc__ = _screen_docrevise(eval('_Screen.'+methodname).__doc__)
|
paramslist=pl1, argslist=pl2)
|
||||||
|
exec(defstr, globals())
|
||||||
|
globals()[methodname].__doc__ = docrevise(method.__doc__)
|
||||||
|
|
||||||
for methodname in _tg_turtle_functions:
|
_make_global_funcs(_tg_screen_functions, _Screen,
|
||||||
pl1, pl2 = getmethparlist(eval('Turtle.' + methodname))
|
'Turtle._screen', 'Screen()', _screen_docrevise)
|
||||||
if pl1 == "":
|
_make_global_funcs(_tg_turtle_functions, Turtle,
|
||||||
print(">>>>>>", pl1, pl2)
|
'Turtle._pen', 'Turtle()', _turtle_docrevise)
|
||||||
continue
|
|
||||||
defstr = ("def %(key)s%(pl1)s: return _getpen().%(key)s%(pl2)s" %
|
|
||||||
{'key':methodname, 'pl1':pl1, 'pl2':pl2})
|
|
||||||
exec(defstr)
|
|
||||||
eval(methodname).__doc__ = _turtle_docrevise(eval('Turtle.'+methodname).__doc__)
|
|
||||||
|
|
||||||
|
|
||||||
done = mainloop
|
done = mainloop
|
||||||
|
|
|
@ -344,6 +344,8 @@ class DemoWindow(object):
|
||||||
else:
|
else:
|
||||||
self.state = DONE
|
self.state = DONE
|
||||||
except turtle.Terminator:
|
except turtle.Terminator:
|
||||||
|
if self.root is None:
|
||||||
|
return
|
||||||
self.state = DONE
|
self.state = DONE
|
||||||
result = "stopped!"
|
result = "stopped!"
|
||||||
if self.state == DONE:
|
if self.state == DONE:
|
||||||
|
@ -369,7 +371,9 @@ class DemoWindow(object):
|
||||||
turtle.TurtleScreen._RUNNING = False
|
turtle.TurtleScreen._RUNNING = False
|
||||||
|
|
||||||
def _destroy(self):
|
def _destroy(self):
|
||||||
|
turtle.TurtleScreen._RUNNING = False
|
||||||
self.root.destroy()
|
self.root.destroy()
|
||||||
|
self.root = None
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
@ -13,6 +13,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #6639: Module-level turtle functions no longer raise TclError after
|
||||||
|
closing the window.
|
||||||
|
|
||||||
- Issues #814253, #9179: Group references and conditional group references now
|
- Issues #814253, #9179: Group references and conditional group references now
|
||||||
work in lookbehind assertions in regular expressions.
|
work in lookbehind assertions in regular expressions.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue