turtle.py revision 46afef330f88ddcf4106094e86f54f90dbdec390
197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#
297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# turtle.py: a Tkinter based turtle graphics module for Python
3eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl# Version 1.1b - 4. 5. 2009
497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#
5eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl# Copyright (C) 2006 - 2009  Gregor Lingl
697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# email: glingl@aon.at
797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#
897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# This software is provided 'as-is', without any express or implied
997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# warranty.  In no event will the authors be held liable for any damages
1097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# arising from the use of this software.
1197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#
1297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# Permission is granted to anyone to use this software for any purpose,
1397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# including commercial applications, and to alter it and redistribute it
1497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# freely, subject to the following restrictions:
1597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#
1697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# 1. The origin of this software must not be misrepresented; you must not
1797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#    claim that you wrote the original software. If you use this software
1897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#    in a product, an acknowledgment in the product documentation would be
1997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#    appreciated but is not required.
2097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# 2. Altered source versions must be plainly marked as such, and must not be
2197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#    misrepresented as being the original software.
2297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# 3. This notice may not be removed or altered from any source distribution.
2397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
24b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
25477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters"""
26477c8d5e70240744d24631b18341ad892c8a8e1cThomas WoutersTurtle graphics is a popular way for introducing programming to
27477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouterskids. It was part of the original Logo programming language developed
2897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisby Wally Feurzig and Seymour Papert in 1966.
29477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
30477c8d5e70240744d24631b18341ad892c8a8e1cThomas WoutersImagine a robotic turtle starting at (0, 0) in the x-y plane. Give it
31477c8d5e70240744d24631b18341ad892c8a8e1cThomas Woutersthe command turtle.forward(15), and it moves (on-screen!) 15 pixels in
32477c8d5e70240744d24631b18341ad892c8a8e1cThomas Woutersthe direction it is facing, drawing a line as it moves. Give it the
33477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouterscommand turtle.left(25), and it rotates in-place 25 degrees clockwise.
34477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
35477c8d5e70240744d24631b18341ad892c8a8e1cThomas WoutersBy combining together these and similar commands, intricate shapes and
36477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouterspictures can easily be drawn.
3797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis----- turtle.py
3997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
4097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisThis module is an extended reimplementation of turtle.py from the
41f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark DickinsonPython standard distribution up to Python 2.5. (See: http://www.python.org)
4297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
4397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisIt tries to keep the merits of turtle.py and to be (nearly) 100%
4497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwiscompatible with it. This means in the first place to enable the
4597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwislearning programmer to use all the commands, classes and methods
4697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisinteractively when using the module from within IDLE run with
4797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisthe -n switch.
4897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
4997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisRoughly it has the following features added:
5097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
5197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Better animation of the turtle movements, especially of turning the
5297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  turtle. So the turtles can more easily be used as a visual feedback
5397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  instrument by the (beginning) programmer.
5497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
5597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Different turtle shapes, gif-images as turtle shapes, user defined
5697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  and user controllable turtle shapes, among them compound
57f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson  (multicolored) shapes. Turtle shapes can be stretched and tilted, which
580fc61ccbba42dcebdf97a981e39d8522b24d60bcMark Dickinson  makes turtles very versatile geometrical objects.
5997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
6097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Fine control over turtle movement and screen updates via delay(),
6197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  and enhanced tracer() and speed() methods.
6297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
6397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Aliases for the most commonly used commands, like fd for forward etc.,
6497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  following the early Logo traditions. This reduces the boring work of
6597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  typing long sequences of commands, which often occur in a natural way
6697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  when kids try to program fancy pictures on their first encounter with
67f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson  turtle graphics.
6897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
6997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Turtles now have an undo()-method with configurable undo-buffer.
7097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
7197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Some simple commands/methods for creating event driven programs
7297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  (mouse-, key-, timer-events). Especially useful for programming games.
7397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
7497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- A scrollable Canvas class. The default scrollable Canvas can be
7597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  extended interactively as needed while playing around with the turtle(s).
7697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
7797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- A TurtleScreen class with methods controlling background color or
7897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  background image, window and canvas size and other properties of the
7997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  TurtleScreen.
8097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
8197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- There is a method, setworldcoordinates(), to install a user defined
8297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  coordinate-system for the TurtleScreen.
8397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
8497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- The implementation uses a 2-vector class named Vec2D, derived from tuple.
8597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  This class is public, so it can be imported by the application programmer,
8697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  which makes certain types of computations very natural and compact.
8797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
8897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- Appearance of the TurtleScreen and the Turtles at startup/import can be
8997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  configured by means of a turtle.cfg configuration file.
9097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  The default configuration mimics the appearance of the old turtle module.
9197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
9297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis- If configured appropriately the module reads in docstrings from a docstring
9397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  dictionary in some different language, supplied separately  and replaces
94f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson  the English ones by those read in. There is a utility function
95f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson  write_docstringdict() to write a dictionary with the original (English)
9697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis  docstrings to disc, so it can serve as a template for translations.
9797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
9897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisBehind the scenes there are some features included with possible
99f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinsonextensions in in mind. These will be commented and documented elsewhere.
10097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
101477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters"""
102477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
103eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl_ver = "turtle 1.1b- - for Python 3.1   -  4. 5. 2009"
10497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
10597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis# print(_ver)
10697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
10797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisimport tkinter as TK
10897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisimport types
10997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisimport math
11097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisimport time
11197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisimport os
11297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
11397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisfrom os.path import isfile, split, join
11497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisfrom copy import deepcopy
115eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandlfrom tkinter import simpledialog
11697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
11797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_tg_classes = ['ScrolledCanvas', 'TurtleScreen', 'Screen',
11897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               'RawTurtle', 'Turtle', 'RawPen', 'Pen', 'Shape', 'Vec2D']
11997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_tg_screen_functions = ['addshape', 'bgcolor', 'bgpic', 'bye',
12097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'clearscreen', 'colormode', 'delay', 'exitonclick', 'getcanvas',
121eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'getshapes', 'listen', 'mainloop', 'mode', 'numinput',
122eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'onkey', 'onkeypress', 'onkeyrelease', 'onscreenclick', 'ontimer',
12397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'register_shape', 'resetscreen', 'screensize', 'setup',
124eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'setworldcoordinates', 'textinput', 'title', 'tracer', 'turtles', 'update',
12597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'window_height', 'window_width']
12697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_tg_turtle_functions = ['back', 'backward', 'begin_fill', 'begin_poly', 'bk',
12797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'circle', 'clear', 'clearstamp', 'clearstamps', 'clone', 'color',
12897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'degrees', 'distance', 'dot', 'down', 'end_fill', 'end_poly', 'fd',
12946afef330f88ddcf4106094e86f54f90dbdec390Georg Brandl        'fillcolor', 'filling', 'forward', 'get_poly', 'getpen', 'getscreen', 'get_shapepoly',
13097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'getturtle', 'goto', 'heading', 'hideturtle', 'home', 'ht', 'isdown',
13197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'isvisible', 'left', 'lt', 'onclick', 'ondrag', 'onrelease', 'pd',
13297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pen', 'pencolor', 'pendown', 'pensize', 'penup', 'pos', 'position',
13397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pu', 'radians', 'right', 'reset', 'resizemode', 'rt',
13497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'seth', 'setheading', 'setpos', 'setposition', 'settiltangle',
135eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'setundobuffer', 'setx', 'sety', 'shape', 'shapesize', 'shapetransform', 'shearfactor', 'showturtle',
136eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'speed', 'st', 'stamp', 'tilt', 'tiltangle', 'towards',
13797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'turtlesize', 'undo', 'undobufferentries', 'up', 'width',
13897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'write', 'xcor', 'ycor']
139eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl_tg_utilities = ['write_docstringdict', 'done']
14097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
14197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis__all__ = (_tg_classes + _tg_screen_functions + _tg_turtle_functions +
14297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           _tg_utilities) # + _math_functions)
14397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
14497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_alias_list = ['addshape', 'backward', 'bk', 'fd', 'ht', 'lt', 'pd', 'pos',
14597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               'pu', 'rt', 'seth', 'setpos', 'setposition', 'st',
14697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               'turtlesize', 'up', 'width']
14797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
14897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_CFG = {"width" : 0.5,               # Screen
14997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "height" : 0.75,
15097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "canvwidth" : 400,
15197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "canvheight": 300,
15297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "leftright": None,
15397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "topbottom": None,
15497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "mode": "standard",          # TurtleScreen
15597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "colormode": 1.0,
15697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "delay": 10,
15797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "undobuffersize": 1000,      # RawTurtle
15897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "shape": "classic",
15997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "pencolor" : "black",
16097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "fillcolor" : "black",
16197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "resizemode" : "noresize",
16297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "visible" : True,
16397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "language": "english",        # docstrings
16497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "exampleturtle": "turtle",
16597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "examplescreen": "screen",
16697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "title": "Python Turtle Graphics",
16797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "using_IDLE": False
16897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       }
16997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
17097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef config_dict(filename):
17197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Convert content of config-file into dictionary."""
17297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f = open(filename, "r")
17397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    cfglines = f.readlines()
17497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.close()
17597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    cfgdict = {}
17697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for line in cfglines:
17797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        line = line.strip()
17897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not line or line.startswith("#"):
17997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            continue
18097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
18197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            key, value = line.split("=")
18297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except:
18397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            print("Bad line in config-file %s:\n%s" % (filename,line))
18497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            continue
18597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        key = key.strip()
18697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        value = value.strip()
18797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if value in ["True", "False", "None", "''", '""']:
18897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            value = eval(value)
18997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
19097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            try:
19197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if "." in value:
19297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    value = float(value)
19397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                else:
19497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    value = int(value)
19597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            except:
19697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pass # value need not be converted
19797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cfgdict[key] = value
19897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return cfgdict
19997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
20097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef readconfig(cfgdict):
20197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Read config-files, change configuration-dict accordingly.
20297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
20397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    If there is a turtle.cfg file in the current working directory,
20497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    read it from there. If this contains an importconfig-value,
20597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    say 'myway', construct filename turtle_mayway.cfg else use
20697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    turtle.cfg and read it from the import-directory, where
20797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    turtle.py is located.
20897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Update configuration dictionary first according to config-file,
20997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    in the import directory, then according to config-file in the
21097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    current working directory.
21197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    If no config-file is found, the default configuration is used.
21297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
21397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    default_cfg = "turtle.cfg"
21497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    cfgdict1 = {}
21597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    cfgdict2 = {}
21697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if isfile(default_cfg):
21797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cfgdict1 = config_dict(default_cfg)
21897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if "importconfig" in cfgdict1:
21997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        default_cfg = "turtle_%s.cfg" % cfgdict1["importconfig"]
22097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    try:
22197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        head, tail = split(__file__)
22297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cfg_file2 = join(head, default_cfg)
22397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    except:
22497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cfg_file2 = ""
22597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if isfile(cfg_file2):
22697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cfgdict2 = config_dict(cfg_file2)
22797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _CFG.update(cfgdict2)
22897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _CFG.update(cfgdict1)
22997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
23097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwistry:
23197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    readconfig(_CFG)
23297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisexcept:
23397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    print ("No configfile read, reason unknown")
23497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
23597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
23697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass Vec2D(tuple):
23797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """A 2 dimensional vector class, used as a helper class
23897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for implementing turtle graphics.
23997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    May be useful for turtle graphics programs also.
24097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Derived from tuple, so a vector is a tuple!
24197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
24297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Provides (for a, b vectors, k number):
24397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       a+b vector addition
24497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       a-b vector subtraction
24597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       a*b inner product
24697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       k*a and a*k multiplication with scalar
24797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       |a| absolute value of a
24897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       a.rotate(angle) rotation
24997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
25097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __new__(cls, x, y):
25197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return tuple.__new__(cls, (x, y))
25297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __add__(self, other):
25397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return Vec2D(self[0]+other[0], self[1]+other[1])
25497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __mul__(self, other):
25597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(other, Vec2D):
25697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self[0]*other[0]+self[1]*other[1]
25797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return Vec2D(self[0]*other, self[1]*other)
25897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __rmul__(self, other):
25997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(other, int) or isinstance(other, float):
26097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return Vec2D(self[0]*other, self[1]*other)
26197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __sub__(self, other):
26297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return Vec2D(self[0]-other[0], self[1]-other[1])
26397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __neg__(self):
26497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return Vec2D(-self[0], -self[1])
26597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __abs__(self):
26697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return (self[0]**2 + self[1]**2)**0.5
26797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def rotate(self, angle):
26897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """rotate self counterclockwise by angle
26997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
27097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        perp = Vec2D(-self[1], self[0])
27197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle = angle * math.pi / 180.0
27297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        c, s = math.cos(angle), math.sin(angle)
27397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return Vec2D(self[0]*c+perp[0]*s, self[1]*c+perp[1]*s)
27497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __getnewargs__(self):
27597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return (self[0], self[1])
27697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __repr__(self):
27797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return "(%.2f,%.2f)" % self
27897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
27997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
28097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##############################################################################
28197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis### From here up to line    : Tkinter - Interface for turtle.py            ###
282f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson### May be replaced by an interface to some different graphics toolkit     ###
28397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##############################################################################
28497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
28597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## helper functions for Scrolled Canvas, to forward Canvas-methods
28697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## to ScrolledCanvas class
28797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
28897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef __methodDict(cls, _dict):
28997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """helper function for Scrolled Canvas"""
29097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    baseList = list(cls.__bases__)
29197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    baseList.reverse()
29297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for _super in baseList:
29397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        __methodDict(_super, _dict)
29497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for key, value in cls.__dict__.items():
29597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if type(value) == types.FunctionType:
29697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            _dict[key] = value
29797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
29897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef __methods(cls):
29997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """helper function for Scrolled Canvas"""
30097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _dict = {}
30197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    __methodDict(cls, _dict)
30297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return _dict.keys()
30397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
30497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis__stringBody = (
30597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    'def %(method)s(self, *args, **kw): return ' +
30697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    'self.%(attribute)s.%(method)s(*args, **kw)')
30797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
30897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef __forwardmethods(fromClass, toClass, toPart, exclude = ()):
30997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ### MANY CHANGES ###
31097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _dict_1 = {}
31197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    __methodDict(toClass, _dict_1)
31297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _dict = {}
31397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    mfc = __methods(fromClass)
31497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for ex in _dict_1.keys():
31597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if ex[:1] == '_' or ex[-1:] == '_' or ex in exclude or ex in mfc:
31697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pass
31797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
31897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            _dict[ex] = _dict_1[ex]
31997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
32097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for method, func in _dict.items():
32197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        d = {'method': method, 'func': func}
32297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(toPart, str):
32397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            execString = \
32497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                __stringBody % {'method' : method, 'attribute' : toPart}
32597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        exec(execString, d)
32697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        setattr(fromClass, method, d[method])   ### NEWU!
32797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
32897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
32997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass ScrolledCanvas(TK.Frame):
33097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Modeled after the scrolled canvas class from Grayons's Tkinter book.
33197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
33297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Used as the default canvas, which pops up automatically when
33397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    using turtle graphics functions or the Turtle class.
33497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
33597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, master, width=500, height=350,
33697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                          canvwidth=600, canvheight=500):
33797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TK.Frame.__init__(self, master, width=width, height=height)
33822d297be51567eb193e792a0da52b93e9a45b9a4Martin v. Löwis        self._rootwindow = self.winfo_toplevel()
33997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.width, self.height = width, height
34097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.canvwidth, self.canvheight = canvwidth, canvheight
34197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.bg = "white"
34297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas = TK.Canvas(master, width=width, height=height,
34397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                 bg=self.bg, relief=TK.SUNKEN, borderwidth=2)
34497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.hscroll = TK.Scrollbar(master, command=self._canvas.xview,
34597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                    orient=TK.HORIZONTAL)
34697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.vscroll = TK.Scrollbar(master, command=self._canvas.yview)
34797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.configure(xscrollcommand=self.hscroll.set,
34897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                               yscrollcommand=self.vscroll.set)
34997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.rowconfigure(0, weight=1, minsize=0)
35097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.columnconfigure(0, weight=1, minsize=0)
35197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.grid(padx=1, in_ = self, pady=1, row=0,
35297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                column=0, rowspan=1, columnspan=1, sticky='news')
35397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.vscroll.grid(padx=1, in_ = self, pady=1, row=0,
35497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                column=1, rowspan=1, columnspan=1, sticky='news')
35597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.hscroll.grid(padx=1, in_ = self, pady=1, row=1,
35697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                column=0, rowspan=1, columnspan=1, sticky='news')
35797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.reset()
35822d297be51567eb193e792a0da52b93e9a45b9a4Martin v. Löwis        self._rootwindow.bind('<Configure>', self.onResize)
35997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
36097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def reset(self, canvwidth=None, canvheight=None, bg = None):
361f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Adjust canvas and scrollbars according to given canvas size."""
36297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if canvwidth:
36397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.canvwidth = canvwidth
36497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if canvheight:
36597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.canvheight = canvheight
36697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if bg:
36797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.bg = bg
36897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.config(bg=bg,
36997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        scrollregion=(-self.canvwidth//2, -self.canvheight//2,
37097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                       self.canvwidth//2, self.canvheight//2))
37197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.xview_moveto(0.5*(self.canvwidth - self.width + 30) /
37297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                               self.canvwidth)
37397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.yview_moveto(0.5*(self.canvheight- self.height + 30) /
37497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                              self.canvheight)
37597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.adjustScrolls()
37697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
37797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
37897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def adjustScrolls(self):
37997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Adjust scrollbars according to window- and canvas-size.
38097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
38197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cwidth = self._canvas.winfo_width()
38297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cheight = self._canvas.winfo_height()
38397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth)
38497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight)
38597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if cwidth < self.canvwidth or cheight < self.canvheight:
38697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.hscroll.grid(padx=1, in_ = self, pady=1, row=1,
38797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              column=0, rowspan=1, columnspan=1, sticky='news')
38897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.vscroll.grid(padx=1, in_ = self, pady=1, row=0,
38997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              column=1, rowspan=1, columnspan=1, sticky='news')
39097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
39197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.hscroll.grid_forget()
39297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.vscroll.grid_forget()
39397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
39497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onResize(self, event):
39597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """self-explanatory"""
39697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.adjustScrolls()
39797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
39897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def bbox(self, *args):
39997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ 'forward' method, which canvas itself has inherited...
40097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
40197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._canvas.bbox(*args)
40297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
40397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def cget(self, *args, **kwargs):
40497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ 'forward' method, which canvas itself has inherited...
40597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
40697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._canvas.cget(*args, **kwargs)
40797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
40897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def config(self, *args, **kwargs):
40997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ 'forward' method, which canvas itself has inherited...
41097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
41197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.config(*args, **kwargs)
41297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
41397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def bind(self, *args, **kwargs):
41497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ 'forward' method, which canvas itself has inherited...
41597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
41697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.bind(*args, **kwargs)
41797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
41897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def unbind(self, *args, **kwargs):
41997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ 'forward' method, which canvas itself has inherited...
42097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
42197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.unbind(*args, **kwargs)
42297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
42397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def focus_force(self):
42497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ 'forward' method, which canvas itself has inherited...
42597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
42697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.focus_force()
42797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
42897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis__forwardmethods(ScrolledCanvas, TK.Canvas, '_canvas')
42997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
43097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
43197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass _Root(TK.Tk):
43297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Root class for Screen based on Tkinter."""
43397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self):
43497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TK.Tk.__init__(self)
43597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
43697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setupcanvas(self, width, height, cwidth, cheight):
43797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas = ScrolledCanvas(self, width, height, cwidth, cheight)
43897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._canvas.pack(expand=1, fill="both")
43997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
44097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _getcanvas(self):
44197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._canvas
442fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
44397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def set_geometry(self, width, height, startx, starty):
44497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.geometry("%dx%d%+d%+d"%(width, height, startx, starty))
445477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
44697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def ondestroy(self, destroy):
44797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.wm_protocol("WM_DELETE_WINDOW", destroy)
44897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
44997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def win_width(self):
45097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.winfo_screenwidth()
45197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
45297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def win_height(self):
45397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.winfo_screenheight()
45497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
45597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisCanvas = TK.Canvas
45697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
45797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
45897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass TurtleScreenBase(object):
45997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Provide the basic graphics functionality.
46097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       Interface between Tkinter and turtle.py.
46197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
46297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       To port turtle.py to some different graphics toolkit
46397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis       a corresponding TurtleScreenBase class has to be implemented.
46497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
46597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
46697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    @staticmethod
46797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _blankimage():
46897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """return a blank image object
46997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
47097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        img = TK.PhotoImage(width=1, height=1)
47197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        img.blank()
47297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return img
47397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
47497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    @staticmethod
47597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _image(filename):
47697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """return an image object containing the
47797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        imagedata from a gif-file named filename.
47897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
47997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return TK.PhotoImage(file=filename)
48097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
48197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, cv):
48297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv = cv
48397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(cv, ScrolledCanvas):
48497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            w = self.cv.canvwidth
48597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            h = self.cv.canvheight
48697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:  # expected: ordinary TK.Canvas
48797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            w = int(self.cv.cget("width"))
48897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            h = int(self.cv.cget("height"))
48997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.config(scrollregion = (-w//2, -h//2, w//2, h//2 ))
49097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.canvwidth = w
49197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.canvheight = h
49297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.xscale = self.yscale = 1.0
49397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
49497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _createpoly(self):
49597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Create an invisible polygon item on canvas self.cv)
49697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
49797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.cv.create_polygon((0, 0, 0, 0, 0, 0), fill="", outline="")
49897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
49997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _drawpoly(self, polyitem, coordlist, fill=None,
50097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  outline=None, width=None, top=False):
50197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Configure polygonitem polyitem according to provided
50297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        arguments:
50397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        coordlist is sequence of coordinates
50497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fill is filling color
50597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        outline is outline color
50697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        top is a boolean value, which specifies if polyitem
50797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        will be put on top of the canvas' displaylist so it
50897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        will not be covered by other items.
50997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
51097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cl = []
51197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for x, y in coordlist:
51297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            cl.append(x * self.xscale)
51397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            cl.append(-y * self.yscale)
51497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.coords(polyitem, *cl)
51597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fill is not None:
51697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.itemconfigure(polyitem, fill=fill)
51797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if outline is not None:
51897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.itemconfigure(polyitem, outline=outline)
51997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if width is not None:
52097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.itemconfigure(polyitem, width=width)
52197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if top:
52297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_raise(polyitem)
52397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
52497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _createline(self):
52597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Create an invisible line item on canvas self.cv)
52697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
52797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.cv.create_line(0, 0, 0, 0, fill="", width=2,
52897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                   capstyle = TK.ROUND)
52997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
53097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _drawline(self, lineitem, coordlist=None,
53197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  fill=None, width=None, top=False):
53297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Configure lineitem according to provided arguments:
53397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        coordlist is sequence of coordinates
53497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fill is drawing color
53597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width is width of drawn line.
53697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        top is a boolean value, which specifies if polyitem
53797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        will be put on top of the canvas' displaylist so it
53897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        will not be covered by other items.
53997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
54097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if coordlist is not None:
54197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            cl = []
54297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for x, y in coordlist:
54397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                cl.append(x * self.xscale)
54497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                cl.append(-y * self.yscale)
54597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.coords(lineitem, *cl)
54697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fill is not None:
54797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.itemconfigure(lineitem, fill=fill)
54897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if width is not None:
54997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.itemconfigure(lineitem, width=width)
55097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if top:
55197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_raise(lineitem)
55297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
55397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _delete(self, item):
55497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete graphics item from canvas.
55597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If item is"all" delete all graphics items.
55697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
55797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.delete(item)
55897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
55997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update(self):
56097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Redraw graphics items on canvas
56197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
56297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.update()
56397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
56497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _delay(self, delay):
56597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delay subsequent canvas actions for delay ms."""
56697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.after(delay)
56797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
56897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _iscolorstring(self, color):
56997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Check if the string color is a legal Tkinter color string.
57097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
57197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
57297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            rgb = self.cv.winfo_rgb(color)
57397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            ok = True
57497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except TK.TclError:
57597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            ok = False
57697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return ok
57797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
57897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _bgcolor(self, color=None):
57997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set canvas' backgroundcolor if color is not None,
58097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else return backgroundcolor."""
58197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if color is not None:
58297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.config(bg = color)
58397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update()
58497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
58597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self.cv.cget("bg")
58697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
58797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _write(self, pos, txt, align, font, pencolor):
58897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Write txt at pos in canvas with specified font
58997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and color.
59097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return text item and x-coord of right bottom corner
59197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of text's bounding box."""
59297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x, y = pos
59397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x = x * self.xscale
59497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y = y * self.yscale
59597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        anchor = {"left":"sw", "center":"s", "right":"se" }
59697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item = self.cv.create_text(x-1, -y, text = txt, anchor = anchor[align],
59797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                        fill = pencolor, font = font)
59897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x0, y0, x1, y1 = self.cv.bbox(item)
59997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.update()
60097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return item, x1-1
60197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
60297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##    def _dot(self, pos, size, color):
60397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##        """may be implemented for some other graphics toolkit"""
60497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
60597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _onclick(self, item, fun, num=1, add=None):
60697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-click event on turtle.
60797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun must be a function with two arguments, the coordinates
60897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the clicked point on the canvas.
60997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num, the number of the mouse-button defaults to 1
61097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
61197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fun is None:
61297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_unbind(item, "<Button-%s>" % num)
61397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
61497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            def eventfun(event):
61597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                x, y = (self.cv.canvasx(event.x)/self.xscale,
61697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        -self.cv.canvasy(event.y)/self.yscale)
61797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fun(x, y)
61897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_bind(item, "<Button-%s>" % num, eventfun, add)
61997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
62097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _onrelease(self, item, fun, num=1, add=None):
62197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-button-release event on turtle.
62297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun must be a function with two arguments, the coordinates
62397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the point on the canvas where mouse button is released.
62497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num, the number of the mouse-button defaults to 1
62597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
62697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If a turtle is clicked, first _onclick-event will be performed,
62797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        then _onscreensclick-event.
62897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
62997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fun is None:
63097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_unbind(item, "<Button%s-ButtonRelease>" % num)
63197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
63297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            def eventfun(event):
63397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                x, y = (self.cv.canvasx(event.x)/self.xscale,
63497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        -self.cv.canvasy(event.y)/self.yscale)
63597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fun(x, y)
63697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_bind(item, "<Button%s-ButtonRelease>" % num,
63797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                             eventfun, add)
63897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
63997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _ondrag(self, item, fun, num=1, add=None):
64097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-move-event (with pressed mouse button) on turtle.
64197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun must be a function with two arguments, the coordinates of the
64297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        actual mouse position on the canvas.
64397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num, the number of the mouse-button defaults to 1
64497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
64597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Every sequence of mouse-move-events on a turtle is preceded by a
64697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mouse-click event on that turtle.
64797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
64897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fun is None:
64997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_unbind(item, "<Button%s-Motion>" % num)
65097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
65197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            def eventfun(event):
65297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                try:
65397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    x, y = (self.cv.canvasx(event.x)/self.xscale,
65497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           -self.cv.canvasy(event.y)/self.yscale)
65597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    fun(x, y)
65697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                except:
65797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    pass
65897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.tag_bind(item, "<Button%s-Motion>" % num, eventfun, add)
65997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
66097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _onscreenclick(self, fun, num=1, add=None):
66197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-click event on canvas.
66297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun must be a function with two arguments, the coordinates
66397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the clicked point on the canvas.
66497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num, the number of the mouse-button defaults to 1
66597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
66697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If a turtle is clicked, first _onclick-event will be performed,
66797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        then _onscreensclick-event.
66897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
66997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fun is None:
67097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.unbind("<Button-%s>" % num)
67197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
67297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            def eventfun(event):
67397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                x, y = (self.cv.canvasx(event.x)/self.xscale,
67497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        -self.cv.canvasy(event.y)/self.yscale)
67597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fun(x, y)
67697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.bind("<Button-%s>" % num, eventfun, add)
67797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
678eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def _onkeyrelease(self, fun, key):
67997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to key-release event of key.
68097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Canvas must have focus. See method listen
68197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
68297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fun is None:
68397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.unbind("<KeyRelease-%s>" % key, None)
68497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
68597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            def eventfun(event):
68697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fun()
68797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.bind("<KeyRelease-%s>" % key, eventfun)
68897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
689eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def _onkeypress(self, fun, key=None):
690eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """If key is given, bind fun to key-press event of key.
691eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Otherwise bind fun to any key-press.
692eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Canvas must have focus. See method listen.
693eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
694eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if fun is None:
695eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            if key is None:
696eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                self.cv.unbind("<KeyPress>", None)
697eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            else:
698eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                self.cv.unbind("<KeyPress-%s>" % key, None)
699eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        else:
700eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            def eventfun(event):
701eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                fun()
702eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            if key is None:
703eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                self.cv.bind("<KeyPress>", eventfun)
704eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            else:
705eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                self.cv.bind("<KeyPress-%s>" % key, eventfun)
706eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
70797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _listen(self):
70897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set focus on canvas (in order to collect key-events)
70997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
71097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.focus_force()
71197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
71297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _ontimer(self, fun, t):
71397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Install a timer, which calls fun after t milliseconds.
71497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
71597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if t == 0:
71697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.after_idle(fun)
71797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
71897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.after(t, fun)
71997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
72097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _createimage(self, image):
72197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Create and return image item on canvas.
72297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
72397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.cv.create_image(0, 0, image=image)
72497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
72597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _drawimage(self, item, pos, image):
72697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Configure image item as to draw image object
72797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        at position (x,y) on canvas)
72897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
72997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x, y = pos
73097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.coords(item, (x * self.xscale, -y * self.yscale))
73197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.itemconfig(item, image=image)
73297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
73397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _setbgpic(self, item, image):
73497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Configure image item as to draw image object
73597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        at center of canvas. Set item to the first item
73697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        in the displaylist, so it will be drawn below
73797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        any other item ."""
73897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.itemconfig(item, image=image)
73997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.tag_lower(item)
74097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
74197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _type(self, item):
74297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return 'line' or 'polygon' or 'image' depending on
74397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        type of item.
74497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
74597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.cv.type(item)
74697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
74797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _pointlist(self, item):
74897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """returns list of coordinate-pairs of points of item
74997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for insiders):
75097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> from turtle import *
75197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> getscreen()._pointlist(getturtle().turtle._item)
75297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        [(0.0, 9.9999999999999982), (0.0, -9.9999999999999982),
75397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (9.9999999999999982, 0.0)]
75497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> """
75597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cl = list(self.cv.coords(item))
75697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pl = [(cl[i], -cl[i+1]) for i in range(0, len(cl), 2)]
75797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return  pl
75897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
75997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _setscrollregion(self, srx1, sry1, srx2, sry2):
76097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.config(scrollregion=(srx1, sry1, srx2, sry2))
76197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
76297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _rescale(self, xscalefactor, yscalefactor):
76397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items = self.cv.find_all()
76497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for item in items:
76597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            coordinates = list(self.cv.coords(item))
76697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            newcoordlist = []
76797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            while coordinates:
76897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                x, y = coordinates[:2]
76997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newcoordlist.append(x * xscalefactor)
77097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newcoordlist.append(y * yscalefactor)
77197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                coordinates = coordinates[2:]
77297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.cv.coords(item, *newcoordlist)
77397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
77497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _resize(self, canvwidth=None, canvheight=None, bg=None):
775f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Resize the canvas the turtles are drawing on. Does
77697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        not alter the drawing window.
77797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
77897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # needs amendment
77997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not isinstance(self.cv, ScrolledCanvas):
78097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self.canvwidth, self.canvheight
78197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if canvwidth is None and canvheight is None and bg is None:
78297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self.cv.canvwidth, self.cv.canvheight
78397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if canvwidth is not None:
78497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.canvwidth = canvwidth
78597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if canvheight is not None:
78697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.canvheight = canvheight
78797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cv.reset(canvwidth, canvheight, bg)
78897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
78997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _window_size(self):
79097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the width and height of the turtle window.
79197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
79297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width = self.cv.winfo_width()
79397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if width <= 1:  # the window isn't managed by a geometry manager
79497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            width = self.cv['width']
79597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        height = self.cv.winfo_height()
79697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if height <= 1: # the window isn't managed by a geometry manager
79797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            height = self.cv['height']
79897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return width, height
79997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
800eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def mainloop(self):
801eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Starts event loop - calling Tkinter's mainloop function.
802eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
803eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        No argument.
804eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
805eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Must be last statement in a turtle graphics program.
806eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Must NOT be used if a script is run from within IDLE in -n mode
807eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        (No subprocess) - for interactive use of turtle graphics.
808eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
809eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Example (for a TurtleScreen instance named screen):
810eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> screen.mainloop()
811eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
812eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
813eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        TK.mainloop()
814eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
815eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def textinput(self, title, prompt):
816eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Pop up a dialog window for input of a string.
817eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
818eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Arguments: title is the title of the dialog window,
819eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        prompt is a text mostly describing what information to input.
820eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
821eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Return the string input
822eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If the dialog is canceled, return None.
823eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
824eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Example (for a TurtleScreen instance named screen):
825eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> screen.textinput("NIM", "Name of first player:")
826eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
827eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
828eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        return simpledialog.askstring(title, prompt)
829eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
830eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def numinput(self, title, prompt, default=None, minval=None, maxval=None):
831eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Pop up a dialog window for input of a number.
832eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
833eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Arguments: title is the title of the dialog window,
834eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        prompt is a text mostly describing what numerical information to input.
835eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        default: default value
836eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        minval: minimum value for imput
837eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        maxval: maximum value for input
838eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
839eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        The number input must be in the range minval .. maxval if these are
840eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        given. If not, a hint is issued and the dialog remains open for
841eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        correction. Return the number input.
842eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If the dialog is canceled,  return None.
843eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
844eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Example (for a TurtleScreen instance named screen):
845eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> screen.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)
846eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
847eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
848eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        return simpledialog.askfloat(title, prompt, initialvalue=default,
849eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                     minvalue=minval, maxvalue=maxval)
850eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
85197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
85297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##############################################################################
85397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis###                  End of Tkinter - interface                            ###
85497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##############################################################################
85597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
85697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
85797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass Terminator (Exception):
85897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Will be raised in TurtleScreen.update, if _RUNNING becomes False.
85997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
86097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Thus stops execution of turtle graphics script. Main purpose: use in
86197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    in the Demo-Viewer turtle.Demo.py.
86297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
8634b6ea798cbb6ef6058d97794c652e4acfd2ac165Martin v. Löwis    pass
864b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
865b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
86697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass TurtleGraphicsError(Exception):
86797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Some TurtleGraphics Error
86897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
86997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
87097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
87197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass Shape(object):
87297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Data structure modeling shapes.
87397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
87497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    attribute _type is one of "polygon", "image", "compound"
87597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    attribute _data is - depending on _type a poygon-tuple,
87697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    an image or a list constructed using the addcomponent method.
87797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
87897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, type_, data=None):
87997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._type = type_
88097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if type_ == "polygon":
88197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(data, list):
88297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                data = tuple(data)
88397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif type_ == "image":
88497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(data, str):
88597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if data.lower().endswith(".gif") and isfile(data):
88697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    data = TurtleScreen._image(data)
88797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                # else data assumed to be Photoimage
88897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif type_ == "compound":
88997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            data = []
89097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
89197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("There is no shape type %s" % type_)
89297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._data = data
89397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
89497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def addcomponent(self, poly, fill, outline=None):
89597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Add component to a shape of type compound.
89697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
89797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments: poly is a polygon, i. e. a tuple of number pairs.
89897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fill is the fillcolor of the component,
89997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        outline is the outline color of the component.
90097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
90197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call (for a Shapeobject namend s):
90297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --   s.addcomponent(((0,0), (10,10), (-10,10)), "red", "blue")
90397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
90497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example:
90597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> poly = ((0,0),(10,-5),(0,10),(-10,-5))
90697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> s = Shape("compound")
90797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> s.addcomponent(poly, "red", "blue")
90897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### .. add more components and then use register_shape()
90997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
91097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type != "compound":
91197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("Cannot add component to %s Shape"
91297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                                % self._type)
91397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if outline is None:
91497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            outline = fill
91597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._data.append([poly, fill, outline])
91697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
91797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
91897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass Tbuffer(object):
91997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Ring buffer used as undobuffer for RawTurtle objects."""
92097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, bufsize=10):
92197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.bufsize = bufsize
92297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.buffer = [[None]] * bufsize
92397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.ptr = -1
92497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.cumulate = False
92597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def reset(self, bufsize=None):
92697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if bufsize is None:
92797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for i in range(self.bufsize):
92897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.buffer[i] = [None]
92997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
93097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.bufsize = bufsize
93197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.buffer = [[None]] * bufsize
93297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.ptr = -1
93397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def push(self, item):
93497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.bufsize > 0:
93597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if not self.cumulate:
93697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.ptr = (self.ptr + 1) % self.bufsize
93797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.buffer[self.ptr] = item
93897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
93997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.buffer[self.ptr].append(item)
94097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pop(self):
94197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.bufsize > 0:
94297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = self.buffer[self.ptr]
94397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if item is None:
94497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return None
94597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
94697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.buffer[self.ptr] = [None]
94797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.ptr = (self.ptr - 1) % self.bufsize
94897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return (item)
94997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def nr_of_items(self):
95097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.bufsize - self.buffer.count([None])
95197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __repr__(self):
95297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return str(self.buffer) + " " + str(self.ptr)
95397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
95497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
95597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
95697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass TurtleScreen(TurtleScreenBase):
95797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Provides screen oriented methods like setbg etc.
95897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
95997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Only relies upon the methods of TurtleScreenBase and NOT
96097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    upon components of the underlying graphics toolkit -
96197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    which is Tkinter in this case.
96297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
96397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _RUNNING = True
96497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
96597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, cv, mode=_CFG["mode"],
96697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 colormode=_CFG["colormode"], delay=_CFG["delay"]):
96797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._shapes = {
96897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   "arrow" : Shape("polygon", ((-10,0), (10,0), (0,10))),
96997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  "turtle" : Shape("polygon", ((0,16), (-2,14), (-1,10), (-4,7),
97097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-7,9), (-9,8), (-6,5), (-7,1), (-5,-3), (-8,-6),
97197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-6,-8), (-4,-5), (0,-7), (4,-5), (6,-8), (8,-6),
97297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (5,-3), (7,1), (6,5), (9,8), (7,9), (4,7), (1,10),
97397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (2,14))),
97497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  "circle" : Shape("polygon", ((10,0), (9.51,3.09), (8.09,5.88),
97597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (5.88,8.09), (3.09,9.51), (0,10), (-3.09,9.51),
97697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-5.88,8.09), (-8.09,5.88), (-9.51,3.09), (-10,0),
97797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-9.51,-3.09), (-8.09,-5.88), (-5.88,-8.09),
97897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-3.09,-9.51), (-0.00,-10.00), (3.09,-9.51),
97997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (5.88,-8.09), (8.09,-5.88), (9.51,-3.09))),
98097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  "square" : Shape("polygon", ((10,-10), (10,10), (-10,10),
98197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-10,-10))),
98297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "triangle" : Shape("polygon", ((10,-5.77), (0,11.55),
98397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              (-10,-5.77))),
98497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  "classic": Shape("polygon", ((0,0),(-5,-9),(0,-7),(5,-9))),
98597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   "blank" : Shape("image", self._blankimage())
98697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                  }
98797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
98897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._bgpics = {"nopic" : ""}
98997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
99097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TurtleScreenBase.__init__(self, cv)
99197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._mode = mode
99297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._delayvalue = delay
99397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._colormode = _CFG["colormode"]
99497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._keys = []
99597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.clear()
99697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
99797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clear(self):
99897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete all drawings and all turtles from the TurtleScreen.
99997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
1000eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        No argument.
1001eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1002f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        Reset empty TurtleScreen to its initial state: white background,
100397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        no backgroundimage, no eventbindings and tracing on.
100497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
100597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
100697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen.clear()
100797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
100897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Note: this method is not available as function.
100997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
101097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._delayvalue = _CFG["delay"]
101197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._colormode = _CFG["colormode"]
101297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._delete("all")
101397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._bgpic = self._createimage("")
101497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._bgpicname = "nopic"
1015b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        self._tracing = 1
101697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._updatecounter = 0
101797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._turtles = []
101897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.bgcolor("white")
101997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for btn in 1, 2, 3:
102097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.onclick(None, btn)
1021eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self.onkeypress(None)
102297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for key in self._keys[:]:
102397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.onkey(None, key)
1024eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self.onkeypress(None, key)
102597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turtle._pen = None
102697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
102797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def mode(self, mode=None):
102897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set turtle-mode ('standard', 'logo' or 'world') and perform reset.
102997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
103097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
103197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mode -- on of the strings 'standard', 'logo' or 'world'
103297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
103397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Mode 'standard' is compatible with turtle.py.
103497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Mode 'logo' is compatible with most Logo-Turtle-Graphics.
103597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Mode 'world' uses userdefined 'worldcoordinates'. *Attention*: in
103697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        this mode angles appear distorted if x/y unit-ratio doesn't equal 1.
103797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If mode is not given, return the current mode.
103897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
103997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis             Mode      Initial turtle heading     positive angles
104097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         ------------|-------------------------|-------------------
104197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          'standard'    to the right (east)       counterclockwise
104297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'logo'        upward    (north)         clockwise
104397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
104497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples:
104597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> mode('logo')   # resets turtle heading to north
104697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> mode()
104797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'logo'
104897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
104997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if mode == None:
105097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._mode
105197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mode = mode.lower()
105297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if mode not in ["standard", "logo", "world"]:
105397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("No turtle-graphics-mode %s" % mode)
105497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._mode = mode
105597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if mode in ["standard", "logo"]:
105697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._setscrollregion(-self.canvwidth//2, -self.canvheight//2,
105797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                       self.canvwidth//2, self.canvheight//2)
105897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.xscale = self.yscale = 1.0
1059b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        self.reset()
1060b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
106197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setworldcoordinates(self, llx, lly, urx, ury):
106297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set up a user defined coordinate-system.
106397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
106497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
106597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        llx -- a number, x-coordinate of lower left corner of canvas
106697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lly -- a number, y-coordinate of lower left corner of canvas
106797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        urx -- a number, x-coordinate of upper right corner of canvas
106897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ury -- a number, y-coordinate of upper right corner of canvas
106997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
107097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set up user coodinat-system and switch to mode 'world' if necessary.
107197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This performs a screen.reset. If mode 'world' is already active,
107297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        all drawings are redrawn according to the new coordinates.
107397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
107497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        But ATTENTION: in user-defined coordinatesystems angles may appear
107597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        distorted. (see Screen.mode())
107697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
107797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
107897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.setworldcoordinates(-10,-0.5,50,1.5)
107997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for _ in range(36):
108097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                left(10)
108197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                forward(0.5)
108297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
108397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.mode() != "world":
108497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.mode("world")
108597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        xspan = float(urx - llx)
108697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        yspan = float(ury - lly)
108797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        wx, wy = self._window_size()
108897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screensize(wx-20, wy-20)
108997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        oldxscale, oldyscale = self.xscale, self.yscale
109097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.xscale = self.canvwidth / xspan
109197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.yscale = self.canvheight / yspan
109297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        srx1 = llx * self.xscale
109397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sry1 = -ury * self.yscale
109497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        srx2 = self.canvwidth + srx1
109597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sry2 = self.canvheight + sry1
109697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setscrollregion(srx1, sry1, srx2, sry2)
109797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rescale(self.xscale/oldxscale, self.yscale/oldyscale)
109897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.update()
109997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
110097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def register_shape(self, name, shape=None):
110197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Adds a turtle shape to TurtleScreen's shapelist.
110297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
110397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
110497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (1) name is the name of a gif-file and shape is None.
110597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Installs the corresponding image shape.
110697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            !! Image-shapes DO NOT rotate when turning the turtle,
110797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            !! so they do not display the heading of the turtle!
110897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (2) name is an arbitrary string and shape is a tuple
110997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            of pairs of coordinates. Installs the corresponding
111097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            polygon shape
111197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (3) name is an arbitrary string and shape is a
111297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            (compound) Shape object. Installs the corresponding
111397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            compound shape.
111497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        To use a shape, you have to issue the command shape(shapename).
111597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
111697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: register_shape("turtle.gif")
111797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: register_shape("tri", ((0,0), (10,10), (-10,10)))
111897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
111997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
112097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.register_shape("triangle", ((5,-3),(0,5),(-5,-3)))
112197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
112297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
112397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if shape is None:
112497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            # image
112597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if name.lower().endswith(".gif"):
112697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                shape = Shape("image", self._image(name))
112797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
112897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                raise TurtleGraphicsError("Bad arguments for register_shape.\n"
112997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                          + "Use  help(register_shape)" )
113097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(shape, tuple):
113197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            shape = Shape("polygon", shape)
113297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ## else shape assumed to be Shape-instance
113397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._shapes[name] = shape
113497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
113597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _colorstr(self, color):
113697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return color string corresponding to args.
113797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
113897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument may be a string or a tuple of three
113997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        numbers corresponding to actual colormode,
114097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        i.e. in the range 0<=n<=colormode.
114197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
114297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If the argument doesn't represent a color,
114397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        an error is raised.
114497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
114597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(color) == 1:
114697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = color[0]
114797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(color, str):
114897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._iscolorstring(color) or color == "":
114997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return color
115097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
115197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                raise TurtleGraphicsError("bad color string: %s" % str(color))
115297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
115397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, b = color
115497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except:
115597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad color arguments: %s" % str(color))
115697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._colormode == 1.0:
115797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, b = [round(255.0*x) for x in (r, g, b)]
115897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not ((0 <= r <= 255) and (0 <= g <= 255) and (0 <= b <= 255)):
115997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad color sequence: %s" % str(color))
116097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return "#%02x%02x%02x" % (r, g, b)
116197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
116297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _color(self, cstr):
116397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not cstr.startswith("#"):
116497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return cstr
116597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(cstr) == 7:
116697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            cl = [int(cstr[i:i+2], 16) for i in (1, 3, 5)]
116797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif len(cstr) == 4:
116897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            cl = [16*int(cstr[h], 16) for h in cstr[1:]]
116997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
117097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad colorstring: %s" % cstr)
117197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return tuple([c * self._colormode/255 for c in cl])
117297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
117397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def colormode(self, cmode=None):
117497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the colormode or set it to 1.0 or 255.
117597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
117697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
117797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cmode -- one of the values 1.0 or 255
117897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
117997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        r, g, b values of colortriples have to be in range 0..cmode.
118097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
118197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
118297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.colormode()
118397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        1.0
118497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.colormode(255)
118597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor(240,160,80)
118697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
118797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if cmode is None:
118897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._colormode
118997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if cmode == 1.0:
119097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._colormode = float(cmode)
119197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif cmode == 255:
119297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._colormode = int(cmode)
119397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
119497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def reset(self):
119597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Reset all Turtles on the Screen to their initial state.
119697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
119797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
119897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
119997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
120097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.reset()
120197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
120297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for turtle in self._turtles:
120397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle._setmode(self._mode)
120497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.reset()
120597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
120697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def turtles(self):
120797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the list of turtles on the screen.
120897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
120997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
121097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.turtles()
121197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        [<turtle.Turtle object at 0x00E11FB0>]
121297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
121397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._turtles
121497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
121597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def bgcolor(self, *args):
121697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set or return backgroundcolor of the TurtleScreen.
121797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
121897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments (if given): a color string or three numbers
121997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        in the range 0..colormode or a 3-tuple of such numbers.
122097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
122197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
122297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgcolor("orange")
122397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgcolor()
122497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'orange'
122597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgcolor(0.5,0,0.5)
122697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgcolor()
122797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        '#800080'
122897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
122997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
123097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(args)
123197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
123297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = None
123397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color = self._bgcolor(color)
123497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if color is not None:
123597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._color(color)
123697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return color
123797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
123897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def tracer(self, n=None, delay=None):
123997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turns turtle animation on/off and set delay for update drawings.
124097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
124197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional arguments:
124297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        n -- nonnegative  integer
124397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        delay -- nonnegative  integer
124497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
124597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If n is given, only each n-th regular screen update is really performed.
124697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (Can be used to accelerate the drawing of complex graphics.)
124797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Second arguments sets delay value (see RawTurtle.delay())
124897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
124997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
125097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.tracer(8, 25)
125197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> dist = 2
125297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(200):
125397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fd(dist)
125497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                rt(90)
125597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                dist += 2
125697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
125797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if n is None:
125897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._tracing
125997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._tracing = int(n)
126097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._updatecounter = 0
126197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if delay is not None:
126297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._delayvalue = int(delay)
126397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._tracing:
126497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.update()
126597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
126697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def delay(self, delay=None):
126797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the drawing delay in milliseconds.
126897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
126997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
127097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        delay -- positive integer
127197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
127297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
127397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.delay(15)
127497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.delay()
127597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        15
127697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
127797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if delay is None:
127897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._delayvalue
127997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._delayvalue = int(delay)
128097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
128197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _incrementudc(self):
128297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "Increment upadate counter."""
128397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not TurtleScreen._RUNNING:
128497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            TurtleScreen._RUNNNING = True
128597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise Terminator
128697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._tracing > 0:
128797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._updatecounter += 1
128897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._updatecounter %= self._tracing
128997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
129097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def update(self):
129197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Perform a TurtleScreen update.
129297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
1293eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        tracing = self._tracing
1294eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._tracing = True
129597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for t in self.turtles():
129697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            t._update_data()
129797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            t._drawturtle()
1298eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._tracing = tracing
129997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
130097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
130197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def window_width(self):
130297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the width of the turtle window.
130397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
130497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
130597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.window_width()
130697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        640
130797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
130897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._window_size()[0]
130997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
131097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def window_height(self):
131197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the height of the turtle window.
131297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
131397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
131497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.window_height()
131597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        480
131697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
131797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._window_size()[1]
131897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
131997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def getcanvas(self):
132097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the Canvas of this TurtleScreen.
132197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
132297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
132397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
132497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Screen instance named screen):
132597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> cv = screen.getcanvas()
132697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> cv
132797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        <turtle.ScrolledCanvas instance at 0x010742D8>
132897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
132997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.cv
133097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
133197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def getshapes(self):
133297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return a list of names of all currently available turtle shapes.
133397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
133497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
133597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
133697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
133797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.getshapes()
133897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ['arrow', 'blank', 'circle', ... , 'turtle']
133997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
134097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return sorted(self._shapes.keys())
134197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
134297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onclick(self, fun, btn=1, add=None):
134397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-click event on canvas.
134497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
134597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
134697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with two arguments, the coordinates of the
134797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               clicked point on the canvas.
134897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num -- the number of the mouse-button, defaults to 1
134997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
135097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen
135197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and a Turtle instance named turtle):
135297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
135397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.onclick(turtle.goto)
135497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
135597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### Subsequently clicking into the TurtleScreen will
135697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### make the turtle move to the clicked point.
135797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.onclick(None)
135897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
135997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### event-binding will be removed
136097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
136197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._onscreenclick(fun, btn, add)
136297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
136397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onkey(self, fun, key):
136497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to key-release event of key.
136597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
136697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
136797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with no arguments
136897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        key -- a string: key (e.g. "a") or key-symbol (e.g. "space")
136997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
1370f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        In order to be able to register key-events, TurtleScreen
137197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        must have focus. (See method listen.)
137297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
137397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen
137497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and a Turtle instance named turtle):
137597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
137697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> def f():
137797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fd(50)
137897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                lt(60)
137997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
138097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
138197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.onkey(f, "Up")
138297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.listen()
138397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
138497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### Subsequently the turtle can be moved by
138597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### repeatedly pressing the up-arrow key,
138697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### consequently drawing a hexagon
138797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
138897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if fun == None:
1389eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            if key in self._keys:
1390eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                self._keys.remove(key)
139197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif key not in self._keys:
139297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._keys.append(key)
1393eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._onkeyrelease(fun, key)
1394eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1395eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def onkeypress(self, fun, key=None):
1396eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Bind fun to key-press event of key if key is given,
1397eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        or to any key-press-event if no key is given.
1398eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1399eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Arguments:
1400eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        fun -- a function with no arguments
1401eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        key -- a string: key (e.g. "a") or key-symbol (e.g. "space")
1402eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1403eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        In order to be able to register key-events, TurtleScreen
1404eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        must have focus. (See method listen.)
1405eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1406eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Example (for a TurtleScreen instance named screen
1407eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        and a Turtle instance named turtle):
1408eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1409eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> def f():
1410eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                fd(50)
1411eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1412eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1413eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> screen.onkey(f, "Up")
1414eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> screen.listen()
1415eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
1416eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ### Subsequently the turtle can be moved by
1417eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ### repeatedly pressing the up-arrow key,
1418eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ### or by keeping pressed the up-arrow key.
1419eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ### consequently drawing a hexagon.
1420eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
1421eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if fun == None:
1422eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            if key in self._keys:
1423eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                self._keys.remove(key)
1424eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        elif key is not None and key not in self._keys:
1425eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self._keys.append(key)
1426eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._onkeypress(fun, key)
142797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
142897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def listen(self, xdummy=None, ydummy=None):
142997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set focus on TurtleScreen (in order to collect key-events)
143097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
143197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
143297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Dummy arguments are provided in order
143397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        to be able to pass listen to the onclick method.
143497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
143597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
143697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.listen()
143797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
143897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._listen()
143997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
144097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def ontimer(self, fun, t=0):
144197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Install a timer, which calls fun after t milliseconds.
144297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
144397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
144497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with no arguments.
144597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        t -- a number >= 0
144697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
144797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
144897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
144997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> running = True
145097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> def f():
145197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if running:
145297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        fd(50)
145397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        lt(60)
145497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        screen.ontimer(f, 250)
145597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
145697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> f()   ### makes the turtle marching around
145797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> running = False
145897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
145997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._ontimer(fun, t)
146097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
146197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def bgpic(self, picname=None):
146297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set background image or return name of current backgroundimage.
146397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
146497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
146597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        picname -- a string, name of a gif-file or "nopic".
146697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
146797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If picname is a filename, set the corresponing image as background.
146897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If picname is "nopic", delete backgroundimage, if present.
146997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If picname is None, return the filename of the current backgroundimage.
147097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
147197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
147297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgpic()
147397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'nopic'
147497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgpic("landscape.gif")
147597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bgpic()
147697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'landscape.gif'
147797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
147897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if picname is None:
147997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._bgpicname
148097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if picname not in self._bgpics:
148197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._bgpics[picname] = self._image(picname)
148297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setbgpic(self._bgpic, self._bgpics[picname])
148397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._bgpicname = picname
148497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
148597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def screensize(self, canvwidth=None, canvheight=None, bg=None):
1486f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Resize the canvas the turtles are drawing on.
148797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
148897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional arguments:
148997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        canvwidth -- positive integer, new width of canvas in pixels
149097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        canvheight --  positive integer, new height of canvas in pixels
149197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        bg -- colorstring or color-tupel, new backgroundcolor
149297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If no arguments are given, return current (canvaswidth, canvasheight)
149397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
149497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Do not alter the drawing window. To observe hidden parts of
149597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the canvas use the scrollbars. (Can make visible those parts
149697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of a drawing, which were outside the canvas before!)
149797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
149897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
149997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.screensize(2000,1500)
150097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            ### e. g. to search for an erroneously escaped turtle ;-)
150197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
150297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._resize(canvwidth, canvheight, bg)
150397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
150497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    onscreenclick = onclick
150597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    resetscreen = reset
150697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    clearscreen = clear
150797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    addshape = register_shape
1508eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    onkeyrelease = onkey
150997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
151097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass TNavigator(object):
151197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Navigation part of the RawTurtle.
151297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Implements methods for turtle movement.
151397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
151497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    START_ORIENTATION = {
151597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "standard": Vec2D(1.0, 0.0),
151697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "world"   : Vec2D(1.0, 0.0),
151797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        "logo"    : Vec2D(0.0, 1.0)  }
151897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    DEFAULT_MODE = "standard"
151997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    DEFAULT_ANGLEOFFSET = 0
152097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    DEFAULT_ANGLEORIENT = 1
152197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
152297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, mode=DEFAULT_MODE):
152397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._angleOffset = self.DEFAULT_ANGLEOFFSET
152497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._angleOrient = self.DEFAULT_ANGLEORIENT
152597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._mode = mode
152697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer = None
152797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.degrees()
152897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._mode = None
152997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setmode(mode)
153097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TNavigator.reset(self)
153197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
153297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def reset(self):
153397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """reset turtle to its initial values
153497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
153597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Will be overwritten by parent class
153697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
153797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = Vec2D(0.0, 0.0)
153897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._orient =  TNavigator.START_ORIENTATION[self._mode]
153997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
154097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _setmode(self, mode=None):
154197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set turtle-mode to 'standard', 'world' or 'logo'.
154297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
154397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if mode == None:
154497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._mode
154597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if mode not in ["standard", "logo", "world"]:
154697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
154797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._mode = mode
154897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if mode in ["standard", "world"]:
154997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._angleOffset = 0
155097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._angleOrient = 1
155197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else: # mode == "logo":
155297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._angleOffset = self._fullcircle/4.
155397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._angleOrient = -1
155497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
155597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _setDegreesPerAU(self, fullcircle):
155697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Helper function for degrees() and radians()"""
155797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fullcircle = fullcircle
155897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._degreesPerAU = 360/fullcircle
155997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._mode == "standard":
156097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._angleOffset = 0
156197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
156297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._angleOffset = fullcircle/4.
156397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
1564b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum    def degrees(self, fullcircle=360.0):
1565477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """ Set angle measurement units to degrees.
1566477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
156797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
156897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fullcircle -  a number
156997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
157097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set angle measurement units, i. e. set number
157197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of 'degrees' for a full circle. Dafault value is
157297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        360 degrees.
157397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
157497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
157597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(90)
157697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
157797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        90
157897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.degrees(400.0)  # angle measurement in gon
157997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
158097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        100
158197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
158297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
158397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setDegreesPerAU(fullcircle)
158497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
158597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def radians(self):
158697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Set the angle measurement units to radians.
158797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
158897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
158997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
159097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
159197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
159297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        90
159397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.radians()
159497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
159597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        1.5707963267948966
159697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
159797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setDegreesPerAU(2*math.pi)
159897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
159997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _go(self, distance):
160097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """move turtle forward by specified distance"""
160197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ende = self._position + self._orient * distance
160297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._goto(ende)
160397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
160497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _rotate(self, angle):
160597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turn turtle counterclockwise by specified angle if angle > 0."""
160697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle *= self._degreesPerAU
160797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._orient = self._orient.rotate(angle)
160897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
160997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _goto(self, end):
161097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """move turtle to position end."""
161197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = end
161297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
161397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def forward(self, distance):
161497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move the turtle forward by the specified distance.
161597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
161697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: forward | fd
161797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
161897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
161997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        distance -- a number (integer or float)
162097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
162197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Move the turtle forward by the specified distance, in the direction
162297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the turtle is headed.
162397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
162497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
162597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
162697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
162797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(25)
162897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
162997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (25.00,0.00)
163097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(-75)
163197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
163297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (-50.00,0.00)
163397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
163497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._go(distance)
163597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
163697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def back(self, distance):
163797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move the turtle backward by distance.
163897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
163997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: back | backward | bk
164097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
164197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
164297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        distance -- a number
164397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
164497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Move the turtle backward by distance ,opposite to the direction the
164597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle is headed. Do not change the turtle's heading.
164697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
164797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
164897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
164997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
165097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.backward(30)
165197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
165297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (-30.00, 0.00)
165397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
165497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._go(-distance)
165597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
165697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def right(self, angle):
165797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turn turtle right by angle units.
165897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
165997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: right | rt
166097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
166197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
166297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle -- a number (integer or float)
166397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
166497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turn turtle right by angle units. (Units are by default degrees,
166597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        but can be set via the degrees() and radians() functions.)
166697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Angle orientation depends on mode. (See this.)
166797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
166897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
166997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
167097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        22.0
167197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.right(45)
167297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
167397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        337.0
167497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
167597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(-angle)
167697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
167797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def left(self, angle):
167897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turn turtle left by angle units.
167997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: left | lt
168197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
168397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle -- a number (integer or float)
168497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turn turtle left by angle units. (Units are by default degrees,
168697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        but can be set via the degrees() and radians() functions.)
168797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Angle orientation depends on mode. (See this.)
168897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
169097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
169197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        22.0
169297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(45)
169397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
169497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        67.0
169597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
169697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(angle)
169797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
169897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pos(self):
169997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the turtle's current location (x,y), as a Vec2D-vector.
170097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: pos | position
170297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
170497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
170697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
170797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 240.00)
170897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
170997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._position
171097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
171197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def xcor(self):
171297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the turtle's x coordinate.
171397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
171497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
171597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
171697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
171797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> reset()
171897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(60)
171997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(100)
172097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> print turtle.xcor()
172197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        50.0
172297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
172397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._position[0]
172497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
172597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def ycor(self):
172697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the turtle's y coordinate
172797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ---
172897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
172997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
173097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
173197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> reset()
173297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(60)
173397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(100)
173497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> print turtle.ycor()
173597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        86.6025403784
173697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
173797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._position[1]
173897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
173997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def goto(self, x, y=None):
174197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move turtle to an absolute position.
174297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: setpos | setposition | goto:
174497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
174697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number      or     a pair/vector of numbers
174797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number             None
174897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: goto(x, y)         # two coordinates
175097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: goto((x, y))       # a pair (tuple) of coordinates
175197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: goto(vec)          # e.g. as returned by pos()
175297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
175397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Move turtle to an absolute position. If the pen is down,
175497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        a line will be drawn. The turtle's orientation does not change.
175597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
175697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
175797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> tp = turtle.pos()
175897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> tp
175997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
176097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setpos(60,30)
176197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
176297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (60.00,30.00)
176397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setpos((20,80))
176497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
176597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (20.00,80.00)
176697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setpos(tp)
176797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
176897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00,0.00)
176997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
177097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if y is None:
177197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._goto(Vec2D(*x))
177297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
177397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._goto(Vec2D(x, y))
177497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
177597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def home(self):
177697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move turtle to the origin - coordinates (0,0).
177797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
177897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
177997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
1780f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        Move turtle to the origin - coordinates (0,0) and set its
1781f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        heading to its start-orientation (which depends on mode).
178297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
178397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
178497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.home()
178597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
178697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.goto(0, 0)
178797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.setheading(0)
178897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
178997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setx(self, x):
179097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set the turtle's first coordinate to x
179197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
179297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
179397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number (integer or float)
179497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
179597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the turtle's first coordinate to x, leave second coordinate
179697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        unchanged.
179797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
179897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
179997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
180097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 240.00)
180197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setx(10)
180297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
180397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (10.00, 240.00)
180497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
180597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._goto(Vec2D(x, self._position[1]))
180697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
180797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def sety(self, y):
180897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set the turtle's second coordinate to y
180997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
181197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number (integer or float)
181297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the turtle's first coordinate to x, second coordinate remains
181497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        unchanged.
181597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
181797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
181897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 40.00)
181997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.sety(-10)
182097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
182197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, -10.00)
182297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
182397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._goto(Vec2D(self._position[0], y))
182497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
182597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def distance(self, x, y=None):
182697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the distance from the turtle to (x,y) in turtle step units.
182797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
182897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
182997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number   or  a pair/vector of numbers   or   a turtle instance
183097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number       None                            None
183197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
183297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: distance(x, y)         # two coordinates
183397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance((x, y))       # a pair (tuple) of coordinates
183497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(vec)          # e.g. as returned by pos()
183597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(mypen)        # where mypen is another turtle
183697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
183797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
183897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
183997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
184097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.distance(30,40)
184197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        50.0
184297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pen = Turtle()
184397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pen.forward(77)
184497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.distance(pen)
184597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        77.0
184697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
184797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if y is not None:
184897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(x, y)
184997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(x, Vec2D):
185097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x
185197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, tuple):
185297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(*x)
185397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, TNavigator):
185497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x._position
185597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return abs(pos - self._position)
185697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
185797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def towards(self, x, y=None):
185897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the angle of the line from the turtle's position to (x, y).
185997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
186097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
186197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number   or  a pair/vector of numbers   or   a turtle instance
186297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number       None                            None
186397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
186497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: distance(x, y)         # two coordinates
186597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance((x, y))       # a pair (tuple) of coordinates
186697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(vec)          # e.g. as returned by pos()
186797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(mypen)        # where mypen is another turtle
186897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
186997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return the angle, between the line from turtle-position to position
187097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        specified by x, y and the turtle's start orientation. (Depends on
187197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        modes - "standard" or "logo")
187297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
187397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
187497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
187597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (10.00, 10.00)
187697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.towards(0,0)
187797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        225.0
187897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
187997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if y is not None:
188097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(x, y)
188197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(x, Vec2D):
188297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x
188397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, tuple):
188497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(*x)
188597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, TNavigator):
188697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x._position
188797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x, y = pos - self._position
188897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result = round(math.atan2(y, x)*180.0/math.pi, 10) % 360.0
188997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result /= self._degreesPerAU
189097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return (self._angleOffset + self._angleOrient*result) % self._fullcircle
189197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
189297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def heading(self):
189397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the turtle's current heading.
189497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
189597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
189697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
189797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
189897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(67)
189997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
190097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        67.0
190197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
190297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x, y = self._orient
190397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result = round(math.atan2(y, x)*180.0/math.pi, 10) % 360.0
190497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result /= self._degreesPerAU
190597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return (self._angleOffset + self._angleOrient*result) % self._fullcircle
190697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
190797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setheading(self, to_angle):
190897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set the orientation of the turtle to to_angle.
190997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases:  setheading | seth
191197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
191397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        to_angle -- a number (integer or float)
191497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the orientation of the turtle to to_angle.
191697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Here are some common directions in degrees:
191797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         standard - mode:          logo-mode:
191997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        -------------------|--------------------
192097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           0 - east                0 - north
192197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          90 - north              90 - east
192297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         180 - west              180 - south
192397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         270 - south             270 - west
192497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
192597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
192697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setheading(90)
192797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
192897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        90
192997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
193097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle = (to_angle - self.heading())*self._angleOrient
193197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        full = self._fullcircle
193297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle = (angle+full/2.)%full - full/2.
193397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(angle)
193497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
193597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def circle(self, radius, extent = None, steps = None):
193697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Draw a circle with given radius.
193797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
193897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
193997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        radius -- a number
194097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        extent (optional) -- a number
194197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        steps (optional) -- an integer
194297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
194397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Draw a circle with given radius. The center is radius units left
194497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the turtle; extent - an angle - determines which part of the
194597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        circle is drawn. If extent is not given, draw the entire circle.
194697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If extent is not a full circle, one endpoint of the arc is the
194797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        current pen position. Draw the arc in counterclockwise direction
194897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if radius is positive, otherwise in clockwise direction. Finally
194997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the direction of the turtle is changed by the amount of extent.
195097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
195197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        As the circle is approximated by an inscribed regular polygon,
195297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        steps determines the number of steps to use. If not given,
195397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        it will be calculated automatically. Maybe used to draw regular
195497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        polygons.
195597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
195697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: circle(radius)                  # full circle
195797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: circle(radius, extent)          # arc
195897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: circle(radius, extent, steps)
195997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: circle(radius, steps=6)         # 6-sided polygon
196097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
196197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
196297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(50)
196397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(120, 180)  # semicircle
196497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
196597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
196697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(["seq"])
196797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = True
196897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed = self.speed()
196997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if extent is None:
197097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            extent = self._fullcircle
197197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if steps is None:
197297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            frac = abs(extent)/self._fullcircle
197397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            steps = 1+int(min(11+abs(radius)/6.0, 59.0)*frac)
197497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        w = 1.0 * extent / steps
197597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        w2 = 0.5 * w
197697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        l = 2.0 * radius * math.sin(w2*math.pi/180.0*self._degreesPerAU)
197797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if radius < 0:
197897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            l, w, w2 = -l, -w, -w2
197997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tr = self._tracer()
198097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        dl = self._delay()
198197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed == 0:
198297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._tracer(0, 0)
198397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
198497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.speed(0)
198597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(w2)
198697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(steps):
198797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.speed(speed)
198897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._go(l)
198997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.speed(0)
199097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._rotate(w)
199197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(-w2)
199297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed == 0:
199397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._tracer(tr, dl)
199497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.speed(speed)
199597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
199697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = False
199797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
199897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## three dummy methods to be implemented by child class:
199997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
200097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def speed(self, s=0):
200197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
200297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _tracer(self, a=None, b=None):
200397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
200497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _delay(self, n=None):
200597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
200697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
200797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    fd = forward
200897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    bk = back
200997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    backward = back
201097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    rt = right
201197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    lt = left
201297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    position = pos
201397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    setpos = goto
201497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    setposition = goto
201597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    seth = setheading
201697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
201797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
201897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass TPen(object):
201997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Drawing part of the RawTurtle.
202097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Implements drawing properties.
202197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
202297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, resizemode=_CFG["resizemode"]):
202397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._resizemode = resizemode # or "user" or "noresize"
202497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer = None
202597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TPen._reset(self)
202697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
202797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _reset(self, pencolor=_CFG["pencolor"],
202897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     fillcolor=_CFG["fillcolor"]):
202997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._pensize = 1
203097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._shown = True
203197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._pencolor = pencolor
203297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillcolor = fillcolor
203397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._drawing = True
203497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._speed = 3
2035eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._stretchfactor = (1., 1.)
2036eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shearfactor = 0.
2037eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._tilt = 0.
2038eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shapetrafo = (1., 0., 0., 1.)
203997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._outlinewidth = 1
204097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
204197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def resizemode(self, rmode=None):
204297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set resizemode to one of the values: "auto", "user", "noresize".
204397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
204497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (Optional) Argument:
204597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rmode -- one of the strings "auto", "user", "noresize"
204697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
204797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Different resizemodes have the following effects:
204897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - "auto" adapts the appearance of the turtle
204997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   corresponding to the value of pensize.
205097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - "user" adapts the appearance of the turtle according to the
205197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   values of stretchfactor and outlinewidth (outline),
205297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   which are set by shapesize()
205397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - "noresize" no adaption of the turtle's appearance takes place.
205497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If no argument is given, return current resizemode.
205597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        resizemode("user") is called by a call of shapesize with arguments.
205697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
205797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
205897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
205997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.resizemode("noresize")
206097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.resizemode()
206197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'noresize'
206297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
206397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if rmode is None:
206497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._resizemode
206597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rmode = rmode.lower()
206697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if rmode in ["auto", "user", "noresize"]:
206797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(resizemode=rmode)
206897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
206997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pensize(self, width=None):
207097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set or return the line thickness.
207197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
207297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases:  pensize | width
207397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
207497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
207597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width -- positive number
207697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
207797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the line thickness to width or return it. If resizemode is set
207897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        to "auto" and turtleshape is a polygon, that polygon is drawn with
207997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the same line thickness. If no argument is given, current pensize
208097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is returned.
208197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
208297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
208397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pensize()
208497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        1
208597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.pensize(10)   # from here on lines of width 10 are drawn
208697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
208797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if width is None:
208897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._pensize
208997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(pensize=width)
209097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def penup(self):
209397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Pull the pen up -- no drawing when moving.
209497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: penup | pu | up
209697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument
209897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
210097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.penup()
210197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
210297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not self._drawing:
210397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
210497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(pendown=False)
210597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
210697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pendown(self):
210797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Pull the pen down -- drawing when moving.
210897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
210997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: pendown | pd | down
211097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
211197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
211297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
211397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
211497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pendown()
211597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
211697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._drawing:
211797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
211897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(pendown=True)
211997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
212097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def isdown(self):
212197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return True if pen is down, False if it's up.
212297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
212397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
212497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
212597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
212697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.penup()
212797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.isdown()
212897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        False
212997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pendown()
213097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.isdown()
213197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        True
213297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
213397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._drawing
213497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
213597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def speed(self, speed=None):
213697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the turtle's speed.
213797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
213897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
213997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed -- an integer in the range 0..10 or a speedstring (see below)
214097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
214197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the turtle's speed to an integer value in the range 0 .. 10.
214297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If no argument is given: return current speed.
214397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
214497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If input is a number greater than 10 or smaller than 0.5,
214597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed is set to 0.
214697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Speedstrings  are mapped to speedvalues in the following way:
214797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'fastest' :  0
214897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'fast'    :  10
214997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'normal'  :  6
215097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'slow'    :  3
215197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'slowest' :  1
215297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speeds from 1 to 10 enforce increasingly faster animation of
215397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        line drawing and turtle turning.
215497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
215597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Attention:
215697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed = 0 : *no* animation takes place. forward/back makes turtle jump
215797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and likewise left/right make the turtle turn instantly.
215897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
215997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
216097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.speed(3)
216197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
216297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speeds = {'fastest':0, 'fast':10, 'normal':6, 'slow':3, 'slowest':1 }
216397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed is None:
216497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._speed
216597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed in speeds:
216697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed = speeds[speed]
216797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif 0.5 < speed < 10.5:
216897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed = int(round(speed))
216997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
217097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed = 0
217197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(speed=speed)
217297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
217397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def color(self, *args):
217497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return or set the pencolor and fillcolor.
217597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
217697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
217797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Several input formats are allowed.
217897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        They use 0, 1, 2, or 3 arguments as follows:
217997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
218097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color()
218197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Return the current pencolor and the current fillcolor
218297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            as a pair of color specification strings as are returned
218397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            by pencolor and fillcolor.
218497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color(colorstring), color((r,g,b)), color(r,g,b)
218597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            inputs as in pencolor, set both, fillcolor and pencolor,
218697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            to the given value.
218797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color(colorstring1, colorstring2),
218897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color((r1,g1,b1), (r2,g2,b2))
218997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            equivalent to pencolor(colorstring1) and fillcolor(colorstring2)
219097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            and analogously, if the other input format is used.
219197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
219297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If turtleshape is a polygon, outline and interior of that polygon
219397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is drawn with the newly set colors.
219497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        For mor info see: pencolor, fillcolor
219597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
219697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
219797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color('red', 'green')
219897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color()
219997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ('red', 'green')
220097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> colormode(255)
220197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> color((40, 80, 120), (160, 200, 240))
220297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> color()
220397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ('#285078', '#a0c8f0')
220497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
220597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
220697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            l = len(args)
220797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if l == 1:
220897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pcolor = fcolor = args[0]
220997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif l == 2:
221097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pcolor, fcolor = args
221197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif l == 3:
221297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pcolor = fcolor = args
221397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pcolor = self._colorstr(pcolor)
221497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            fcolor = self._colorstr(fcolor)
221597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(pencolor=pcolor, fillcolor=fcolor)
221697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
221797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._color(self._pencolor), self._color(self._fillcolor)
221897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
221997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pencolor(self, *args):
222097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the pencolor.
222197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
222297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
222397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Four input formats are allowed:
222497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor()
222597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Return the current pencolor as color specification string,
222697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            possibly in hex-number format (see example).
222797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            May be used as input to another color/pencolor/fillcolor call.
222897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor(colorstring)
222997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            s is a Tk color specification string, such as "red" or "yellow"
223097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor((r, g, b))
223197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            *a tuple* of r, g, and b, which represent, an RGB color,
223297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            and each of r, g, and b are in the range 0..colormode,
223397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            where colormode is either 1.0 or 255
223497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor(r, g, b)
223597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, and b represent an RGB color, and each of r, g, and b
223697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            are in the range 0..colormode
223797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
223897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If turtleshape is a polygon, the outline of that polygon is drawn
223997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        with the newly set pencolor.
224097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
224197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
224297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor('brown')
224397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> tup = (0.2, 0.8, 0.55)
224497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor(tup)
224597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor()
224697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        '#33cc8c'
224797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
224897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
224997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(args)
225097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if color == self._pencolor:
225197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return
225297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(pencolor=color)
225397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
225497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._color(self._pencolor)
225597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
225697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def fillcolor(self, *args):
225797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the fillcolor.
225897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
225997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
226097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Four input formats are allowed:
226197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor()
226297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Return the current fillcolor as color specification string,
226397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            possibly in hex-number format (see example).
226497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            May be used as input to another color/pencolor/fillcolor call.
226597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor(colorstring)
226697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            s is a Tk color specification string, such as "red" or "yellow"
226797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor((r, g, b))
226897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            *a tuple* of r, g, and b, which represent, an RGB color,
226997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            and each of r, g, and b are in the range 0..colormode,
227097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            where colormode is either 1.0 or 255
227197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor(r, g, b)
227297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, and b represent an RGB color, and each of r, g, and b
227397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            are in the range 0..colormode
227497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
227597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If turtleshape is a polygon, the interior of that polygon is drawn
227697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        with the newly set fillcolor.
227797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
227897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
227997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fillcolor('violet')
228097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> col = turtle.pencolor()
228197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fillcolor(col)
228297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fillcolor(0, .5, 0)
228397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
228497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
228597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(args)
228697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if color == self._fillcolor:
228797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return
228897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(fillcolor=color)
228997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
229097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._color(self._fillcolor)
229197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
229297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def showturtle(self):
229397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Makes the turtle visible.
229497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
229597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: showturtle | st
229697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
229797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
229897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
229997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
230097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.hideturtle()
230197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.showturtle()
230297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
230397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(shown=True)
230497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
230597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def hideturtle(self):
230697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Makes the turtle invisible.
230797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
230897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: hideturtle | ht
230997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
231197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        It's a good idea to do this while you're in the
231397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        middle of a complicated drawing, because hiding
231497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the turtle speeds up the drawing observably.
231597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
231797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.hideturtle()
2318477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
231997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(shown=False)
2320b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
232197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def isvisible(self):
232297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return True if the Turtle is shown, False if it's hidden.
2323477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
232497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
232597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
232697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
232797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.hideturtle()
232897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> print turtle.isvisible():
232997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        False
2330477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
233197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._shown
233297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
233397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pen(self, pen=None, **pendict):
233497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return or set the pen's attributes.
233597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
233697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
233797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pen -- a dictionary with some or all of the below listed keys.
233897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            **pendict -- one or more keyword-arguments with the below
233997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                         listed keys as keywords.
234097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
234197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return or set the pen's attributes in a 'pen-dictionary'
234297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        with the following key/value pairs:
234397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "shown"      :   True/False
234497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "pendown"    :   True/False
234597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "pencolor"   :   color-string or color-tuple
234697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "fillcolor"  :   color-string or color-tuple
234797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "pensize"    :   positive number
234897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "speed"      :   number in range 0..10
234997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "resizemode" :   "auto" or "user" or "noresize"
235097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "stretchfactor": (positive number, positive number)
2351eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl           "shearfactor":   number
235297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "outline"    :   positive number
235397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "tilt"       :   number
235497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2355f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        This dictionary can be used as argument for a subsequent
235697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pen()-call to restore the former pen-state. Moreover one
235797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        or more of these attributes can be provided as keyword-arguments.
235897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This can be used to set several pen attributes in one statement.
235997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
236097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
236197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
236297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pen(fillcolor="black", pencolor="red", pensize=10)
236397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pen()
236497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        {'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,
236597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pencolor': 'red', 'pendown': True, 'fillcolor': 'black',
2366eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}
236797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> penstate=turtle.pen()
236897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("yellow","")
236997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.penup()
237097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pen()
237197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        {'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,
237297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pencolor': 'yellow', 'pendown': False, 'fillcolor': '',
2373eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}
237497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> p.pen(penstate, fillcolor="green")
237597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> p.pen()
237697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        {'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,
237797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pencolor': 'red', 'pendown': True, 'fillcolor': 'green',
2378eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}
237997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
238097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        _pd =  {"shown"         : self._shown,
238197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "pendown"       : self._drawing,
238297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "pencolor"      : self._pencolor,
238397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "fillcolor"     : self._fillcolor,
238497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "pensize"       : self._pensize,
238597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "speed"         : self._speed,
238697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "resizemode"    : self._resizemode,
238797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "stretchfactor" : self._stretchfactor,
2388eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                "shearfactor"   : self._shearfactor,
238997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "outline"       : self._outlinewidth,
239097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "tilt"          : self._tilt
239197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               }
239297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
239397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not (pen or pendict):
239497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return _pd
239597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
239697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(pen, dict):
239797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            p = pen
239897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
239997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            p = {}
240097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        p.update(pendict)
240197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
240297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        _p_buf = {}
240397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for key in p:
240497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            _p_buf[key] = _pd[key]
240597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
240697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
240797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("pen", _p_buf))
240897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
240997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        newLine = False
241097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pendown" in p:
241197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._drawing != p["pendown"]:
241297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newLine = True
241397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pencolor" in p:
241497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(p["pencolor"], tuple):
241597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                p["pencolor"] = self._colorstr((p["pencolor"],))
241697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._pencolor != p["pencolor"]:
241797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newLine = True
241897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pensize" in p:
241997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._pensize != p["pensize"]:
242097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newLine = True
242197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if newLine:
242297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._newLine()
242397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pendown" in p:
242497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._drawing = p["pendown"]
242597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pencolor" in p:
242697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._pencolor = p["pencolor"]
242797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pensize" in p:
242897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._pensize = p["pensize"]
242997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "fillcolor" in p:
243097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(p["fillcolor"], tuple):
243197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                p["fillcolor"] = self._colorstr((p["fillcolor"],))
243297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillcolor = p["fillcolor"]
243397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "speed" in p:
243497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._speed = p["speed"]
243597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "resizemode" in p:
243697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._resizemode = p["resizemode"]
243797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "stretchfactor" in p:
243897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            sf = p["stretchfactor"]
243997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(sf, (int, float)):
244097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                sf = (sf, sf)
244197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._stretchfactor = sf
2442eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if "shearfactor" in p:
2443eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self._shearfactor = p["shearfactor"]
244497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "outline" in p:
244597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._outlinewidth = p["outline"]
244697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "shown" in p:
244797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._shown = p["shown"]
244897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "tilt" in p:
244997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._tilt = p["tilt"]
2450eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if "stretchfactor" in p or "tilt" in p or "shearfactor" in p:
2451eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            scx, scy = self._stretchfactor
2452eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            shf = self._shearfactor
2453eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            sa, ca = math.sin(self._tilt), math.cos(self._tilt)
2454eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self._shapetrafo = ( scx*ca, scy*(shf*ca + sa),
2455eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                -scx*sa, scy*(ca - shf*sa))
245697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
245797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
245897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## three dummy methods to be implemented by child class:
245997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
246097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _newLine(self, usePos = True):
246197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update(self, count=True, forced=False):
246397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _color(self, args):
246597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _colorstr(self, args):
246797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
246997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    width = pensize
247097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    up = penup
247197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    pu = penup
247297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    pd = pendown
247397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    down = pendown
247497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    st = showturtle
247597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ht = hideturtle
247697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
247797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
247897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass _TurtleImage(object):
247997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Helper class: Datatype to store Turtle attributes
248097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
248197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
248297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, screen, shapeIndex):
248397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen = screen
248497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._type = None
248597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setshape(shapeIndex)
248697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
248797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _setshape(self, shapeIndex):
2488eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        screen = self.screen
248997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.shapeIndex = shapeIndex
249097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type == "polygon" == screen._shapes[shapeIndex]._type:
249197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
249297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type == "image" == screen._shapes[shapeIndex]._type:
249397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
249497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type in ["image", "polygon"]:
249597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._delete(self._item)
249697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif self._type == "compound":
249797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for item in self._item:
249897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._delete(item)
249997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._type = screen._shapes[shapeIndex]._type
250097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type == "polygon":
250197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._item = screen._createpoly()
250297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif self._type == "image":
250397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._item = screen._createimage(screen._shapes["blank"]._data)
250497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif self._type == "compound":
250597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._item = [screen._createpoly() for item in
250697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                          screen._shapes[shapeIndex]._data]
250797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
250897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
250997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass RawTurtle(TPen, TNavigator):
251097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Animation part of the RawTurtle.
251197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Puts RawTurtle upon a TurtleScreen and provides tools for
2512f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson    its animation.
251397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
251497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    screens = []
251597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
251697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, canvas=None,
251797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 shape=_CFG["shape"],
251897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 undobuffersize=_CFG["undobuffersize"],
251997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 visible=_CFG["visible"]):
2520601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if isinstance(canvas, _Screen):
252197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen = canvas
252297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(canvas, TurtleScreen):
252397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if canvas not in RawTurtle.screens:
252497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                RawTurtle.screens.append(canvas)
252597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen = canvas
252697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(canvas, (ScrolledCanvas, Canvas)):
252797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for screen in RawTurtle.screens:
252897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if screen.cv == canvas:
252997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.screen = screen
253097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    break
253197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
253297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen = TurtleScreen(canvas)
253397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                RawTurtle.screens.append(self.screen)
253497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
253597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad cavas argument %s" % canvas)
253697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
253797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
253897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TNavigator.__init__(self, screen.mode())
253997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TPen.__init__(self)
254097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen._turtles.append(self)
254197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.drawingLineItem = screen._createline()
254297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle = _TurtleImage(screen, shape)
254397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._poly = None
254497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._creatingPoly = False
254597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillitem = self._fillpath = None
254697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._shown = visible
254797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._hidden_from_screen = False
254897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLineItem = screen._createline()
254997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = [self._position]
255097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.items = [self.currentLineItem]
255197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.stampItems = []
255297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._undobuffersize = undobuffersize
255397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer = Tbuffer(undobuffersize)
255497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
2555b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2556b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum    def reset(self):
2557f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Delete the turtle's drawings and restore its default values.
2558477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
255997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
256097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis,
256197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Delete the turtle's drawings from the screen, re-center the turtle
256297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and set variables to the default values.
256397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
256497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
2565477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.position()
256697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00,-22.00)
2567477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.heading()
2568477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        100.0
2569477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.reset()
2570477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.position()
257197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00,0.00)
2572477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.heading()
2573477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        0.0
2574477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
257597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TNavigator.reset(self)
257697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TPen._reset(self)
257797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._clear()
257897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._drawturtle()
257997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
2580b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
258197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setundobuffer(self, size):
258297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set or disable undobuffer.
2583477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
258497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
258597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        size -- an integer or None
25863c7a25a4d9ea07f2aa8e4b70fecd84e33de82c2eGuido van Rossum
258797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If size is an integer an empty undobuffer of given size is installed.
258897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Size gives the maximum number of turtle-actions that can be undone
258997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        by the undo() function.
259097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If size is None, no undobuffer is present.
2591477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
259297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
259397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setundobuffer(42)
2594477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
259597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if size is None:
259697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer = None
259797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
259897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer = Tbuffer(size)
2599b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
260097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def undobufferentries(self):
260197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return count of entries in the undobuffer.
2602477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
260397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
260497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
260597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
260697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> while undobufferentries():
260797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                undo()
2608477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
260997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer is None:
261097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return 0
261197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.undobuffer.nr_of_items()
261297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
261397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _clear(self):
261497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete all of pen's drawings"""
261597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillitem = self._fillpath = None
261697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for item in self.items:
261797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._delete(item)
261897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLineItem = self.screen._createline()
261997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = []
262097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._drawing:
262197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLine.append(self._position)
262297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.items = [self.currentLineItem]
262397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.clearstamps()
262497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.setundobuffer(self._undobuffersize)
2625b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2626477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
262797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clear(self):
262897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete the turtle's drawings from the screen. Do not move turtle.
2629477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
263097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
2631b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
263297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Delete the turtle's drawings from the screen. Do not move turtle.
263397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        State and position of the turtle as well as drawings of other
263497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtles are not affected.
2635477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
263697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
263797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clear()
263897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
263997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._clear()
264097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
2641477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
264297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update_data(self):
264397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._incrementudc()
264497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.screen._updatecounter != 0:
264597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
264697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(self.currentLine)>1:
264797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawline(self.currentLineItem, self.currentLine,
264897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                  self._pencolor, self._pensize)
264997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
265097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update(self):
265197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Perform a Turtle-data update.
2652477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
265397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
265497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if screen._tracing == 0:
265597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
265697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif screen._tracing == 1:
265797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update_data()
265897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._drawturtle()
265997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._update()                  # TurtleScreenBase
266097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._delay(screen._delayvalue) # TurtleScreenBase
266197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
266297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update_data()
266397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if screen._updatecounter == 0:
266497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for t in screen.turtles():
266597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    t._drawturtle()
266697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._update()
266797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
266897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _tracer(self, flag=None, delay=None):
266997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turns turtle animation on/off and set delay for update drawings.
267097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
267197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional arguments:
267297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        n -- nonnegative  integer
267397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        delay -- nonnegative  integer
267497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
267597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If n is given, only each n-th regular screen update is really performed.
267697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (Can be used to accelerate the drawing of complex graphics.)
267797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Second arguments sets delay value (see RawTurtle.delay())
267897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
267997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
268097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tracer(8, 25)
268197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> dist = 2
268297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(200):
268397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.fd(dist)
268497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.rt(90)
268597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                dist += 2
268697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
268797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen.tracer(flag, delay)
2688b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
268997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _color(self, args):
269097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen._color(args)
2691477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
269297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _colorstr(self, args):
269397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen._colorstr(args)
2694477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
269597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _cc(self, args):
269697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Convert colortriples to hexstrings.
2697477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
269897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(args, str):
269997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return args
270097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
270197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, b = args
270297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except:
270397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad color arguments: %s" % str(args))
270497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.screen._colormode == 1.0:
270597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, b = [round(255.0*x) for x in (r, g, b)]
270697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not ((0 <= r <= 255) and (0 <= g <= 255) and (0 <= b <= 255)):
270797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad color sequence: %s" % str(args))
270897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return "#%02x%02x%02x" % (r, g, b)
2709b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
271097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clone(self):
271197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Create and return a clone of the turtle.
2712477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
271397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
2714b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
271597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Create and return a clone of the turtle with same position, heading
271697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and turtle properties.
2717477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
271897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named mick):
271997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mick = Turtle()
272097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        joe = mick.clone()
272197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
272297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
272397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._newLine(self._drawing)
272497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
272597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle = self.turtle
272697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen = None
272797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle = None  # too make self deepcopy-able
272897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
272997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q = deepcopy(self)
273097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
273197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen = screen
273297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle = turtle
273397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
273497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q.screen = screen
273597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q.turtle = _TurtleImage(screen, self.turtle.shapeIndex)
273697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
273797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen._turtles.append(q)
273897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ttype = screen._shapes[self.turtle.shapeIndex]._type
273997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if ttype == "polygon":
274097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            q.turtle._item = screen._createpoly()
274197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "image":
274297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            q.turtle._item = screen._createimage(screen._shapes["blank"]._data)
274397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "compound":
274497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            q.turtle._item = [screen._createpoly() for item in
274597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              screen._shapes[self.turtle.shapeIndex]._data]
274697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q.currentLineItem = screen._createline()
274797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q._update()
274897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return q
274997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
275097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def shape(self, name=None):
275197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set turtle shape to shape with given name / return current shapename.
275297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
275397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
275497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        name -- a string, which is a valid shapename
275597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
275697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set turtle shape to shape with given name or, if name is not given,
275797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return name of current shape.
275897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Shape with name must exist in the TurtleScreen's shape dictionary.
275997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Initially there are the following polygon shapes:
276097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic'.
276197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        To learn about how to deal with shapes see Screen-method register_shape.
276297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
276397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
276497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape()
276597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'arrow'
276697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("turtle")
276797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape()
276897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'turtle'
276997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
277097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if name is None:
277197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self.turtle.shapeIndex
277297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not name in self.screen.getshapes():
277397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("There is no shape named %s" % name)
277497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle._setshape(name)
277597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
277697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
277797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def shapesize(self, stretch_wid=None, stretch_len=None, outline=None):
277897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set/return turtle's stretchfactors/outline. Set resizemode to "user".
277997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
278097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optinonal arguments:
278197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           stretch_wid : positive number
278297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           stretch_len : positive number
278397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           outline  : positive number
278497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
278597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return or set the pen's attributes x/y-stretchfactors and/or outline.
278697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set resizemode to "user".
278797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If and only if resizemode is set to "user", the turtle will be displayed
278897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stretched according to its stretchfactors:
278997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stretch_wid is stretchfactor perpendicular to orientation
279097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stretch_len is stretchfactor in direction of turtles orientation.
279197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        outline determines the width of the shapes's outline.
279297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
279397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
279497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.resizemode("user")
279597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5, 5, 12)
279697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(outline=8)
279797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
2798eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if stretch_wid is stretch_len is outline == None:
279997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stretch_wid, stretch_len = self._stretchfactor
280097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return stretch_wid, stretch_len, self._outlinewidth
2801eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if stretch_wid == 0 or stretch_len == 0:
2802eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            raise TurtleGraphicsError("stretch_wid/stretch_len must not be zero")
280397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if stretch_wid is not None:
280497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if stretch_len is None:
280597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                stretchfactor = stretch_wid, stretch_wid
280697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
280797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                stretchfactor = stretch_wid, stretch_len
280897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif stretch_len is not None:
280997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stretchfactor = self._stretchfactor[0], stretch_len
281097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
281197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stretchfactor = self._stretchfactor
281297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if outline is None:
281397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            outline = self._outlinewidth
281497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(resizemode="user",
281597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 stretchfactor=stretchfactor, outline=outline)
281697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2817eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def shearfactor(self, shear=None):
2818eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Set or return the current shearfactor.
2819eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2820eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Optional argument: shear -- number, tangent of the shear angle
2821eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2822eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Shear the turtleshape according to the given shearfactor shear,
2823eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        which is the tangent of the shear angle. DO NOT change the
2824eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        turtle's heading (direction of movement).
2825eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If shear is not given: return the current shearfactor, i. e. the
2826eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        tangent of the shear angle, by which lines parallel to the
2827eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        heading of the turtle are sheared.
2828eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2829eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Examples (for a Turtle instance named turtle):
2830eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shape("circle")
2831eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapesize(5,2)
2832eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shearfactor(0.5)
2833eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shearfactor()
2834eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> 0.5
2835eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2836eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if shear is None:
2837eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return self._shearfactor
2838eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self.pen(resizemode="user", shearfactor=shear)
2839eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
284097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def settiltangle(self, angle):
284197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Rotate the turtleshape to point in the specified direction
284297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2843eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Argument: angle -- number
284497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
284597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Rotate the turtleshape to point in the direction specified by angle,
284697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        regardless of its current tilt-angle. DO NOT change the turtle's
284797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        heading (direction of movement).
284897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
284997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
285097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
285197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("circle")
285297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5,2)
285397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.settiltangle(45)
285497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> stamp()
285597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
285697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.settiltangle(-45)
285797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> stamp()
285897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
2859477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
286097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tilt = -angle * self._degreesPerAU * self._angleOrient
286197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tilt = (tilt * math.pi / 180.0) % (2*math.pi)
286297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(resizemode="user", tilt=tilt)
2863b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2864eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def tiltangle(self, angle=None):
2865eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Set or return the current tilt-angle.
2866477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
2867eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Optional argument: angle -- number
2868eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2869eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Rotate the turtleshape to point in the direction specified by angle,
2870eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        regardless of its current tilt-angle. DO NOT change the turtle's
2871eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        heading (direction of movement).
2872eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If angle is not given: return the current tilt-angle, i. e. the angle
2873eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        between the orientation of the turtleshape and the heading of the
2874eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        turtle (its direction of movement).
2875b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2876eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Deprecated since Python 3.1
2877477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
287897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
287997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("circle")
288097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5,2)
288197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tilt(45)
288297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tiltangle()
288397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>>
288497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
2885eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if angle is None:
2886eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            tilt = -self._tilt * (180.0/math.pi) * self._angleOrient
2887eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return (tilt / self._degreesPerAU) % self._fullcircle
2888eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        else:
2889eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self.settiltangle(angle)
2890477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
289197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def tilt(self, angle):
289297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Rotate the turtleshape by angle.
2893477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
289497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
289597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle - a number
2896477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
289797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Rotate the turtleshape by angle from its current tilt-angle,
289897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        but do NOT change the turtle's heading (direction of movement).
2899477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
290097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
290197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("circle")
290297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5,2)
290397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tilt(30)
290497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
290597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tilt(30)
290697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
290797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
290897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.settiltangle(angle + self.tiltangle())
2909477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
2910eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def shapetransform(self, t11=None, t12=None, t21=None, t22=None):
2911eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Set or return the current transformation matrix of the turtle shape.
2912eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2913eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Optional arguments: t11, t12, t21, t22 -- numbers.
2914eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2915eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If none of the matrix elements are given, return the transformation
2916eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        matrix.
2917eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Otherwise set the given elements and transform the turtleshape
2918eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        according to the matrix consisting of first row t11, t12 and
2919eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        second row t21, 22.
2920eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Modify stretchfactor, shearfactor and tiltangle according to the
2921eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        given matrix.
2922eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2923eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Examples (for a Turtle instance named turtle):
2924eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shape("square")
2925eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapesize(4,2)
2926eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shearfactor(-0.5)
2927eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapetransform()
2928eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> (4.0, -1.0, -0.0, 2.0)
2929eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2930eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t11 is t12 is t21 is t22 is None:
2931eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return self._shapetrafo
2932eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        m11, m12, m21, m22 = self._shapetrafo
2933eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t11 is not None: m11 = t11
2934eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t12 is not None: m12 = t12
2935eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t21 is not None: m21 = t21
2936eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t22 is not None: m22 = t22
2937eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t11 * t22 - t12 * t21 == 0:
2938eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            raise TurtleGraphicsError("Bad shape transform matrix: must not be singular")
2939eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shapetrafo = (m11, m12, m21, m22)
2940eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        alfa = math.atan2(-m21, m11) % (2 * math.pi)
2941eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        sa, ca = math.sin(alfa), math.cos(alfa)
2942eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        a11, a12, a21, a22 = (ca*m11 - sa*m21, ca*m12 - sa*m22,
2943eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                              sa*m11 + ca*m21, sa*m12 + ca*m22)
2944eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._stretchfactor = a11, a22
2945eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shearfactor = a12/a22
2946eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._tilt = alfa
2947eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._update()
2948eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2949eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
295097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _polytrafo(self, poly):
295197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Computes transformed polygon shapes from a shape
295297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        according to current position and heading.
295397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
295497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
295597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        p0, p1 = self._position
295697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        e0, e1 = self._orient
295797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        e = Vec2D(e0, e1 * screen.yscale / screen.xscale)
295897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        e0, e1 = (1.0 / abs(e)) * e
295997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return [(p0+(e1*x+e0*y)/screen.xscale, p1+(-e0*x+e1*y)/screen.yscale)
296097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                           for (x, y) in poly]
296197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2962eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def get_shapepoly(self):
2963eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Return the current shape polygon as tuple of coordinate pairs.
2964eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2965eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        No argument.
2966eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2967eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Examples (for a Turtle instance named turtle):
2968eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shape("square")
2969eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapetransform(4, -1, 0, 2)
2970eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.get_shapepoly()
2971eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ((50, -20), (30, 20), (-50, 20), (-30, -20))
2972eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2973eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2974eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        shape = self.screen._shapes[self.turtle.shapeIndex]
2975eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if shape._type == "polygon":
2976eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return self._getshapepoly(shape._data, shape._type == "compound")
2977eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        # else return None
2978eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2979eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def _getshapepoly(self, polygon, compound=False):
2980eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Calculate transformed shape polygon according to resizemode
2981eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        and shapetransform.
2982eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2983eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if self._resizemode == "user" or compound:
2984eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            t11, t12, t21, t22 = self._shapetrafo
2985eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        elif self._resizemode == "auto":
2986eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            l = max(1, self._pensize/5.0)
2987eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            t11, t12, t21, t22 = l, 0, 0, l
2988eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        elif self._resizemode == "noresize":
2989eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return polygon
2990eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        return tuple([(t11*x + t12*y, t21*x + t22*y) for (x, y) in polygon])
2991eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
299297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _drawturtle(self):
299397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Manages the correct rendering of the turtle with respect to
2994934896dc0977ea25dc37c13117525f2394625ceeMark Dickinson        its shape, resizemode, stretch and tilt etc."""
299597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
299697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        shape = screen._shapes[self.turtle.shapeIndex]
299797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ttype = shape._type
299897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        titem = self.turtle._item
299997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._shown and screen._updatecounter == 0 and screen._tracing > 0:
300097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._hidden_from_screen = False
300197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tshape = shape._data
300297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if ttype == "polygon":
3003eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                if self._resizemode == "noresize": w = 1
3004eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                elif self._resizemode == "auto": w = self._pensize
3005eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                else: w =self._outlinewidth
3006eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                shape = self._polytrafo(self._getshapepoly(tshape))
300797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fc, oc = self._fillcolor, self._pencolor
300897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawpoly(titem, shape, fill=fc, outline=oc,
300997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                      width=w, top=True)
301097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "image":
301197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawimage(titem, self._position, tshape)
301297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "compound":
301397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for item, (poly, fc, oc) in zip(titem, tshape):
3014eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                    poly = self._polytrafo(self._getshapepoly(poly, True))
301597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawpoly(item, poly, fill=self._cc(fc),
3016eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                     outline=self._cc(oc), width=self._outlinewidth, top=True)
301797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
301897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._hidden_from_screen:
3019b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum                return
302097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if ttype == "polygon":
302197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawpoly(titem, ((0, 0), (0, 0), (0, 0)), "", "")
302297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "image":
302397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawimage(titem, self._position,
302497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                          screen._shapes["blank"]._data)
302597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "compound":
302697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for item in titem:
302797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawpoly(item, ((0, 0), (0, 0), (0, 0)), "", "")
302897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._hidden_from_screen = True
302997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##############################  stamp stuff  ###############################
303197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def stamp(self):
3033f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Stamp a copy of the turtleshape onto the canvas and return its id.
303497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
303697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Stamp a copy of the turtle shape onto the canvas at the current
303897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle position. Return a stamp_id for that stamp, which can be
303997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        used to delete it by calling clearstamp(stamp_id).
304097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
304197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
304297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("blue")
304397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.stamp()
304497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        13
304597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
304697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
304797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
304897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        shape = screen._shapes[self.turtle.shapeIndex]
304997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ttype = shape._type
305097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tshape = shape._data
305197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if ttype == "polygon":
305297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = screen._createpoly()
3053eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            if self._resizemode == "noresize": w = 1
3054eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            elif self._resizemode == "auto": w = self._pensize
3055eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            else: w =self._outlinewidth
3056eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            shape = self._polytrafo(self._getshapepoly(tshape))
305797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            fc, oc = self._fillcolor, self._pencolor
305897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._drawpoly(stitem, shape, fill=fc, outline=oc,
305997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                  width=w, top=True)
306097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "image":
306197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = screen._createimage("")
306297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._drawimage(stitem, self._position, tshape)
306397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "compound":
306497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = []
306597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for element in tshape:
306697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                item = screen._createpoly()
306797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                stitem.append(item)
306897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = tuple(stitem)
306997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for item, (poly, fc, oc) in zip(stitem, tshape):
3070eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                poly = self._polytrafo(self._getshapepoly(poly, True))
307197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawpoly(item, poly, fill=self._cc(fc),
3072eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                 outline=self._cc(oc), width=self._outlinewidth, top=True)
307397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.stampItems.append(stitem)
307497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer.push(("stamp", stitem))
307597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return stitem
307697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
307797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _clearstamp(self, stampid):
307897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """does the work for clearstamp() and clearstamps()
307997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
308097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if stampid in self.stampItems:
308197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(stampid, tuple):
308297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for subitem in stampid:
308397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.screen._delete(subitem)
308497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
308597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen._delete(stampid)
308697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.stampItems.remove(stampid)
308797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # Delete stampitem from undobuffer if necessary
308897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # if clearstamp is called directly.
308997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item = ("stamp", stampid)
309097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        buf = self.undobuffer
309197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if item not in buf.buffer:
309297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
309397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        index = buf.buffer.index(item)
309497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        buf.buffer.remove(item)
309597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if index <= buf.ptr:
309697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            buf.ptr = (buf.ptr - 1) % buf.bufsize
309797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        buf.buffer.insert((buf.ptr+1)%buf.bufsize, [None])
309897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
309997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clearstamp(self, stampid):
310097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete stamp with given stampid
310197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
310297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
310397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stampid - an integer, must be return value of previous stamp() call.
310497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
310597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
310697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("blue")
310797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> astamp = turtle.stamp()
310897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
310997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamp(astamp)
311097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
311197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._clearstamp(stampid)
311297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
311397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
311497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clearstamps(self, n=None):
311597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete all or first/last n of turtle's stamps.
311697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
311797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
311897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        n -- an integer
311997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
312097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If n is None, delete all of pen's stamps,
312197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else if n > 0 delete first n stamps
312297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else if n < 0 delete last n stamps.
312397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
312497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
312597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(8):
312697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.stamp(); turtle.fd(30)
312797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ...
312897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamps(2)
312997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamps(-2)
313097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamps()
313197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
313297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if n is None:
313397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            toDelete = self.stampItems[:]
313497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif n >= 0:
313597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            toDelete = self.stampItems[:n]
3136b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        else:
313797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            toDelete = self.stampItems[n:]
313897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for item in toDelete:
313997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._clearstamp(item)
314097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
314197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
314297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _goto(self, end):
314397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move the pen to the point end, thereby drawing a line
314497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if pen is down. All other methodes for turtle movement depend
314597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        on this one.
314697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
314797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ## Version mit undo-stuff
314897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        go_modes = ( self._drawing,
314997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     self._pencolor,
315097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     self._pensize,
315197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     isinstance(self._fillpath, list))
315297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
315397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        undo_entry = ("go", self._position, end, go_modes,
315497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      (self.currentLineItem,
315597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      self.currentLine[:],
315697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      screen._pointlist(self.currentLineItem),
315797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      self.items[:])
315897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      )
315997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
316097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(undo_entry)
316197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        start = self._position
316297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._speed and screen._tracing == 1:
316397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diff = (end-start)
316497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diffsq = (diff[0]*screen.xscale)**2 + (diff[1]*screen.yscale)**2
316597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            nhops = 1+int((diffsq**0.5)/(3*(1.1**self._speed)*self._speed))
316697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            delta = diff * (1.0/nhops)
316797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for n in range(1, nhops):
316897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if n == 1:
316997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = True
317097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                else:
317197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = False
317297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._position = start + delta * n
317397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if self._drawing:
317497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawline(self.drawingLineItem,
317597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     (start, self._position),
317697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     self._pencolor, self._pensize, top)
317797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._update()
317897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._drawing:
317997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawline(self.drawingLineItem, ((0, 0), (0, 0)),
318097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                               fill="", width=self._pensize)
318197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # Turtle now at end,
318297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._drawing: # now update currentLine
318397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLine.append(end)
318497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(self._fillpath, list):
318597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillpath.append(end)
318697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ######    vererbung!!!!!!!!!!!!!!!!!!!!!!
318797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = end
318897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._creatingPoly:
318997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._poly.append(end)
319097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(self.currentLine) > 42: # 42! answer to the ultimate question
319197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                       # of life, the universe and everything
319297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._newLine()
319397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update() #count=True)
319497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
319597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _undogoto(self, entry):
319697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Reverse a _goto. Used for undo()
319797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
319897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        old, new, go_modes, coodata = entry
319997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        drawing, pc, ps, filling = go_modes
320097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cLI, cL, pl, items = coodata
320197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
320297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if abs(self._position - new) > 0.5:
320397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            print ("undogoto: HALLO-DA-STIMMT-WAS-NICHT!")
320497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # restore former situation
320597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLineItem = cLI
320697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = cL
320797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
320897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if pl == [(0, 0), (0, 0)]:
320997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            usepc = ""
321097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
321197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            usepc = pc
321297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen._drawline(cLI, pl, fill=usepc, width=ps)
321397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
321497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        todelete = [i for i in self.items if (i not in items) and
321597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                       (screen._type(i) == "line")]
321697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in todelete:
321797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._delete(i)
321897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.remove(i)
321997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
322097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        start = old
322197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._speed and screen._tracing == 1:
322297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diff = old - new
322397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diffsq = (diff[0]*screen.xscale)**2 + (diff[1]*screen.yscale)**2
322497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            nhops = 1+int((diffsq**0.5)/(3*(1.1**self._speed)*self._speed))
322597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            delta = diff * (1.0/nhops)
322697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for n in range(1, nhops):
322797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if n == 1:
322897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = True
322997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                else:
323097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = False
323197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._position = new + delta * n
323297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if drawing:
323397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawline(self.drawingLineItem,
323497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     (start, self._position),
323597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     pc, ps, top)
323697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._update()
323797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if drawing:
323897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawline(self.drawingLineItem, ((0, 0), (0, 0)),
323997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                               fill="", width=ps)
324097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # Turtle now at position old,
324197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = old
324297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ##  if undo is done during crating a polygon, the last vertex
324397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ##  will be deleted. if the polygon is entirel deleted,
324497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ##  creatigPoly will be set to False.
324597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ##  Polygons created before the last one will not be affected by undo()
324697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._creatingPoly:
324797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if len(self._poly) > 0:
324897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._poly.pop()
324997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._poly == []:
325097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._creatingPoly = False
325197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._poly = None
325297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if filling:
325397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._fillpath == []:
325497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._fillpath = None
325597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                print("Unwahrscheinlich in _undogoto!")
325697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif self._fillpath is not None:
325797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._fillpath.pop()
325897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update() #count=True)
325997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
326097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _rotate(self, angle):
326197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turns pen clockwise by angle.
326297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
326397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
326497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("rot", angle, self._degreesPerAU))
326597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle *= self._degreesPerAU
326697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        neworient = self._orient.rotate(angle)
326797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracing = self.screen._tracing
326897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if tracing == 1 and self._speed > 0:
326997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            anglevel = 3.0 * self._speed
327097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            steps = 1 + int(abs(angle)/anglevel)
327197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            delta = 1.0*angle/steps
327297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for _ in range(steps):
327397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._orient = self._orient.rotate(delta)
327497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._update()
327597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._orient = neworient
327697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
327797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
327897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _newLine(self, usePos=True):
327997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Closes current line item and starts a new one.
328097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           Remark: if current line became too long, animation
328197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           performance (via _drawline) slowed down considerably.
328297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
328397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(self.currentLine) > 1:
328497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawline(self.currentLineItem, self.currentLine,
328597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                      self._pencolor, self._pensize)
328697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLineItem = self.screen._createline()
328797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.append(self.currentLineItem)
328897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
328997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawline(self.currentLineItem, top=True)
329097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = []
329197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if usePos:
329297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLine = [self._position]
3293477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
329497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def filling(self):
329597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return fillstate (True if filling, False else).
3296b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
329797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3298477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
329997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
330097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.begin_fill()
330197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> if turtle.filling():
330297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.pensize(5)
330397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
330497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.pensize(3)
330597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
330697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return isinstance(self._fillpath, list)
330797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3308477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    def begin_fill(self):
330997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Called just before drawing a shape to be filled.
3310477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
331197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
331297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
331397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
331497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("black", "red")
3315477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.begin_fill()
331697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(60)
3317477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.end_fill()
3318477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
331997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not self.filling():
332097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillitem = self.screen._createpoly()
332197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.append(self._fillitem)
332297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillpath = [self._position]
332397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._newLine()
332497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
332597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("beginfill", self._fillitem))
332697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
332797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3328477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3329477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    def end_fill(self):
333097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Fill the shape drawn after the call begin_fill().
3331477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
333297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
333397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
333497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
333597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("black", "red")
3336477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.begin_fill()
333797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(60)
3338477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.end_fill()
3339477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
334097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.filling():
334197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if len(self._fillpath) > 2:
334297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen._drawpoly(self._fillitem, self._fillpath,
334397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                      fill=self._fillcolor)
334497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if self.undobuffer:
334597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.undobuffer.push(("dofill", self._fillitem))
334697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillitem = self._fillpath = None
334797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update()
334897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
334997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def dot(self, size=None, *color):
335097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Draw a dot with diameter size, using color.
335197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
335297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argumentS:
335397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        size -- an integer >= 1 (if given)
335497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color -- a colorstring or a numeric color tuple
335597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
335697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Draw a circular dot with diameter size, using color.
335797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If size is not given, the maximum of pensize+4 and 2*pensize is used.
335897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
335997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
336097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.dot()
336197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50); turtle.dot(20, "blue"); turtle.fd(50)
3362477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
336397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not color:
336497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(size, (str, tuple)):
336597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                color = self._colorstr(size)
336697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                size = self._pensize + max(self._pensize, 4)
336797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
336897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                color = self._pencolor
336997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if not size:
337097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    size = self._pensize + max(self._pensize, 4)
337197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
337297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if size is None:
337397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                size = self._pensize + max(self._pensize, 4)
337497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(color)
337597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if hasattr(self.screen, "_dot"):
337697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = self.screen._dot(self._position, size, color)
337797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.append(item)
337897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self.undobuffer:
337997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.push(("dot", item))
338097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
338197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pen = self.pen()
338297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self.undobuffer:
338397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.push(["seq"])
338497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.cumulate = True
338597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            try:
338697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if self.resizemode() == 'auto':
338797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.ht()
338897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pendown()
338997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pensize(size)
339097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pencolor(color)
339197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.forward(0)
339297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            finally:
339397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pen(pen)
339497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self.undobuffer:
339597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.cumulate = False
339697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
339797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _write(self, txt, align, font):
339897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Performs the writing for write()
339997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
340097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item, end = self.screen._write(self._position, txt, align, font,
340197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                          self._pencolor)
340297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.items.append(item)
340397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
340497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("wri", item))
340597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return end
340697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
340797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def write(self, arg, move=False, align="left", font=("Arial", 8, "normal")):
340897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Write text at the current turtle position.
340997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
341097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
341197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        arg -- info, which is to be written to the TurtleScreen
341297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        move (optional) -- True/False
341397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        align (optional) -- one of the strings "left", "center" or right"
341497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        font (optional) -- a triple (fontname, fontsize, fonttype)
341597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
341697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Write text - the string representation of arg - at the current
341797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle position according to align ("left", "center" or right")
341897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and with the given font.
341997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If move is True, the pen is moved to the bottom-right corner
342097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the text. By default, move is False.
3421477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
342297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
342397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.write('Home = ', True, align="center")
342497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.write((0,0), True)
3425477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
342697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
342797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(["seq"])
342897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = True
342997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        end = self._write(str(arg), align.lower(), font)
343097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if move:
343197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            x, y = self.pos()
343297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.setpos(end, y)
343397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
343497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = False
3435fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
343697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def begin_poly(self):
343797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Start recording the vertices of a polygon.
3438477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
343997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3440477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
344197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Start recording the vertices of a polygon. Current turtle position
344297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is first point of polygon.
3443477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
344497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
344597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.begin_poly()
3446477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
344797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._poly = [self._position]
344897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._creatingPoly = True
3449fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
345097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def end_poly(self):
345197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Stop recording the vertices of a polygon.
3452477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
345397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3454fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
345597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Stop recording the vertices of a polygon. Current turtle position is
345697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        last point of polygon. This will be connected with the first point.
3457477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
345897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
345997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.end_poly()
3460477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
346197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._creatingPoly = False
3462fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
346397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def get_poly(self):
346497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the lastly recorded polygon.
3465477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
346697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
346797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
346897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
346997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> p = turtle.get_poly()
347097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.register_shape("myFavouriteShape", p)
3471477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
3472eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ## check if there is any poly?
347397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._poly is not None:
347497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return tuple(self._poly)
3475fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
347697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def getscreen(self):
347797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the TurtleScreen object, the turtle is drawing  on.
3478477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
347997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3480fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
348197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return the TurtleScreen object, the turtle is drawing  on.
348297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        So TurtleScreen-methods can be called for that object.
3483477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
348497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
348597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> ts = turtle.getscreen()
348697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> ts
348797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        <turtle.TurtleScreen object at 0x0106B770>
348897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> ts.bgcolor("pink")
3489477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
349097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen
3491b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
349297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def getturtle(self):
349397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the Turtleobject itself.
3494477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
349597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
349697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
349797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Only reasonable use: as a function to return the 'anonymous turtle':
3498477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3499477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        Example:
350097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pet = getturtle()
350197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pet.fd(50)
350297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pet
350397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        <turtle.Turtle object at 0x0187D810>
350497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtles()
350597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        [<turtle.Turtle object at 0x0187D810>]
3506477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
350797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self
350897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
350997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    getpen = getturtle
351097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ################################################################
351397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ### screen oriented methods recurring to methods of TurtleScreen
351497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ################################################################
351597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _delay(self, delay=None):
351797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set delay value which determines speed of turtle animation.
351897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
351997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen.delay(delay)
3520477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
352197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onclick(self, fun, btn=1, add=None):
352297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-click event on this turtle on canvas.
3523477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
352497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
352597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun --  a function with two arguments, to which will be assigned
352697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                the coordinates of the clicked point on the canvas.
352797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num --  number of the mouse-button defaults to 1 (left mouse button).
352897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        add --  True or False. If True, new binding will be added, otherwise
352997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                it will replace a former binding.
3530477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
353197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example for the anonymous turtle, i. e. the procedural way:
3532477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
353397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> def turn(x, y):
353497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                left(360)
3535477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
353697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> onclick(turn) # Now clicking into the turtle will turn it.
353797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> onclick(None)  # event-binding will be removed
3538477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
353997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._onclick(self.turtle._item, fun, btn, add)
354097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
354197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
354297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onrelease(self, fun, btn=1, add=None):
354397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-button-release event on this turtle on canvas.
354497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
354597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
354697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with two arguments, to which will be assigned
354797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                the coordinates of the clicked point on the canvas.
354897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num --  number of the mouse-button defaults to 1 (left mouse button).
354997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
355097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a MyTurtle instance named joe):
355197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> class MyTurtle(Turtle):
355297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                def glow(self,x,y):
355397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        self.fillcolor("red")
355497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                def unglow(self,x,y):
355597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        self.fillcolor("")
355697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
355797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> joe = MyTurtle()
355897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> joe.onclick(joe.glow)
355997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> joe.onrelease(joe.unglow)
356097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### clicking on joe turns fillcolor red,
356197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### unclicking turns it to transparent.
356297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
356397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._onrelease(self.turtle._item, fun, btn, add)
356497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
3565477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
356697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def ondrag(self, fun, btn=1, add=None):
356797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-move event on this turtle on canvas.
3568477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
356997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
357097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with two arguments, to which will be assigned
357197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               the coordinates of the clicked point on the canvas.
357297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num -- number of the mouse-button defaults to 1 (left mouse button).
3573477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
357497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Every sequence of mouse-move-events on a turtle is preceded by a
357597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mouse-click event on that turtle.
3576477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
357797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
357897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.ondrag(turtle.goto)
3579477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
358097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### Subsequently clicking and dragging a Turtle will
358197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### move it across the screen thereby producing handdrawings
358297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### (if pen is down).
358397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
358497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._ondrag(self.turtle._item, fun, btn, add)
3585477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3586477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
358797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _undo(self, action, data):
358897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Does the main part of the work for undo()
3589477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
359097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer is None:
35913c7a25a4d9ea07f2aa8e4b70fecd84e33de82c2eGuido van Rossum            return
359297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if action == "rot":
359397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            angle, degPAU = data
359497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._rotate(-angle*degPAU/self._degreesPerAU)
359597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            dummy = self.undobuffer.pop()
359697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "stamp":
359797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = data[0]
359897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.clearstamp(stitem)
359997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "go":
360097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._undogoto(data)
360197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action in ["wri", "dot"]:
360297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = data[0]
360397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._delete(item)
360497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.remove(item)
360597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "dofill":
360697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = data[0]
360797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawpoly(item, ((0, 0),(0, 0),(0, 0)),
360897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                  fill="", outline="")
360997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "beginfill":
361097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = data[0]
361197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillitem = self._fillpath = None
361297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if item in self.items:
361397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen._delete(item)
361497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.items.remove(item)
361597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "pen":
361697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            TPen.pen(self, data[0])
361797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.pop()
361897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
361997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def undo(self):
362097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """undo (repeatedly) the last turtle action.
362197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
362297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
362397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
362497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        undo (repeatedly) the last turtle action.
362597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Number of available undo actions is determined by the size of
362697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the undobuffer.
362797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
362897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
362997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(4):
363097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.fd(50); turtle.lt(80)
363197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
363297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(8):
363397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.undo()
363497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
363597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer is None:
363697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
363797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item = self.undobuffer.pop()
363897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        action = item[0]
363997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        data = item[1:]
364097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if action == "seq":
364197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            while data:
364297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                item = data.pop()
364397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._undo(item[0], item[1:])
364497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
364597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._undo(action, data)
3646b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
364797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    turtlesize = shapesize
3648477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
364997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisRawPen = RawTurtle
3650477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3651601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis###  Screen - Singleton  ########################
3652477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3653601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwisdef Screen():
3654601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    """Return the singleton screen object.
3655601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    If none exists at the moment, create a new one and return it,
3656601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    else return the existing one."""
3657601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    if Turtle._screen is None:
3658601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        Turtle._screen = _Screen()
3659601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    return Turtle._screen
3660601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis
3661601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwisclass _Screen(TurtleScreen):
3662b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
366397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _root = None
366497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _canvas = None
366597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _title = _CFG["title"]
3666d038ca830fd5a6bafbd24b70eb71aeae83d362d3Fred Drake
366797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self):
3668601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # XXX there is no need for this code to be conditional,
3669601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # as there will be only a single _Screen instance, anyway
3670601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # XXX actually, the turtle demo is injecting root window,
3671601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # so perhaps the conditional creation of a root should be
3672601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # preserved (perhaps by passing it as an optional parameter)
3673601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if _Screen._root is None:
3674601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._root = self._root = _Root()
3675601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            self._root.title(_Screen._title)
367697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._root.ondestroy(self._destroy)
3677601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if _Screen._canvas is None:
367897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            width = _CFG["width"]
367997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            height = _CFG["height"]
368097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            canvwidth = _CFG["canvwidth"]
368197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            canvheight = _CFG["canvheight"]
368297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            leftright = _CFG["leftright"]
368397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            topbottom = _CFG["topbottom"]
368497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._root.setupcanvas(width, height, canvwidth, canvheight)
3685601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._canvas = self._root._getcanvas()
3686601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            TurtleScreen.__init__(self, _Screen._canvas)
3687eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self.setup(width, height, leftright, topbottom)
368897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
368997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setup(self, width=_CFG["width"], height=_CFG["height"],
369097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis              startx=_CFG["leftright"], starty=_CFG["topbottom"]):
369197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Set the size and position of the main window.
369297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
369397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
369497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width: as integer a size in pixels, as float a fraction of the screen.
369597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          Default is 50% of screen.
369697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        height: as integer the height in pixels, as float a fraction of the
369797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          screen. Default is 75% of screen.
369897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        startx: if positive, starting position in pixels from the left
369997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          edge of the screen, if negative from the right edge
370097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          Default, startx=None is to center window horizontally.
370197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        starty: if positive, starting position in pixels from the top
370297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          edge of the screen, if negative from the bottom edge
370397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          Default, starty=None is to center window vertically.
370497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
370597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Screen instance named screen):
370697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.setup (width=200, height=200, startx=0, starty=0)
370797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
370897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sets window to 200x200 pixels, in upper left of screen
370997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
371097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.setup(width=.75, height=0.5, startx=None, starty=None)
371197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
371297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sets window to 75% of screen by 50% of screen and centers
371397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
371497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not hasattr(self._root, "set_geometry"):
371597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
371697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sw = self._root.win_width()
371797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sh = self._root.win_height()
371897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(width, float) and 0 <= width <= 1:
371997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            width = sw*width
372097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if startx is None:
372197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            startx = (sw - width) / 2
372297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(height, float) and 0 <= height <= 1:
372397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            height = sh*height
372497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if starty is None:
372597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            starty = (sh - height) / 2
372697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._root.set_geometry(width, height, startx, starty)
3727eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self.update()
372897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
372997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def title(self, titlestring):
373097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set title of turtle-window
373197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
373297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
373397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        titlestring -- a string, to appear in the titlebar of the
373497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                       turtle graphics window.
373597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
373697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This is a method of Screen-class. Not available for TurtleScreen-
373797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        objects.
373897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
373997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Screen instance named screen):
374097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.title("Welcome to the turtle-zoo!")
374197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
3742601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if _Screen._root is not None:
3743601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._root.title(titlestring)
3744601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        _Screen._title = titlestring
3745477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
374697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _destroy(self):
374797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        root = self._root
3748601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if root is _Screen._root:
374997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Turtle._pen = None
375097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Turtle._screen = None
3751601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._root = None
3752601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._canvas = None
375397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TurtleScreen._RUNNING = True
375497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        root.destroy()
3755477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
375697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def bye(self):
375797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Shut the turtlegraphics window.
3758477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
375997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
376097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bye()
376197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
376297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._destroy()
3763477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
376497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def exitonclick(self):
376597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Go into mainloop until the mouse is clicked.
3766477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
376797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
3768477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
376997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Bind bye() method to mouseclick on TurtleScreen.
377097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If "using_IDLE" - value in configuration dictionary is False
377197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (default value), enter mainloop.
377297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If IDLE with -n switch (no subprocess) is used, this value should be
377397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        set to True in turtle.cfg. In this case IDLE's mainloop
377497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is active also for the client script.
3775477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
377697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This is a method of the Screen-class and not available for
377797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TurtleScreen instances.
3778477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
377997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Screen instance named screen):
378097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.exitonclick()
3781477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
378297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
378397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        def exitGracefully(x, y):
378497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            """Screen.bye() with two dummy-parameters"""
378597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.bye()
378697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.onclick(exitGracefully)
378797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if _CFG["using_IDLE"]:
378897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
378997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
379097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            mainloop()
379197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except AttributeError:
379297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            exit(0)
3793477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3794477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
379597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass Turtle(RawTurtle):
379697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """RawTurtle auto-crating (scrolled) canvas.
3797477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
379897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    When a Turtle object is created or a function derived from some
379997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Turtle method is called a TurtleScreen object is automatically created.
380097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
380197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _pen = None
380297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _screen = None
380397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
380497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self,
380597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 shape=_CFG["shape"],
380697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 undobuffersize=_CFG["undobuffersize"],
380797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 visible=_CFG["visible"]):
380897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if Turtle._screen is None:
380997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Turtle._screen = Screen()
381097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        RawTurtle.__init__(self, Turtle._screen,
381197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           shape=shape,
381297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           undobuffersize=undobuffersize,
381397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           visible=visible)
381497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
381597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisPen = Turtle
3816477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
381797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _getpen():
381897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Create the 'anonymous' turtle if not already present."""
381997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if Turtle._pen is None:
382097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turtle._pen = Turtle()
382197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return Turtle._pen
382297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
382397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _getscreen():
382497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Create a TurtleScreen if not already present."""
382597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if Turtle._screen is None:
382697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turtle._screen = Screen()
382797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return Turtle._screen
382897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
382997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef write_docstringdict(filename="turtle_docstringdict"):
383097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Create and write docstring-dictionary to file.
383197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
383297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Optional argument:
383397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    filename -- a string, used as filename
383497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                default value is turtle_docstringdict
383597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
383697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Has to be called explicitely, (not used by the turtle-graphics classes)
383797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    The docstring dictionary will be written to the Python script <filname>.py
383897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    It is intended to serve as a template for translation of the docstrings
383997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    into different languages.
384097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
384197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    docsdict = {}
384297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
384397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for methodname in _tg_screen_functions:
3844601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        key = "_Screen."+methodname
384597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        docsdict[key] = eval(key).__doc__
384697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for methodname in _tg_turtle_functions:
384797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        key = "Turtle."+methodname
384897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        docsdict[key] = eval(key).__doc__
384997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
385097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f = open("%s.py" % filename,"w")
385197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    keys = sorted([x for x in docsdict.keys()
385297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        if x.split('.')[1] not in _alias_list])
385397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write('docsdict = {\n\n')
385497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for key in keys[:-1]:
385597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        f.write('%s :\n' % repr(key))
385697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        f.write('        """%s\n""",\n\n' % docsdict[key])
385797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    key = keys[-1]
385897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write('%s :\n' % repr(key))
385997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write('        """%s\n"""\n\n' % docsdict[key])
386097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write("}\n")
386197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.close()
386297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
386397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef read_docstrings(lang):
386497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Read in docstrings from lang-specific docstring dictionary.
386597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
386697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Transfer docstrings, translated to lang, from a dictionary-file
386797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    to the methods of classes Screen and Turtle and - in revised form -
386897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    to the corresponding functions.
386997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
387097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    modname = "turtle_docstringdict_%(language)s" % {'language':lang.lower()}
387197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    module = __import__(modname)
387297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    docsdict = module.docsdict
387397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for key in docsdict:
387497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
387597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#            eval(key).im_func.__doc__ = docsdict[key]
387697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            eval(key).__doc__ = docsdict[key]
387797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except:
387897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            print("Bad docstring-entry: %s" % key)
387997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
388097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_LANGUAGE = _CFG["language"]
388197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
388297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwistry:
388397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if _LANGUAGE != "english":
388497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        read_docstrings(_LANGUAGE)
388597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisexcept ImportError:
388697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    print("Cannot find docsdict for", _LANGUAGE)
388797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisexcept:
388897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    print ("Unknown Error when trying to import %s-docstring-dictionary" %
388997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                                  _LANGUAGE)
389097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
389197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
389297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef getmethparlist(ob):
389397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    "Get strings describing the arguments for the given object"
389497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText1 = argText2 = ""
389597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    # bit of a hack for methods - turn it into a function
389697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    # but we drop the "self" param.
389797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    # Try and build one for Python defined functions
389897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argOffset = 1
389997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    counter = ob.__code__.co_argcount
390097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    items2 = list(ob.__code__.co_varnames[argOffset:counter])
390197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    realArgs = ob.__code__.co_varnames[argOffset:counter]
390297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defaults = ob.__defaults__ or []
390397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defaults = list(map(lambda name: "=%s" % repr(name), defaults))
390497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defaults = [""] * (len(realArgs)-len(defaults)) + defaults
390597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    items1 = list(map(lambda arg, dflt: arg+dflt, realArgs, defaults))
390697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if ob.__code__.co_flags & 0x4:
390797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items1.append("*"+ob.__code__.co_varnames[counter])
390897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items2.append("*"+ob.__code__.co_varnames[counter])
390997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        counter += 1
391097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if ob.__code__.co_flags & 0x8:
391197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items1.append("**"+ob.__code__.co_varnames[counter])
391297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items2.append("**"+ob.__code__.co_varnames[counter])
391397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText1 = ", ".join(items1)
391497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText1 = "(%s)" % argText1
391597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText2 = ", ".join(items2)
391697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText2 = "(%s)" % argText2
391797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return argText1, argText2
391897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
391997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _turtle_docrevise(docstr):
392097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """To reduce docstrings from RawTurtle class for functions
3921477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    """
392297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    import re
392397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if docstr is None:
392497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return None
392597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    turtlename = _CFG["exampleturtle"]
392697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = docstr.replace("%s." % turtlename,"")
392797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    parexp = re.compile(r' \(.+ %s\):' % turtlename)
392897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = parexp.sub(":", newdocstr)
392997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return newdocstr
393097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
393197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _screen_docrevise(docstr):
393297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """To reduce docstrings from TurtleScreen class for functions
393397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
393497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    import re
393597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if docstr is None:
393697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return None
393797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    screenname = _CFG["examplescreen"]
393897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = docstr.replace("%s." % screenname,"")
393997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    parexp = re.compile(r' \(.+ %s\):' % screenname)
394097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = parexp.sub(":", newdocstr)
394197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return newdocstr
394297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
394397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## The following mechanism makes all methods of RawTurtle and Turtle available
394497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## as functions. So we can enhance, change, add, delete methods to these
394597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## classes and do not need to change anything here.
394697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
394797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
394897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisfor methodname in _tg_screen_functions:
3949601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    pl1, pl2 = getmethparlist(eval('_Screen.' + methodname))
395097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if pl1 == "":
395197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        print(">>>>>>", pl1, pl2)
395297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        continue
395397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defstr = ("def %(key)s%(pl1)s: return _getscreen().%(key)s%(pl2)s" %
395497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                   {'key':methodname, 'pl1':pl1, 'pl2':pl2})
395597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    exec(defstr)
3956601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    eval(methodname).__doc__ = _screen_docrevise(eval('_Screen.'+methodname).__doc__)
395797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
395897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisfor methodname in _tg_turtle_functions:
395997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    pl1, pl2 = getmethparlist(eval('Turtle.' + methodname))
396097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if pl1 == "":
396197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        print(">>>>>>", pl1, pl2)
396297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        continue
396397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defstr = ("def %(key)s%(pl1)s: return _getpen().%(key)s%(pl2)s" %
396497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                   {'key':methodname, 'pl1':pl1, 'pl2':pl2})
396597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    exec(defstr)
396697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    eval(methodname).__doc__ = _turtle_docrevise(eval('Turtle.'+methodname).__doc__)
396797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
396897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3969eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandldone = mainloop
397097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
397197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisif __name__ == "__main__":
397297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def switchpen():
397397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isdown():
397497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pu()
397597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
397697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pd()
3977477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
397897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def demo1():
397997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Demo of old turtle.py - module"""
398097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        reset()
398197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracer(True)
3982b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        up()
398397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        backward(100)
3984b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        down()
398597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # draw 3 squares; the last filled
398697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width(3)
398797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(3):
398897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if i == 2:
398997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                begin_fill()
399097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for _ in range(4):
399197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                forward(20)
399297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                left(90)
399397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if i == 2:
399497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                color("maroon")
399597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                end_fill()
3996477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters            up()
399797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(30)
3998477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters            down()
399997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width(1)
400097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color("black")
400197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # move out of the way
400297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracer(False)
400397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        up()
40040e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters        right(90)
400597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        forward(100)
40060e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters        right(90)
400797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        forward(100)
400897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        right(180)
400997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        down()
401097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # some text
401197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        write("startstart", 1)
401297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        write("start", 1)
401397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color("red")
401497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # staircase
401597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(5):
401697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
401797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            left(90)
401897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
401997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            right(90)
402097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # filled staircase
402197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracer(True)
402297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        begin_fill()
402397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(5):
402497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
402597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            left(90)
402697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
402797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            right(90)
402897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        end_fill()
402997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # more text
403097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
403197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def demo2():
403297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Demo of some new features."""
403397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed(1)
403497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        st()
403597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pensize(3)
403697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        setheading(towards(0, 0))
403797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        radius = distance(0, 0)/2.0
403897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rt(90)
403997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for _ in range(18):
404097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            switchpen()
404197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            circle(radius, 10)
404297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        write("wait a moment...")
404397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        while undobufferentries():
404497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            undo()
404597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        reset()
404697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(90)
404797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        colormode(255)
404897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        laenge = 10
404997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pencolor("green")
405097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pensize(3)
405197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(180)
405297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(-2, 16):
405397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if i > 0:
405497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                begin_fill()
405597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fillcolor(255-15*i, 0, 15*i)
405697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for _ in range(3):
405797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fd(laenge)
405897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                lt(120)
405997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            end_fill()
406097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            laenge += 10
406197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            lt(15)
406297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed((speed()+1)%12)
406397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        #end_fill()
406497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
406597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(120)
406697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pu()
406797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fd(70)
406897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rt(30)
406997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pd()
407097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color("red","yellow")
407197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed(0)
407297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        begin_fill()
407397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for _ in range(4):
407497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            circle(50, 90)
407597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            rt(90)
407697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            fd(30)
407797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            rt(90)
407897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        end_fill()
407997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(90)
408097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pu()
408197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fd(30)
408297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pd()
408397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        shape("turtle")
408497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
408597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri = getturtle()
408697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.resizemode("auto")
408797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle = Turtle()
408897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.resizemode("auto")
408997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.shape("turtle")
409097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.reset()
409197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.left(90)
409297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.speed(0)
409397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.up()
409497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.goto(280, 40)
409597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.lt(30)
409697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.down()
409797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.speed(6)
409897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.color("blue","orange")
409997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.pensize(2)
410097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.speed(6)
4101477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        setheading(towards(turtle))
410297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        count = 1
410397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        while tri.distance(turtle) > 4:
410497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.fd(3.5)
410597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.lt(0.6)
410697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tri.setheading(tri.towards(turtle))
410797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tri.fd(4)
410897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if count % 20 == 0:
410997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.stamp()
411097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                tri.stamp()
411197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                switchpen()
411297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            count += 1
411397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.write("CAUGHT! ", font=("Arial", 16, "bold"), align="right")
411497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.pencolor("black")
411597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.pencolor("red")
411697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
411797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        def baba(xdummy, ydummy):
411897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            clearscreen()
411997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            bye()
412097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
412197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        time.sleep(2)
412297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
412397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        while undobufferentries():
412497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tri.undo()
412597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.undo()
412697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.fd(50)
412797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.write("  Click me!", font = ("Courier", 12, "bold") )
412897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.onclick(baba, 1)
412997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
413097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    demo1()
4131477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    demo2()
413297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    exitonclick()
4133