turtle.py revision 13925008dc11f2a235627dc8c0440c0ce99171d9
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#
5ffeda291153942f643f2a73c6f1dde563c614e42Benjamin Peterson# Copyright (C) 2006 - 2010  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',
1291e8cbe36cc2455296d38f927d1ab54b93d894881Georg 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        >>> """
7555468f4ff10e4c5b13ae45e5d1be4f07b05c73048Alexander Belopolsky        cl = 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
7819b0e9180e220cb455881de9f4d922a4e2ce0435fFlorent Xicluna        if canvwidth is canvheight is 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        """
10499b0e9180e220cb455881de9f4d922a4e2ce0435fFlorent Xicluna        if mode is 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        """
13889b0e9180e220cb455881de9f4d922a4e2ce0435fFlorent Xicluna        if fun is 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        """
14219b0e9180e220cb455881de9f4d922a4e2ce0435fFlorent Xicluna        if fun is 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
146742da663e6fe7ecbb89b17d596c76812a91bb99a4Ezio Melotti        If picname is a filename, set the corresponding 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
149113925008dc11f2a235627dc8c0440c0ce99171d9Ezio Melotti        bg -- colorstring or color-tuple, 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        """
15439b0e9180e220cb455881de9f4d922a4e2ce0435fFlorent Xicluna        if mode is 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
157896d1eb1ec8a1c4116bd4deb95439d794a71ff0bdAlexander Belopolsky
157996d1eb1ec8a1c4116bd4deb95439d794a71ff0bdAlexander Belopolsky        Change angle measurement unit to grad (also known as gon,
158096d1eb1ec8a1c4116bd4deb95439d794a71ff0bdAlexander Belopolsky        grade, or gradian and equals 1/100-th of the right angle.)
158196d1eb1ec8a1c4116bd4deb95439d794a71ff0bdAlexander Belopolsky        >>> turtle.degrees(400.0)
158297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
158397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        100
158497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
158597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
158697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setDegreesPerAU(fullcircle)
158797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
158897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def radians(self):
158997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Set the angle measurement units to radians.
159097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
159197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
159297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
159397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
159497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
159597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        90
159697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.radians()
159797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
159897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        1.5707963267948966
159997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
160097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setDegreesPerAU(2*math.pi)
160197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
160297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _go(self, distance):
160397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """move turtle forward by specified distance"""
160497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ende = self._position + self._orient * distance
160597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._goto(ende)
160697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
160797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _rotate(self, angle):
160897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turn turtle counterclockwise by specified angle if angle > 0."""
160997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle *= self._degreesPerAU
161097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._orient = self._orient.rotate(angle)
161197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
161297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _goto(self, end):
161397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """move turtle to position end."""
161497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = end
161597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
161697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def forward(self, distance):
161797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move the turtle forward by the specified distance.
161897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
161997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: forward | fd
162097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
162197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
162297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        distance -- a number (integer or float)
162397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
162497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Move the turtle forward by the specified distance, in the direction
162597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the turtle is headed.
162697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
162797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
162897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
162997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
163097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(25)
163197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
163297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (25.00,0.00)
163397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(-75)
163497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
163597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (-50.00,0.00)
163697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
163797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._go(distance)
163897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
163997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def back(self, distance):
164097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move the turtle backward by distance.
164197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
164297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: back | backward | bk
164397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
164497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
164597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        distance -- a number
164697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
164797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Move the turtle backward by distance ,opposite to the direction the
164897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle is headed. Do not change the turtle's heading.
164997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
165097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
165197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
165297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
165397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.backward(30)
165497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
165597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (-30.00, 0.00)
165697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
165797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._go(-distance)
165897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
165997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def right(self, angle):
166097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turn turtle right by angle units.
166197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
166297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: right | rt
166397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
166497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
166597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle -- a number (integer or float)
166697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
166797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turn turtle right by angle units. (Units are by default degrees,
166897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        but can be set via the degrees() and radians() functions.)
166997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Angle orientation depends on mode. (See this.)
167097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
167197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
167297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
167397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        22.0
167497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.right(45)
167597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
167697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        337.0
167797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
167897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(-angle)
167997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def left(self, angle):
168197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turn turtle left by angle units.
168297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: left | lt
168497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
168697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle -- a number (integer or float)
168797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
168897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turn turtle left by angle units. (Units are by default degrees,
168997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        but can be set via the degrees() and radians() functions.)
169097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Angle orientation depends on mode. (See this.)
169197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
169297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
169397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
169497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        22.0
169597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(45)
169697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
169797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        67.0
169897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
169997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(angle)
170097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pos(self):
170297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the turtle's current location (x,y), as a Vec2D-vector.
170397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: pos | position
170597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
170797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
170897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
170997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
171097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 240.00)
171197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
171297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._position
171397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
171497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def xcor(self):
171597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the turtle's x coordinate.
171697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
171797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
171897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
171997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
172097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> reset()
172197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(60)
172297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(100)
172397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> print turtle.xcor()
172497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        50.0
172597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
172697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._position[0]
172797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
172897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def ycor(self):
172997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the turtle's y coordinate
173097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ---
173197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
173297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
173397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
173497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> reset()
173597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(60)
173697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.forward(100)
173797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> print turtle.ycor()
173897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        86.6025403784
173997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
174097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._position[1]
174197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def goto(self, x, y=None):
174497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move turtle to an absolute position.
174597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: setpos | setposition | goto:
174797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
174897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
174997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number      or     a pair/vector of numbers
175097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number             None
175197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
175297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: goto(x, y)         # two coordinates
175397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: goto((x, y))       # a pair (tuple) of coordinates
175497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: goto(vec)          # e.g. as returned by pos()
175597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
175697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Move turtle to an absolute position. If the pen is down,
175797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        a line will be drawn. The turtle's orientation does not change.
175897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
175997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
176097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> tp = turtle.pos()
176197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> tp
176297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
176397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setpos(60,30)
176497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
176597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (60.00,30.00)
176697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setpos((20,80))
176797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
176897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (20.00,80.00)
176997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setpos(tp)
177097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
177197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00,0.00)
177297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
177397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if y is None:
177497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._goto(Vec2D(*x))
177597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
177697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._goto(Vec2D(x, y))
177797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
177897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def home(self):
177997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move turtle to the origin - coordinates (0,0).
178097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
178197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
178297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
1783f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        Move turtle to the origin - coordinates (0,0) and set its
1784f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        heading to its start-orientation (which depends on mode).
178597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
178697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
178797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.home()
178897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
178997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.goto(0, 0)
179097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.setheading(0)
179197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
179297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setx(self, x):
179397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set the turtle's first coordinate to x
179497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
179597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
179697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number (integer or float)
179797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
179897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the turtle's first coordinate to x, leave second coordinate
179997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        unchanged.
180097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
180197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
180297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
180397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 240.00)
180497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setx(10)
180597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
180697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (10.00, 240.00)
180797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
180897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._goto(Vec2D(x, self._position[1]))
180997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def sety(self, y):
181197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set the turtle's second coordinate to y
181297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
181497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number (integer or float)
181597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the turtle's first coordinate to x, second coordinate remains
181797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        unchanged.
181897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
181997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
182097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
182197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 40.00)
182297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.sety(-10)
182397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.position()
182497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, -10.00)
182597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
182697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._goto(Vec2D(self._position[0], y))
182797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
182897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def distance(self, x, y=None):
182997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the distance from the turtle to (x,y) in turtle step units.
183097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
183197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
183297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number   or  a pair/vector of numbers   or   a turtle instance
183397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number       None                            None
183497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
183597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: distance(x, y)         # two coordinates
183697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance((x, y))       # a pair (tuple) of coordinates
183797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(vec)          # e.g. as returned by pos()
183897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(mypen)        # where mypen is another turtle
183997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
184097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
184197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
184297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00, 0.00)
184397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.distance(30,40)
184497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        50.0
184597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pen = Turtle()
184697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pen.forward(77)
184797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.distance(pen)
184897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        77.0
184997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
185097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if y is not None:
185197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(x, y)
185297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(x, Vec2D):
185397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x
185497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, tuple):
185597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(*x)
185697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, TNavigator):
185797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x._position
185897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return abs(pos - self._position)
185997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
186097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def towards(self, x, y=None):
186197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the angle of the line from the turtle's position to (x, y).
186297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
186397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
186497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x -- a number   or  a pair/vector of numbers   or   a turtle instance
186597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        y -- a number       None                            None
186697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
186797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: distance(x, y)         # two coordinates
186897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance((x, y))       # a pair (tuple) of coordinates
186997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(vec)          # e.g. as returned by pos()
187097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: distance(mypen)        # where mypen is another turtle
187197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
187297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return the angle, between the line from turtle-position to position
187397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        specified by x, y and the turtle's start orientation. (Depends on
187497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        modes - "standard" or "logo")
187597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
187697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
187797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pos()
187897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (10.00, 10.00)
187997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.towards(0,0)
188097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        225.0
188197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
188297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if y is not None:
188397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(x, y)
188497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(x, Vec2D):
188597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x
188697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, tuple):
188797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = Vec2D(*x)
188897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(x, TNavigator):
188997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pos = x._position
189097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x, y = pos - self._position
189197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result = round(math.atan2(y, x)*180.0/math.pi, 10) % 360.0
189297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result /= self._degreesPerAU
189397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return (self._angleOffset + self._angleOrient*result) % self._fullcircle
189497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
189597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def heading(self):
189697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return the turtle's current heading.
189797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
189897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
189997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
190097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
190197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.left(67)
190297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
190397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        67.0
190497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
190597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        x, y = self._orient
190697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result = round(math.atan2(y, x)*180.0/math.pi, 10) % 360.0
190797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        result /= self._degreesPerAU
190897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return (self._angleOffset + self._angleOrient*result) % self._fullcircle
190997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setheading(self, to_angle):
191197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set the orientation of the turtle to to_angle.
191297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases:  setheading | seth
191497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
191697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        to_angle -- a number (integer or float)
191797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
191897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the orientation of the turtle to to_angle.
191997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Here are some common directions in degrees:
192097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
192197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         standard - mode:          logo-mode:
192297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        -------------------|--------------------
192397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           0 - east                0 - north
192497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          90 - north              90 - east
192597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         180 - west              180 - south
192697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis         270 - south             270 - west
192797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
192897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
192997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setheading(90)
193097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.heading()
193197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        90
193297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
193397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle = (to_angle - self.heading())*self._angleOrient
193497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        full = self._fullcircle
193597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle = (angle+full/2.)%full - full/2.
193697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(angle)
193797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
193897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def circle(self, radius, extent = None, steps = None):
193997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Draw a circle with given radius.
194097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
194197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
194297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        radius -- a number
194397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        extent (optional) -- a number
194497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        steps (optional) -- an integer
194597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
194697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Draw a circle with given radius. The center is radius units left
194797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the turtle; extent - an angle - determines which part of the
194897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        circle is drawn. If extent is not given, draw the entire circle.
194997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If extent is not a full circle, one endpoint of the arc is the
195097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        current pen position. Draw the arc in counterclockwise direction
195197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if radius is positive, otherwise in clockwise direction. Finally
195297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the direction of the turtle is changed by the amount of extent.
195397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
195497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        As the circle is approximated by an inscribed regular polygon,
195597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        steps determines the number of steps to use. If not given,
195697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        it will be calculated automatically. Maybe used to draw regular
195797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        polygons.
195897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
195997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        call: circle(radius)                  # full circle
196097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: circle(radius, extent)          # arc
196197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: circle(radius, extent, steps)
196297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        --or: circle(radius, steps=6)         # 6-sided polygon
196397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
196497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
196597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(50)
196697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(120, 180)  # semicircle
196797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
196897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
196997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(["seq"])
197097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = True
197197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed = self.speed()
197297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if extent is None:
197397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            extent = self._fullcircle
197497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if steps is None:
197597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            frac = abs(extent)/self._fullcircle
197697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            steps = 1+int(min(11+abs(radius)/6.0, 59.0)*frac)
197797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        w = 1.0 * extent / steps
197897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        w2 = 0.5 * w
197997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        l = 2.0 * radius * math.sin(w2*math.pi/180.0*self._degreesPerAU)
198097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if radius < 0:
198197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            l, w, w2 = -l, -w, -w2
198297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tr = self._tracer()
198397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        dl = self._delay()
198497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed == 0:
198597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._tracer(0, 0)
198697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
198797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.speed(0)
198897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(w2)
198997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(steps):
199097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.speed(speed)
199197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._go(l)
199297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.speed(0)
199397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._rotate(w)
199497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._rotate(-w2)
199597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed == 0:
199697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._tracer(tr, dl)
199797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.speed(speed)
199897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
199997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = False
200097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
200197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## three dummy methods to be implemented by child class:
200297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
200397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def speed(self, s=0):
200497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
200597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _tracer(self, a=None, b=None):
200697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
200797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _delay(self, n=None):
200897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
200997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
201097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    fd = forward
201197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    bk = back
201297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    backward = back
201397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    rt = right
201497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    lt = left
201597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    position = pos
201697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    setpos = goto
201797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    setposition = goto
201897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    seth = setheading
201997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
202097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
202197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass TPen(object):
202297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Drawing part of the RawTurtle.
202397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Implements drawing properties.
202497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
202597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, resizemode=_CFG["resizemode"]):
202697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._resizemode = resizemode # or "user" or "noresize"
202797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer = None
202897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TPen._reset(self)
202997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
203097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _reset(self, pencolor=_CFG["pencolor"],
203197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     fillcolor=_CFG["fillcolor"]):
203297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._pensize = 1
203397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._shown = True
203497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._pencolor = pencolor
203597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillcolor = fillcolor
203697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._drawing = True
203797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._speed = 3
2038eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._stretchfactor = (1., 1.)
2039eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shearfactor = 0.
2040eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._tilt = 0.
2041eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shapetrafo = (1., 0., 0., 1.)
204297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._outlinewidth = 1
204397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
204497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def resizemode(self, rmode=None):
204597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set resizemode to one of the values: "auto", "user", "noresize".
204697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
204797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (Optional) Argument:
204897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rmode -- one of the strings "auto", "user", "noresize"
204997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
205097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Different resizemodes have the following effects:
205197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - "auto" adapts the appearance of the turtle
205297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   corresponding to the value of pensize.
205397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - "user" adapts the appearance of the turtle according to the
205497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   values of stretchfactor and outlinewidth (outline),
205597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                   which are set by shapesize()
205697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - "noresize" no adaption of the turtle's appearance takes place.
205797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If no argument is given, return current resizemode.
205897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        resizemode("user") is called by a call of shapesize with arguments.
205997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
206097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
206197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
206297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.resizemode("noresize")
206397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.resizemode()
206497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'noresize'
206597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
206697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if rmode is None:
206797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._resizemode
206897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rmode = rmode.lower()
206997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if rmode in ["auto", "user", "noresize"]:
207097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(resizemode=rmode)
207197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
207297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pensize(self, width=None):
207397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set or return the line thickness.
207497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
207597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases:  pensize | width
207697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
207797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
207897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width -- positive number
207997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
208097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the line thickness to width or return it. If resizemode is set
208197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        to "auto" and turtleshape is a polygon, that polygon is drawn with
208297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the same line thickness. If no argument is given, current pensize
208397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is returned.
208497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
208597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
208697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pensize()
208797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        1
208897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.pensize(10)   # from here on lines of width 10 are drawn
208997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
209097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if width is None:
209197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._pensize
209297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(pensize=width)
209397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def penup(self):
209697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Pull the pen up -- no drawing when moving.
209797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
209897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: penup | pu | up
209997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
210097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument
210197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
210297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
210397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.penup()
210497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
210597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not self._drawing:
210697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
210797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(pendown=False)
210897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
210997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pendown(self):
211097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Pull the pen down -- drawing when moving.
211197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
211297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: pendown | pd | down
211397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
211497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
211597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
211697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
211797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pendown()
211897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
211997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._drawing:
212097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
212197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(pendown=True)
212297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
212397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def isdown(self):
212497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return True if pen is down, False if it's up.
212597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
212697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
212797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
212897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
212997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.penup()
213097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.isdown()
213197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        False
213297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pendown()
213397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.isdown()
213497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        True
213597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
213697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._drawing
213797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
213897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def speed(self, speed=None):
213997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the turtle's speed.
214097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
214197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
214297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed -- an integer in the range 0..10 or a speedstring (see below)
214397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
214497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set the turtle's speed to an integer value in the range 0 .. 10.
214597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If no argument is given: return current speed.
214697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
214797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If input is a number greater than 10 or smaller than 0.5,
214897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed is set to 0.
214997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Speedstrings  are mapped to speedvalues in the following way:
215097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'fastest' :  0
215197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'fast'    :  10
215297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'normal'  :  6
215397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'slow'    :  3
215497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            'slowest' :  1
215597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speeds from 1 to 10 enforce increasingly faster animation of
215697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        line drawing and turtle turning.
215797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
215897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Attention:
215997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed = 0 : *no* animation takes place. forward/back makes turtle jump
216097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and likewise left/right make the turtle turn instantly.
216197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
216297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
216397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.speed(3)
216497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
216597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speeds = {'fastest':0, 'fast':10, 'normal':6, 'slow':3, 'slowest':1 }
216697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed is None:
216797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._speed
216897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if speed in speeds:
216997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed = speeds[speed]
217097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif 0.5 < speed < 10.5:
217197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed = int(round(speed))
217297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
217397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed = 0
217497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(speed=speed)
217597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
217697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def color(self, *args):
217797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return or set the pencolor and fillcolor.
217897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
217997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
218097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Several input formats are allowed.
218197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        They use 0, 1, 2, or 3 arguments as follows:
218297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
218397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color()
218497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Return the current pencolor and the current fillcolor
218597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            as a pair of color specification strings as are returned
218697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            by pencolor and fillcolor.
218797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color(colorstring), color((r,g,b)), color(r,g,b)
218897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            inputs as in pencolor, set both, fillcolor and pencolor,
218997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            to the given value.
219097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color(colorstring1, colorstring2),
219197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color((r1,g1,b1), (r2,g2,b2))
219297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            equivalent to pencolor(colorstring1) and fillcolor(colorstring2)
219397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            and analogously, if the other input format is used.
219497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
219597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If turtleshape is a polygon, outline and interior of that polygon
219697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is drawn with the newly set colors.
219797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        For mor info see: pencolor, fillcolor
219897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
219997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
220097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color('red', 'green')
220197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color()
220297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ('red', 'green')
220397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> colormode(255)
220497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> color((40, 80, 120), (160, 200, 240))
220597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> color()
220697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ('#285078', '#a0c8f0')
220797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
220897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
220997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            l = len(args)
221097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if l == 1:
221197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pcolor = fcolor = args[0]
221297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif l == 2:
221397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pcolor, fcolor = args
221497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif l == 3:
221597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                pcolor = fcolor = args
221697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pcolor = self._colorstr(pcolor)
221797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            fcolor = self._colorstr(fcolor)
221897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(pencolor=pcolor, fillcolor=fcolor)
221997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
222097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._color(self._pencolor), self._color(self._fillcolor)
222197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
222297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pencolor(self, *args):
222397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the pencolor.
222497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
222597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
222697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Four input formats are allowed:
222797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor()
222897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Return the current pencolor as color specification string,
222997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            possibly in hex-number format (see example).
223097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            May be used as input to another color/pencolor/fillcolor call.
223197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor(colorstring)
223297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            s is a Tk color specification string, such as "red" or "yellow"
223397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor((r, g, b))
223497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            *a tuple* of r, g, and b, which represent, an RGB color,
223597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            and each of r, g, and b are in the range 0..colormode,
223697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            where colormode is either 1.0 or 255
223797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - pencolor(r, g, b)
223897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, and b represent an RGB color, and each of r, g, and b
223997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            are in the range 0..colormode
224097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
224197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If turtleshape is a polygon, the outline of that polygon is drawn
224297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        with the newly set pencolor.
224397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
224497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
224597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor('brown')
224697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> tup = (0.2, 0.8, 0.55)
224797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor(tup)
224897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pencolor()
224997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        '#33cc8c'
225097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
225197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
225297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(args)
225397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if color == self._pencolor:
225497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return
225597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(pencolor=color)
225697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
225797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._color(self._pencolor)
225897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
225997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def fillcolor(self, *args):
226097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Return or set the fillcolor.
226197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
226297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
226397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Four input formats are allowed:
226497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor()
226597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Return the current fillcolor as color specification string,
226697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            possibly in hex-number format (see example).
226797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            May be used as input to another color/pencolor/fillcolor call.
226897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor(colorstring)
226997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            s is a Tk color specification string, such as "red" or "yellow"
227097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor((r, g, b))
227197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            *a tuple* of r, g, and b, which represent, an RGB color,
227297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            and each of r, g, and b are in the range 0..colormode,
227397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            where colormode is either 1.0 or 255
227497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          - fillcolor(r, g, b)
227597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, and b represent an RGB color, and each of r, g, and b
227697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            are in the range 0..colormode
227797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
227897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If turtleshape is a polygon, the interior of that polygon is drawn
227997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        with the newly set fillcolor.
228097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
228197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
228297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fillcolor('violet')
228397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> col = turtle.pencolor()
228497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fillcolor(col)
228597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fillcolor(0, .5, 0)
228697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
228797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if args:
228897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(args)
228997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if color == self._fillcolor:
229097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                return
229197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.pen(fillcolor=color)
229297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
229397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self._color(self._fillcolor)
229497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
229597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def showturtle(self):
229697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Makes the turtle visible.
229797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
229897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: showturtle | st
229997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
230097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
230197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
230297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
230397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.hideturtle()
230497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.showturtle()
230597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
230697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(shown=True)
230797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
230897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def hideturtle(self):
230997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Makes the turtle invisible.
231097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Aliases: hideturtle | ht
231297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
231497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        It's a good idea to do this while you're in the
231697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        middle of a complicated drawing, because hiding
231797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the turtle speeds up the drawing observably.
231897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
231997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
232097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.hideturtle()
2321477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
232297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(shown=False)
2323b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
232497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def isvisible(self):
232597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return True if the Turtle is shown, False if it's hidden.
2326477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
232797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
232897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
232997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
233097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.hideturtle()
233197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> print turtle.isvisible():
233297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        False
2333477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
233497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self._shown
233597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
233697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def pen(self, pen=None, **pendict):
233797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return or set the pen's attributes.
233897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
233997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
234097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pen -- a dictionary with some or all of the below listed keys.
234197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            **pendict -- one or more keyword-arguments with the below
234297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                         listed keys as keywords.
234397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
234497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return or set the pen's attributes in a 'pen-dictionary'
234597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        with the following key/value pairs:
234697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "shown"      :   True/False
234797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "pendown"    :   True/False
234897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "pencolor"   :   color-string or color-tuple
234997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "fillcolor"  :   color-string or color-tuple
235097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "pensize"    :   positive number
235197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "speed"      :   number in range 0..10
235297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "resizemode" :   "auto" or "user" or "noresize"
235397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "stretchfactor": (positive number, positive number)
2354eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl           "shearfactor":   number
235597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "outline"    :   positive number
235697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           "tilt"       :   number
235797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2358f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        This dictionary can be used as argument for a subsequent
235997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pen()-call to restore the former pen-state. Moreover one
236097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        or more of these attributes can be provided as keyword-arguments.
236197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This can be used to set several pen attributes in one statement.
236297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
236397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
236497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
236597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pen(fillcolor="black", pencolor="red", pensize=10)
236697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pen()
236797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        {'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,
236897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pencolor': 'red', 'pendown': True, 'fillcolor': 'black',
2369eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}
237097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> penstate=turtle.pen()
237197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("yellow","")
237297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.penup()
237397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.pen()
237497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        {'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,
237597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pencolor': 'yellow', 'pendown': False, 'fillcolor': '',
2376eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}
237797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> p.pen(penstate, fillcolor="green")
237897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> p.pen()
237997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        {'pensize': 10, 'shown': True, 'resizemode': 'auto', 'outline': 1,
238097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'pencolor': 'red', 'pendown': True, 'fillcolor': 'green',
2381eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        'stretchfactor': (1,1), 'speed': 3, 'shearfactor': 0.0}
238297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
238397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        _pd =  {"shown"         : self._shown,
238497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "pendown"       : self._drawing,
238597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "pencolor"      : self._pencolor,
238697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "fillcolor"     : self._fillcolor,
238797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "pensize"       : self._pensize,
238897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "speed"         : self._speed,
238997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "resizemode"    : self._resizemode,
239097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "stretchfactor" : self._stretchfactor,
2391eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                "shearfactor"   : self._shearfactor,
239297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "outline"       : self._outlinewidth,
239397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                "tilt"          : self._tilt
239497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               }
239597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
239697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not (pen or pendict):
239797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return _pd
239897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
239997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(pen, dict):
240097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            p = pen
240197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
240297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            p = {}
240397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        p.update(pendict)
240497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
240597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        _p_buf = {}
240697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for key in p:
240797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            _p_buf[key] = _pd[key]
240897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
240997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
241097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("pen", _p_buf))
241197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
241297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        newLine = False
241397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pendown" in p:
241497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._drawing != p["pendown"]:
241597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newLine = True
241697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pencolor" in p:
241797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(p["pencolor"], tuple):
241897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                p["pencolor"] = self._colorstr((p["pencolor"],))
241997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._pencolor != p["pencolor"]:
242097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newLine = True
242197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pensize" in p:
242297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._pensize != p["pensize"]:
242397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                newLine = True
242497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if newLine:
242597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._newLine()
242697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pendown" in p:
242797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._drawing = p["pendown"]
242897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pencolor" in p:
242997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._pencolor = p["pencolor"]
243097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "pensize" in p:
243197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._pensize = p["pensize"]
243297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "fillcolor" in p:
243397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(p["fillcolor"], tuple):
243497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                p["fillcolor"] = self._colorstr((p["fillcolor"],))
243597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillcolor = p["fillcolor"]
243697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "speed" in p:
243797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._speed = p["speed"]
243897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "resizemode" in p:
243997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._resizemode = p["resizemode"]
244097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "stretchfactor" in p:
244197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            sf = p["stretchfactor"]
244297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(sf, (int, float)):
244397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                sf = (sf, sf)
244497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._stretchfactor = sf
2445eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if "shearfactor" in p:
2446eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self._shearfactor = p["shearfactor"]
244797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "outline" in p:
244897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._outlinewidth = p["outline"]
244997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "shown" in p:
245097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._shown = p["shown"]
245197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if "tilt" in p:
245297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._tilt = p["tilt"]
2453eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if "stretchfactor" in p or "tilt" in p or "shearfactor" in p:
2454eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            scx, scy = self._stretchfactor
2455eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            shf = self._shearfactor
2456eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            sa, ca = math.sin(self._tilt), math.cos(self._tilt)
2457eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self._shapetrafo = ( scx*ca, scy*(shf*ca + sa),
2458eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                -scx*sa, scy*(ca - shf*sa))
245997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
246097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
246197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## three dummy methods to be implemented by child class:
246297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
246397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _newLine(self, usePos = True):
246497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update(self, count=True, forced=False):
246697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _color(self, args):
246897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
246997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _colorstr(self, args):
247097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """dummy method - to be overwritten by child class"""
247197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
247297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    width = pensize
247397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    up = penup
247497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    pu = penup
247597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    pd = pendown
247697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    down = pendown
247797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    st = showturtle
247897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ht = hideturtle
247997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
248097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
248197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass _TurtleImage(object):
248297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Helper class: Datatype to store Turtle attributes
248397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
248497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
248597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, screen, shapeIndex):
248697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen = screen
248797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._type = None
248897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._setshape(shapeIndex)
248997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
249097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _setshape(self, shapeIndex):
2491eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        screen = self.screen
249297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.shapeIndex = shapeIndex
249397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type == "polygon" == screen._shapes[shapeIndex]._type:
249497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
249597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type == "image" == screen._shapes[shapeIndex]._type:
249697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
249797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type in ["image", "polygon"]:
249897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._delete(self._item)
249997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif self._type == "compound":
250097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for item in self._item:
250197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._delete(item)
250297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._type = screen._shapes[shapeIndex]._type
250397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._type == "polygon":
250497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._item = screen._createpoly()
250597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif self._type == "image":
250697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._item = screen._createimage(screen._shapes["blank"]._data)
250797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif self._type == "compound":
250897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._item = [screen._createpoly() for item in
250997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                          screen._shapes[shapeIndex]._data]
251097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
251197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
251297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass RawTurtle(TPen, TNavigator):
251397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Animation part of the RawTurtle.
251497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Puts RawTurtle upon a TurtleScreen and provides tools for
2515f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson    its animation.
251697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
251797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    screens = []
251897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
251997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self, canvas=None,
252097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 shape=_CFG["shape"],
252197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 undobuffersize=_CFG["undobuffersize"],
252297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 visible=_CFG["visible"]):
2523601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if isinstance(canvas, _Screen):
252497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen = canvas
252597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(canvas, TurtleScreen):
252697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if canvas not in RawTurtle.screens:
252797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                RawTurtle.screens.append(canvas)
252897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen = canvas
252997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif isinstance(canvas, (ScrolledCanvas, Canvas)):
253097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for screen in RawTurtle.screens:
253197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if screen.cv == canvas:
253297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.screen = screen
253397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    break
253497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
253597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen = TurtleScreen(canvas)
253697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                RawTurtle.screens.append(self.screen)
253797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
253897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad cavas argument %s" % canvas)
253997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
254097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
254197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TNavigator.__init__(self, screen.mode())
254297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TPen.__init__(self)
254397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen._turtles.append(self)
254497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.drawingLineItem = screen._createline()
254597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle = _TurtleImage(screen, shape)
254697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._poly = None
254797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._creatingPoly = False
254897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillitem = self._fillpath = None
254997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._shown = visible
255097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._hidden_from_screen = False
255197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLineItem = screen._createline()
255297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = [self._position]
255397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.items = [self.currentLineItem]
255497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.stampItems = []
255597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._undobuffersize = undobuffersize
255697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer = Tbuffer(undobuffersize)
255797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
2558b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2559b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum    def reset(self):
2560f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Delete the turtle's drawings and restore its default values.
2561477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
256297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
256397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis,
256497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Delete the turtle's drawings from the screen, re-center the turtle
256597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and set variables to the default values.
256697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
256797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
2568477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.position()
256997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00,-22.00)
2570477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.heading()
2571477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        100.0
2572477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.reset()
2573477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.position()
257497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (0.00,0.00)
2575477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.heading()
2576477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        0.0
2577477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
257897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TNavigator.reset(self)
257997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TPen._reset(self)
258097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._clear()
258197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._drawturtle()
258297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
2583b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
258497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setundobuffer(self, size):
258597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set or disable undobuffer.
2586477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
258797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
258897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        size -- an integer or None
25893c7a25a4d9ea07f2aa8e4b70fecd84e33de82c2eGuido van Rossum
259097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If size is an integer an empty undobuffer of given size is installed.
259197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Size gives the maximum number of turtle-actions that can be undone
259297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        by the undo() function.
259397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If size is None, no undobuffer is present.
2594477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
259597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
259697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.setundobuffer(42)
2597477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
259897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if size is None:
259997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer = None
260097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
260197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer = Tbuffer(size)
2602b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
260397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def undobufferentries(self):
260497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return count of entries in the undobuffer.
2605477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
260697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
260797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
260897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
260997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> while undobufferentries():
261097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                undo()
2611477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
261297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer is None:
261397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return 0
261497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.undobuffer.nr_of_items()
261597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
261697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _clear(self):
261797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete all of pen's drawings"""
261897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillitem = self._fillpath = None
261997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for item in self.items:
262097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._delete(item)
262197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLineItem = self.screen._createline()
262297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = []
262397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._drawing:
262497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLine.append(self._position)
262597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.items = [self.currentLineItem]
262697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.clearstamps()
262797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.setundobuffer(self._undobuffersize)
2628b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2629477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
263097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clear(self):
263197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete the turtle's drawings from the screen. Do not move turtle.
2632477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
263397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
2634b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
263597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Delete the turtle's drawings from the screen. Do not move turtle.
263697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        State and position of the turtle as well as drawings of other
263797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtles are not affected.
2638477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
263997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
264097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clear()
264197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
264297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._clear()
264397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
2644477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
264597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update_data(self):
264697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._incrementudc()
264797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.screen._updatecounter != 0:
264897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
264997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(self.currentLine)>1:
265097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawline(self.currentLineItem, self.currentLine,
265197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                  self._pencolor, self._pensize)
265297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
265397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _update(self):
265497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Perform a Turtle-data update.
2655477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
265697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
265797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if screen._tracing == 0:
265897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
265997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif screen._tracing == 1:
266097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update_data()
266197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._drawturtle()
266297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._update()                  # TurtleScreenBase
266397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._delay(screen._delayvalue) # TurtleScreenBase
266497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
266597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update_data()
266697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if screen._updatecounter == 0:
266797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for t in screen.turtles():
266897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    t._drawturtle()
266997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._update()
267097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
267197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _tracer(self, flag=None, delay=None):
267297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turns turtle animation on/off and set delay for update drawings.
267397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
267497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional arguments:
267597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        n -- nonnegative  integer
267697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        delay -- nonnegative  integer
267797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
267897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If n is given, only each n-th regular screen update is really performed.
267997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (Can be used to accelerate the drawing of complex graphics.)
268097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Second arguments sets delay value (see RawTurtle.delay())
268197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
268297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
268397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tracer(8, 25)
268497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> dist = 2
268597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(200):
268697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.fd(dist)
268797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.rt(90)
268897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                dist += 2
268997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
269097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen.tracer(flag, delay)
2691b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
269297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _color(self, args):
269397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen._color(args)
2694477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
269597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _colorstr(self, args):
269697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen._colorstr(args)
2697477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
269897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _cc(self, args):
269997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Convert colortriples to hexstrings.
2700477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
270197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(args, str):
270297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return args
270397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
270497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, b = args
270597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except:
270697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad color arguments: %s" % str(args))
270797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.screen._colormode == 1.0:
270897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            r, g, b = [round(255.0*x) for x in (r, g, b)]
270997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not ((0 <= r <= 255) and (0 <= g <= 255) and (0 <= b <= 255)):
271097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("bad color sequence: %s" % str(args))
271197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return "#%02x%02x%02x" % (r, g, b)
2712b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
271397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clone(self):
271497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Create and return a clone of the turtle.
2715477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
271697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
2717b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
271897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Create and return a clone of the turtle with same position, heading
271997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and turtle properties.
2720477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
272197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named mick):
272297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mick = Turtle()
272397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        joe = mick.clone()
272497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
272597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
272697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._newLine(self._drawing)
272797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
272897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle = self.turtle
272997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen = None
273097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle = None  # too make self deepcopy-able
273197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
273297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q = deepcopy(self)
273397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
273497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen = screen
273597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle = turtle
273697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
273797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q.screen = screen
273897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q.turtle = _TurtleImage(screen, self.turtle.shapeIndex)
273997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
274097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen._turtles.append(q)
274197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ttype = screen._shapes[self.turtle.shapeIndex]._type
274297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if ttype == "polygon":
274397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            q.turtle._item = screen._createpoly()
274497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "image":
274597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            q.turtle._item = screen._createimage(screen._shapes["blank"]._data)
274697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "compound":
274797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            q.turtle._item = [screen._createpoly() for item in
274897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                              screen._shapes[self.turtle.shapeIndex]._data]
274997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q.currentLineItem = screen._createline()
275097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        q._update()
275197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return q
275297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
275397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def shape(self, name=None):
275497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set turtle shape to shape with given name / return current shapename.
275597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
275697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
275797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        name -- a string, which is a valid shapename
275897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
275997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set turtle shape to shape with given name or, if name is not given,
276097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return name of current shape.
276197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Shape with name must exist in the TurtleScreen's shape dictionary.
276297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Initially there are the following polygon shapes:
276397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic'.
276497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        To learn about how to deal with shapes see Screen-method register_shape.
276597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
276697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
276797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape()
276897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'arrow'
276997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("turtle")
277097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape()
277197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        'turtle'
277297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
277397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if name is None:
277497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return self.turtle.shapeIndex
277597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not name in self.screen.getshapes():
277697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            raise TurtleGraphicsError("There is no shape named %s" % name)
277797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.turtle._setshape(name)
277897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
277997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
278097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def shapesize(self, stretch_wid=None, stretch_len=None, outline=None):
278197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set/return turtle's stretchfactors/outline. Set resizemode to "user".
278297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
278397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optinonal arguments:
278497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           stretch_wid : positive number
278597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           stretch_len : positive number
278697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           outline  : positive number
278797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
278897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return or set the pen's attributes x/y-stretchfactors and/or outline.
278997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Set resizemode to "user".
279097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If and only if resizemode is set to "user", the turtle will be displayed
279197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stretched according to its stretchfactors:
279297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stretch_wid is stretchfactor perpendicular to orientation
279397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stretch_len is stretchfactor in direction of turtles orientation.
279497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        outline determines the width of the shapes's outline.
279597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
279697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
279797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.resizemode("user")
279897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5, 5, 12)
279997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(outline=8)
280097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
28019b0e9180e220cb455881de9f4d922a4e2ce0435fFlorent Xicluna        if stretch_wid is stretch_len is outline is None:
280297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stretch_wid, stretch_len = self._stretchfactor
280397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return stretch_wid, stretch_len, self._outlinewidth
2804eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if stretch_wid == 0 or stretch_len == 0:
2805eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            raise TurtleGraphicsError("stretch_wid/stretch_len must not be zero")
280697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if stretch_wid is not None:
280797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if stretch_len is None:
280897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                stretchfactor = stretch_wid, stretch_wid
280997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
281097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                stretchfactor = stretch_wid, stretch_len
281197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif stretch_len is not None:
281297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stretchfactor = self._stretchfactor[0], stretch_len
281397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
281497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stretchfactor = self._stretchfactor
281597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if outline is None:
281697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            outline = self._outlinewidth
281797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(resizemode="user",
281897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 stretchfactor=stretchfactor, outline=outline)
281997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2820eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def shearfactor(self, shear=None):
2821eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Set or return the current shearfactor.
2822eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2823eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Optional argument: shear -- number, tangent of the shear angle
2824eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2825eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Shear the turtleshape according to the given shearfactor shear,
2826eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        which is the tangent of the shear angle. DO NOT change the
2827eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        turtle's heading (direction of movement).
2828eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If shear is not given: return the current shearfactor, i. e. the
2829eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        tangent of the shear angle, by which lines parallel to the
2830eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        heading of the turtle are sheared.
2831eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2832eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Examples (for a Turtle instance named turtle):
2833eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shape("circle")
2834eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapesize(5,2)
2835eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shearfactor(0.5)
2836eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shearfactor()
2837eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> 0.5
2838eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2839eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if shear is None:
2840eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return self._shearfactor
2841eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self.pen(resizemode="user", shearfactor=shear)
2842eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
284397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def settiltangle(self, angle):
284497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Rotate the turtleshape to point in the specified direction
284597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2846eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Argument: angle -- number
284797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
284897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Rotate the turtleshape to point in the direction specified by angle,
284997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        regardless of its current tilt-angle. DO NOT change the turtle's
285097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        heading (direction of movement).
285197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
285297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
285397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
285497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("circle")
285597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5,2)
285697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.settiltangle(45)
285797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> stamp()
285897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
285997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.settiltangle(-45)
286097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> stamp()
286197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
2862477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
286397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tilt = -angle * self._degreesPerAU * self._angleOrient
286497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tilt = (tilt * math.pi / 180.0) % (2*math.pi)
286597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.pen(resizemode="user", tilt=tilt)
2866b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2867eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def tiltangle(self, angle=None):
2868eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Set or return the current tilt-angle.
2869477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
2870eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Optional argument: angle -- number
2871eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2872eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Rotate the turtleshape to point in the direction specified by angle,
2873eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        regardless of its current tilt-angle. DO NOT change the turtle's
2874eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        heading (direction of movement).
2875eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If angle is not given: return the current tilt-angle, i. e. the angle
2876eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        between the orientation of the turtleshape and the heading of the
2877eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        turtle (its direction of movement).
2878b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
2879eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Deprecated since Python 3.1
2880477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
288197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
288297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("circle")
288397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5,2)
288497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tilt(45)
288597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tiltangle()
288697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>>
288797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
2888eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if angle is None:
2889eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            tilt = -self._tilt * (180.0/math.pi) * self._angleOrient
2890eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return (tilt / self._degreesPerAU) % self._fullcircle
2891eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        else:
2892eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self.settiltangle(angle)
2893477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
289497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def tilt(self, angle):
289597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Rotate the turtleshape by angle.
2896477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
289797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
289897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle - a number
2899477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
290097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Rotate the turtleshape by angle from its current tilt-angle,
290197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        but do NOT change the turtle's heading (direction of movement).
2902477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
290397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Turtle instance named turtle):
290497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shape("circle")
290597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.shapesize(5,2)
290697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tilt(30)
290797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
290897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.tilt(30)
290997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
291097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
291197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.settiltangle(angle + self.tiltangle())
2912477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
2913eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def shapetransform(self, t11=None, t12=None, t21=None, t22=None):
2914eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Set or return the current transformation matrix of the turtle shape.
2915eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2916eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Optional arguments: t11, t12, t21, t22 -- numbers.
2917eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2918eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        If none of the matrix elements are given, return the transformation
2919eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        matrix.
2920eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Otherwise set the given elements and transform the turtleshape
2921eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        according to the matrix consisting of first row t11, t12 and
2922eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        second row t21, 22.
2923eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Modify stretchfactor, shearfactor and tiltangle according to the
2924eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        given matrix.
2925eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2926eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Examples (for a Turtle instance named turtle):
2927eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shape("square")
2928eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapesize(4,2)
2929eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shearfactor(-0.5)
2930eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapetransform()
2931eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> (4.0, -1.0, -0.0, 2.0)
2932eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2933eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t11 is t12 is t21 is t22 is None:
2934eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return self._shapetrafo
2935eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        m11, m12, m21, m22 = self._shapetrafo
2936eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t11 is not None: m11 = t11
2937eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t12 is not None: m12 = t12
2938eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t21 is not None: m21 = t21
2939eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t22 is not None: m22 = t22
2940eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if t11 * t22 - t12 * t21 == 0:
2941eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            raise TurtleGraphicsError("Bad shape transform matrix: must not be singular")
2942eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shapetrafo = (m11, m12, m21, m22)
2943eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        alfa = math.atan2(-m21, m11) % (2 * math.pi)
2944eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        sa, ca = math.sin(alfa), math.cos(alfa)
2945eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        a11, a12, a21, a22 = (ca*m11 - sa*m21, ca*m12 - sa*m22,
2946eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                              sa*m11 + ca*m21, sa*m12 + ca*m22)
2947eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._stretchfactor = a11, a22
2948eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._shearfactor = a12/a22
2949eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._tilt = alfa
2950eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self._update()
2951eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2952eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
295397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _polytrafo(self, poly):
295497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Computes transformed polygon shapes from a shape
295597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        according to current position and heading.
295697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
295797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
295897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        p0, p1 = self._position
295997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        e0, e1 = self._orient
296097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        e = Vec2D(e0, e1 * screen.yscale / screen.xscale)
296197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        e0, e1 = (1.0 / abs(e)) * e
296297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return [(p0+(e1*x+e0*y)/screen.xscale, p1+(-e0*x+e1*y)/screen.yscale)
296397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                           for (x, y) in poly]
296497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
2965eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def get_shapepoly(self):
2966eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Return the current shape polygon as tuple of coordinate pairs.
2967eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2968eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        No argument.
2969eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2970eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        Examples (for a Turtle instance named turtle):
2971eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shape("square")
2972eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.shapetransform(4, -1, 0, 2)
2973eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        >>> turtle.get_shapepoly()
2974eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ((50, -20), (30, 20), (-50, 20), (-30, -20))
2975eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2976eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2977eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        shape = self.screen._shapes[self.turtle.shapeIndex]
2978eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if shape._type == "polygon":
2979eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return self._getshapepoly(shape._data, shape._type == "compound")
2980eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        # else return None
2981eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
2982eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl    def _getshapepoly(self, polygon, compound=False):
2983eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """Calculate transformed shape polygon according to resizemode
2984eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        and shapetransform.
2985eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        """
2986eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        if self._resizemode == "user" or compound:
2987eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            t11, t12, t21, t22 = self._shapetrafo
2988eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        elif self._resizemode == "auto":
2989eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            l = max(1, self._pensize/5.0)
2990eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            t11, t12, t21, t22 = l, 0, 0, l
2991eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        elif self._resizemode == "noresize":
2992eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            return polygon
2993eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        return tuple([(t11*x + t12*y, t21*x + t22*y) for (x, y) in polygon])
2994eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl
299597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _drawturtle(self):
299697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Manages the correct rendering of the turtle with respect to
2997934896dc0977ea25dc37c13117525f2394625ceeMark Dickinson        its shape, resizemode, stretch and tilt etc."""
299897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
299997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        shape = screen._shapes[self.turtle.shapeIndex]
300097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ttype = shape._type
300197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        titem = self.turtle._item
300297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._shown and screen._updatecounter == 0 and screen._tracing > 0:
300397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._hidden_from_screen = False
300497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tshape = shape._data
300597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if ttype == "polygon":
3006eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                if self._resizemode == "noresize": w = 1
3007eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                elif self._resizemode == "auto": w = self._pensize
3008eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                else: w =self._outlinewidth
3009eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                shape = self._polytrafo(self._getshapepoly(tshape))
301097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fc, oc = self._fillcolor, self._pencolor
301197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawpoly(titem, shape, fill=fc, outline=oc,
301297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                      width=w, top=True)
301397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "image":
301497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawimage(titem, self._position, tshape)
301597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "compound":
301697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for item, (poly, fc, oc) in zip(titem, tshape):
3017eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                    poly = self._polytrafo(self._getshapepoly(poly, True))
301897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawpoly(item, poly, fill=self._cc(fc),
3019eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                     outline=self._cc(oc), width=self._outlinewidth, top=True)
302097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
302197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._hidden_from_screen:
3022b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum                return
302397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if ttype == "polygon":
302497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawpoly(titem, ((0, 0), (0, 0), (0, 0)), "", "")
302597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "image":
302697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawimage(titem, self._position,
302797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                          screen._shapes["blank"]._data)
302897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif ttype == "compound":
302997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for item in titem:
303097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawpoly(item, ((0, 0), (0, 0), (0, 0)), "", "")
303197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._hidden_from_screen = True
303297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis##############################  stamp stuff  ###############################
303497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def stamp(self):
3036f8798f579b7fde2a4f0e9f3484b25bae4aa13eefMark Dickinson        """Stamp a copy of the turtleshape onto the canvas and return its id.
303797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
303897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
303997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
304097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Stamp a copy of the turtle shape onto the canvas at the current
304197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle position. Return a stamp_id for that stamp, which can be
304297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        used to delete it by calling clearstamp(stamp_id).
304397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
304497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
304597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("blue")
304697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.stamp()
304797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        13
304897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
304997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
305097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
305197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        shape = screen._shapes[self.turtle.shapeIndex]
305297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ttype = shape._type
305397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tshape = shape._data
305497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if ttype == "polygon":
305597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = screen._createpoly()
3056eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            if self._resizemode == "noresize": w = 1
3057eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            elif self._resizemode == "auto": w = self._pensize
3058eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            else: w =self._outlinewidth
3059eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            shape = self._polytrafo(self._getshapepoly(tshape))
306097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            fc, oc = self._fillcolor, self._pencolor
306197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._drawpoly(stitem, shape, fill=fc, outline=oc,
306297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                  width=w, top=True)
306397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "image":
306497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = screen._createimage("")
306597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._drawimage(stitem, self._position, tshape)
306697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif ttype == "compound":
306797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = []
306897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for element in tshape:
306997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                item = screen._createpoly()
307097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                stitem.append(item)
307197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = tuple(stitem)
307297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for item, (poly, fc, oc) in zip(stitem, tshape):
3073eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                poly = self._polytrafo(self._getshapepoly(poly, True))
307497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawpoly(item, poly, fill=self._cc(fc),
3075eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl                                 outline=self._cc(oc), width=self._outlinewidth, top=True)
307697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.stampItems.append(stitem)
307797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.undobuffer.push(("stamp", stitem))
307897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return stitem
307997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
308097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _clearstamp(self, stampid):
308197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """does the work for clearstamp() and clearstamps()
308297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
308397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if stampid in self.stampItems:
308497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(stampid, tuple):
308597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                for subitem in stampid:
308697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.screen._delete(subitem)
308797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
308897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen._delete(stampid)
308997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.stampItems.remove(stampid)
309097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # Delete stampitem from undobuffer if necessary
309197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # if clearstamp is called directly.
309297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item = ("stamp", stampid)
309397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        buf = self.undobuffer
309497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if item not in buf.buffer:
309597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
309697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        index = buf.buffer.index(item)
309797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        buf.buffer.remove(item)
309897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if index <= buf.ptr:
309997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            buf.ptr = (buf.ptr - 1) % buf.bufsize
310097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        buf.buffer.insert((buf.ptr+1)%buf.bufsize, [None])
310197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
310297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clearstamp(self, stampid):
310397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete stamp with given stampid
310497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
310597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
310697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        stampid - an integer, must be return value of previous stamp() call.
310797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
310897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
310997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("blue")
311097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> astamp = turtle.stamp()
311197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50)
311297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamp(astamp)
311397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
311497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._clearstamp(stampid)
311597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
311697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
311797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def clearstamps(self, n=None):
311897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Delete all or first/last n of turtle's stamps.
311997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
312097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Optional argument:
312197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        n -- an integer
312297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
312397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If n is None, delete all of pen's stamps,
312497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else if n > 0 delete first n stamps
312597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else if n < 0 delete last n stamps.
312697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
312797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
312897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(8):
312997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.stamp(); turtle.fd(30)
313097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ...
313197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamps(2)
313297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamps(-2)
313397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.clearstamps()
313497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
313597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if n is None:
313697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            toDelete = self.stampItems[:]
313797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif n >= 0:
313897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            toDelete = self.stampItems[:n]
3139b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        else:
314097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            toDelete = self.stampItems[n:]
314197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for item in toDelete:
314297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._clearstamp(item)
314397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
314497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
314597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _goto(self, end):
314697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Move the pen to the point end, thereby drawing a line
314797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if pen is down. All other methodes for turtle movement depend
314897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        on this one.
314997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
315097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ## Version mit undo-stuff
315197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        go_modes = ( self._drawing,
315297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     self._pencolor,
315397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     self._pensize,
315497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                     isinstance(self._fillpath, list))
315597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
315697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        undo_entry = ("go", self._position, end, go_modes,
315797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      (self.currentLineItem,
315897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      self.currentLine[:],
315997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      screen._pointlist(self.currentLineItem),
316097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      self.items[:])
316197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                      )
316297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
316397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(undo_entry)
316497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        start = self._position
316597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._speed and screen._tracing == 1:
316697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diff = (end-start)
316797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diffsq = (diff[0]*screen.xscale)**2 + (diff[1]*screen.yscale)**2
316897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            nhops = 1+int((diffsq**0.5)/(3*(1.1**self._speed)*self._speed))
316997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            delta = diff * (1.0/nhops)
317097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for n in range(1, nhops):
317197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if n == 1:
317297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = True
317397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                else:
317497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = False
317597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._position = start + delta * n
317697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if self._drawing:
317797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawline(self.drawingLineItem,
317897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     (start, self._position),
317997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     self._pencolor, self._pensize, top)
318097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._update()
318197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._drawing:
318297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawline(self.drawingLineItem, ((0, 0), (0, 0)),
318397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                               fill="", width=self._pensize)
318497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # Turtle now at end,
318597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._drawing: # now update currentLine
318697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLine.append(end)
318797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(self._fillpath, list):
318897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillpath.append(end)
318997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ######    vererbung!!!!!!!!!!!!!!!!!!!!!!
319097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = end
319197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._creatingPoly:
319297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._poly.append(end)
319397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(self.currentLine) > 42: # 42! answer to the ultimate question
319497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                       # of life, the universe and everything
319597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._newLine()
319697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update() #count=True)
319797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
319897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _undogoto(self, entry):
319997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Reverse a _goto. Used for undo()
320097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
320197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        old, new, go_modes, coodata = entry
320297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        drawing, pc, ps, filling = go_modes
320397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        cLI, cL, pl, items = coodata
320497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen = self.screen
320597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if abs(self._position - new) > 0.5:
320697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            print ("undogoto: HALLO-DA-STIMMT-WAS-NICHT!")
320797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # restore former situation
320897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLineItem = cLI
320997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = cL
321097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
321197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if pl == [(0, 0), (0, 0)]:
321297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            usepc = ""
321397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
321497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            usepc = pc
321597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        screen._drawline(cLI, pl, fill=usepc, width=ps)
321697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
321797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        todelete = [i for i in self.items if (i not in items) and
321897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                       (screen._type(i) == "line")]
321997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in todelete:
322097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            screen._delete(i)
322197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.remove(i)
322297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
322397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        start = old
322497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._speed and screen._tracing == 1:
322597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diff = old - new
322697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            diffsq = (diff[0]*screen.xscale)**2 + (diff[1]*screen.yscale)**2
322797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            nhops = 1+int((diffsq**0.5)/(3*(1.1**self._speed)*self._speed))
322897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            delta = diff * (1.0/nhops)
322997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for n in range(1, nhops):
323097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if n == 1:
323197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = True
323297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                else:
323397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    top = False
323497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._position = new + delta * n
323597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if drawing:
323697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    screen._drawline(self.drawingLineItem,
323797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     (start, self._position),
323897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                     pc, ps, top)
323997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._update()
324097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if drawing:
324197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                screen._drawline(self.drawingLineItem, ((0, 0), (0, 0)),
324297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                               fill="", width=ps)
324397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # Turtle now at position old,
324497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._position = old
324513925008dc11f2a235627dc8c0440c0ce99171d9Ezio Melotti        ##  if undo is done during creating a polygon, the last vertex
324613925008dc11f2a235627dc8c0440c0ce99171d9Ezio Melotti        ##  will be deleted. if the polygon is entirely deleted,
324713925008dc11f2a235627dc8c0440c0ce99171d9Ezio Melotti        ##  creatingPoly will be set to False.
324897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ##  Polygons created before the last one will not be affected by undo()
324997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._creatingPoly:
325097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if len(self._poly) > 0:
325197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._poly.pop()
325297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._poly == []:
325397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._creatingPoly = False
325497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._poly = None
325597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if filling:
325697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self._fillpath == []:
325797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._fillpath = None
325897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                print("Unwahrscheinlich in _undogoto!")
325997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            elif self._fillpath is not None:
326097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._fillpath.pop()
326197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update() #count=True)
326297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
326397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _rotate(self, angle):
326497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Turns pen clockwise by angle.
326597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
326697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
326797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("rot", angle, self._degreesPerAU))
326897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        angle *= self._degreesPerAU
326997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        neworient = self._orient.rotate(angle)
327097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracing = self.screen._tracing
327197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if tracing == 1 and self._speed > 0:
327297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            anglevel = 3.0 * self._speed
327397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            steps = 1 + int(abs(angle)/anglevel)
327497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            delta = 1.0*angle/steps
327597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for _ in range(steps):
327697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._orient = self._orient.rotate(delta)
327797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._update()
327897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._orient = neworient
327997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
328097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
328197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _newLine(self, usePos=True):
328297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Closes current line item and starts a new one.
328397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           Remark: if current line became too long, animation
328497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis           performance (via _drawline) slowed down considerably.
328597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
328697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if len(self.currentLine) > 1:
328797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawline(self.currentLineItem, self.currentLine,
328897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                      self._pencolor, self._pensize)
328997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLineItem = self.screen._createline()
329097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.append(self.currentLineItem)
329197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
329297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawline(self.currentLineItem, top=True)
329397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.currentLine = []
329497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if usePos:
329597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.currentLine = [self._position]
3296477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
329797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def filling(self):
329897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return fillstate (True if filling, False else).
3299b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
330097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3301477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
330297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
330397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.begin_fill()
330497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> if turtle.filling():
330597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.pensize(5)
330697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
330797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.pensize(3)
330897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
330997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return isinstance(self._fillpath, list)
331097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3311477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    def begin_fill(self):
331297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Called just before drawing a shape to be filled.
3313477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
331497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
331597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
331697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
331797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("black", "red")
3318477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.begin_fill()
331997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(60)
3320477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.end_fill()
3321477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
332297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not self.filling():
332397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillitem = self.screen._createpoly()
332497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.append(self._fillitem)
332597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._fillpath = [self._position]
332697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._newLine()
332797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
332897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("beginfill", self._fillitem))
332997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
333097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3331477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3332477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    def end_fill(self):
333397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Fill the shape drawn after the call begin_fill().
3334477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
333597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
333697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
333797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
333897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.color("black", "red")
3339477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.begin_fill()
334097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.circle(60)
3341477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        >>> turtle.end_fill()
3342477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
334397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.filling():
334497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if len(self._fillpath) > 2:
334597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen._drawpoly(self._fillitem, self._fillpath,
334697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                      fill=self._fillcolor)
334797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if self.undobuffer:
334897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.undobuffer.push(("dofill", self._fillitem))
334997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillitem = self._fillpath = None
335097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._update()
335197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
335297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def dot(self, size=None, *color):
335397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Draw a dot with diameter size, using color.
335497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
335542da663e6fe7ecbb89b17d596c76812a91bb99a4Ezio Melotti        Optional arguments:
335697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        size -- an integer >= 1 (if given)
335797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color -- a colorstring or a numeric color tuple
335897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
335997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Draw a circular dot with diameter size, using color.
336097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If size is not given, the maximum of pensize+4 and 2*pensize is used.
336197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
336297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
336397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.dot()
336497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.fd(50); turtle.dot(20, "blue"); turtle.fd(50)
3365477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
336697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not color:
336797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if isinstance(size, (str, tuple)):
336897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                color = self._colorstr(size)
336997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                size = self._pensize + max(self._pensize, 4)
337097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            else:
337197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                color = self._pencolor
337297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if not size:
337397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    size = self._pensize + max(self._pensize, 4)
337497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
337597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if size is None:
337697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                size = self._pensize + max(self._pensize, 4)
337797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            color = self._colorstr(color)
337897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if hasattr(self.screen, "_dot"):
337997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = self.screen._dot(self._position, size, color)
338097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.append(item)
338197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self.undobuffer:
338297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.push(("dot", item))
338397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
338497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pen = self.pen()
338597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self.undobuffer:
338697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.push(["seq"])
338797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.cumulate = True
338897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            try:
338997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                if self.resizemode() == 'auto':
339097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                    self.ht()
339197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pendown()
339297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pensize(size)
339397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pencolor(color)
339497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.forward(0)
339597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            finally:
339697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.pen(pen)
339797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if self.undobuffer:
339897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.undobuffer.cumulate = False
339997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
340097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _write(self, txt, align, font):
340197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Performs the writing for write()
340297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
340397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item, end = self.screen._write(self._position, txt, align, font,
340497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                          self._pencolor)
340597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.items.append(item)
340697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
340797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(("wri", item))
340897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return end
340997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
341097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def write(self, arg, move=False, align="left", font=("Arial", 8, "normal")):
341197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Write text at the current turtle position.
341297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
341397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
341497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        arg -- info, which is to be written to the TurtleScreen
341597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        move (optional) -- True/False
341697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        align (optional) -- one of the strings "left", "center" or right"
341797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        font (optional) -- a triple (fontname, fontsize, fonttype)
341897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
341997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Write text - the string representation of arg - at the current
342097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle position according to align ("left", "center" or right")
342197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        and with the given font.
342297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If move is True, the pen is moved to the bottom-right corner
342397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        of the text. By default, move is False.
3424477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
342597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
342697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.write('Home = ', True, align="center")
342797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.write((0,0), True)
3428477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
342997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
343097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.push(["seq"])
343197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = True
343297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        end = self._write(str(arg), align.lower(), font)
343397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if move:
343497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            x, y = self.pos()
343597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.setpos(end, y)
343697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer:
343797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.cumulate = False
3438fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
343997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def begin_poly(self):
344097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Start recording the vertices of a polygon.
3441477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
344297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3443477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
344497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Start recording the vertices of a polygon. Current turtle position
344597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is first point of polygon.
3446477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
344797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
344897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.begin_poly()
3449477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
345097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._poly = [self._position]
345197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._creatingPoly = True
3452fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
345397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def end_poly(self):
345497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Stop recording the vertices of a polygon.
3455477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
345697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3457fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
345897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Stop recording the vertices of a polygon. Current turtle position is
345997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        last point of polygon. This will be connected with the first point.
3460477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
346197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
346297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.end_poly()
3463477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
346497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._creatingPoly = False
3465fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
346697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def get_poly(self):
346797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the lastly recorded polygon.
3468477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
346997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
347097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
347197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
347297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> p = turtle.get_poly()
347397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.register_shape("myFavouriteShape", p)
3474477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
3475eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        ## check if there is any poly?
347697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self._poly is not None:
347797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return tuple(self._poly)
3478fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
347997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def getscreen(self):
348097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the TurtleScreen object, the turtle is drawing  on.
3481477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
348297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
3483fd2ede2aa84e77dac30e297a04fc49dd3bb61c68Guido van Rossum
348497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Return the TurtleScreen object, the turtle is drawing  on.
348597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        So TurtleScreen-methods can be called for that object.
3486477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
348797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
348897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> ts = turtle.getscreen()
348997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> ts
349097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        <turtle.TurtleScreen object at 0x0106B770>
349197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> ts.bgcolor("pink")
3492477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
349397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen
3494b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
349597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def getturtle(self):
349697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Return the Turtleobject itself.
3497477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
349897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
349997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
350097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Only reasonable use: as a function to return the 'anonymous turtle':
3501477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3502477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        Example:
350397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pet = getturtle()
350497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pet.fd(50)
350597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> pet
350697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        <turtle.Turtle object at 0x0187D810>
350797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtles()
350897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        [<turtle.Turtle object at 0x0187D810>]
3509477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
351097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self
351197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    getpen = getturtle
351397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ################################################################
351697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ### screen oriented methods recurring to methods of TurtleScreen
351797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    ################################################################
351897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
351997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _delay(self, delay=None):
352097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set delay value which determines speed of turtle animation.
352197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
352297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return self.screen.delay(delay)
3523477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
352497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onclick(self, fun, btn=1, add=None):
352597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-click event on this turtle on canvas.
3526477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
352797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
352897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun --  a function with two arguments, to which will be assigned
352997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                the coordinates of the clicked point on the canvas.
353097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num --  number of the mouse-button defaults to 1 (left mouse button).
353197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        add --  True or False. If True, new binding will be added, otherwise
353297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                it will replace a former binding.
3533477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
353497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example for the anonymous turtle, i. e. the procedural way:
3535477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
353697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> def turn(x, y):
353797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                left(360)
3538477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
353997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> onclick(turn) # Now clicking into the turtle will turn it.
354097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> onclick(None)  # event-binding will be removed
3541477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
354297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._onclick(self.turtle._item, fun, btn, add)
354397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
354497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
354597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def onrelease(self, fun, btn=1, add=None):
354697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-button-release event on this turtle on canvas.
354797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
354897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
354997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with two arguments, to which will be assigned
355097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                the coordinates of the clicked point on the canvas.
355197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num --  number of the mouse-button defaults to 1 (left mouse button).
355297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
355397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a MyTurtle instance named joe):
355497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> class MyTurtle(Turtle):
355597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                def glow(self,x,y):
355697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        self.fillcolor("red")
355797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                def unglow(self,x,y):
355897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        self.fillcolor("")
355997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
356097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> joe = MyTurtle()
356197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> joe.onclick(joe.glow)
356297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> joe.onrelease(joe.unglow)
356397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### clicking on joe turns fillcolor red,
356497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### unclicking turns it to transparent.
356597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
356697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._onrelease(self.turtle._item, fun, btn, add)
356797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._update()
3568477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
356997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def ondrag(self, fun, btn=1, add=None):
357097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Bind fun to mouse-move event on this turtle on canvas.
3571477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
357297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
357397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fun -- a function with two arguments, to which will be assigned
357497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis               the coordinates of the clicked point on the canvas.
357597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        num -- number of the mouse-button defaults to 1 (left mouse button).
3576477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
357797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Every sequence of mouse-move-events on a turtle is preceded by a
357897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        mouse-click event on that turtle.
3579477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
358097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
358197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> turtle.ondrag(turtle.goto)
3582477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
358397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### Subsequently clicking and dragging a Turtle will
358497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### move it across the screen thereby producing handdrawings
358597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        ### (if pen is down).
358697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
358797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.screen._ondrag(self.turtle._item, fun, btn, add)
3588477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3589477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
359097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _undo(self, action, data):
359197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Does the main part of the work for undo()
3592477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        """
359397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer is None:
35943c7a25a4d9ea07f2aa8e4b70fecd84e33de82c2eGuido van Rossum            return
359597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if action == "rot":
359697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            angle, degPAU = data
359797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._rotate(-angle*degPAU/self._degreesPerAU)
359897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            dummy = self.undobuffer.pop()
359997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "stamp":
360097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            stitem = data[0]
360197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.clearstamp(stitem)
360297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "go":
360397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._undogoto(data)
360497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action in ["wri", "dot"]:
360597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = data[0]
360697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._delete(item)
360797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.items.remove(item)
360897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "dofill":
360997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = data[0]
361097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.screen._drawpoly(item, ((0, 0),(0, 0),(0, 0)),
361197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                  fill="", outline="")
361297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "beginfill":
361397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            item = data[0]
361497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._fillitem = self._fillpath = None
361597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if item in self.items:
361697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.screen._delete(item)
361797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self.items.remove(item)
361897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        elif action == "pen":
361997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            TPen.pen(self, data[0])
362097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.undobuffer.pop()
362197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
362297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def undo(self):
362397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """undo (repeatedly) the last turtle action.
362497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
362597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No argument.
362697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
362797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        undo (repeatedly) the last turtle action.
362897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Number of available undo actions is determined by the size of
362997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        the undobuffer.
363097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
363197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Turtle instance named turtle):
363297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(4):
363397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.fd(50); turtle.lt(80)
363497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
363597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> for i in range(8):
363697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.undo()
363797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
363897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if self.undobuffer is None:
363997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
364097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        item = self.undobuffer.pop()
364197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        action = item[0]
364297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        data = item[1:]
364397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if action == "seq":
364497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            while data:
364597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                item = data.pop()
364697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                self._undo(item[0], item[1:])
364797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
364897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._undo(action, data)
3649b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
365097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    turtlesize = shapesize
3651477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
365297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisRawPen = RawTurtle
3653477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3654601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis###  Screen - Singleton  ########################
3655477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3656601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwisdef Screen():
3657601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    """Return the singleton screen object.
3658601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    If none exists at the moment, create a new one and return it,
3659601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    else return the existing one."""
3660601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    if Turtle._screen is None:
3661601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        Turtle._screen = _Screen()
3662601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    return Turtle._screen
3663601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis
3664601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwisclass _Screen(TurtleScreen):
3665b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum
366697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _root = None
366797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _canvas = None
366897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _title = _CFG["title"]
3669d038ca830fd5a6bafbd24b70eb71aeae83d362d3Fred Drake
367097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self):
3671601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # XXX there is no need for this code to be conditional,
3672601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # as there will be only a single _Screen instance, anyway
3673601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # XXX actually, the turtle demo is injecting root window,
3674601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # so perhaps the conditional creation of a root should be
3675601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        # preserved (perhaps by passing it as an optional parameter)
3676601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if _Screen._root is None:
3677601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._root = self._root = _Root()
3678601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            self._root.title(_Screen._title)
367997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._root.ondestroy(self._destroy)
3680601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if _Screen._canvas is None:
368197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            width = _CFG["width"]
368297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            height = _CFG["height"]
368397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            canvwidth = _CFG["canvwidth"]
368497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            canvheight = _CFG["canvheight"]
368597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            leftright = _CFG["leftright"]
368697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            topbottom = _CFG["topbottom"]
368797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self._root.setupcanvas(width, height, canvwidth, canvheight)
3688601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._canvas = self._root._getcanvas()
3689601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            TurtleScreen.__init__(self, _Screen._canvas)
3690eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl            self.setup(width, height, leftright, topbottom)
369197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
369297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def setup(self, width=_CFG["width"], height=_CFG["height"],
369397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis              startx=_CFG["leftright"], starty=_CFG["topbottom"]):
369497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """ Set the size and position of the main window.
369597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
369697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Arguments:
369797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width: as integer a size in pixels, as float a fraction of the screen.
369897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          Default is 50% of screen.
369997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        height: as integer the height in pixels, as float a fraction of the
370097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          screen. Default is 75% of screen.
370197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        startx: if positive, starting position in pixels from the left
370297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          edge of the screen, if negative from the right edge
370397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          Default, startx=None is to center window horizontally.
370497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        starty: if positive, starting position in pixels from the top
370597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          edge of the screen, if negative from the bottom edge
370697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis          Default, starty=None is to center window vertically.
370797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
370897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Examples (for a Screen instance named screen):
370997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.setup (width=200, height=200, startx=0, starty=0)
371097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
371197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sets window to 200x200 pixels, in upper left of screen
371297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
371397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.setup(width=.75, height=0.5, startx=None, starty=None)
371497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
371597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sets window to 75% of screen by 50% of screen and centers
371697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
371797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if not hasattr(self._root, "set_geometry"):
371897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
371997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sw = self._root.win_width()
372097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        sh = self._root.win_height()
372197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(width, float) and 0 <= width <= 1:
372297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            width = sw*width
372397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if startx is None:
372497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            startx = (sw - width) / 2
372597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isinstance(height, float) and 0 <= height <= 1:
372697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            height = sh*height
372797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if starty is None:
372897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            starty = (sh - height) / 2
372997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._root.set_geometry(width, height, startx, starty)
3730eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandl        self.update()
373197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
373297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def title(self, titlestring):
373397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Set title of turtle-window
373497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
373597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Argument:
373697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        titlestring -- a string, to appear in the titlebar of the
373797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                       turtle graphics window.
373897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
373997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This is a method of Screen-class. Not available for TurtleScreen-
374097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        objects.
374197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
374297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Screen instance named screen):
374397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.title("Welcome to the turtle-zoo!")
374497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
3745601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if _Screen._root is not None:
3746601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._root.title(titlestring)
3747601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        _Screen._title = titlestring
3748477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
374997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def _destroy(self):
375097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        root = self._root
3751601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        if root is _Screen._root:
375297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Turtle._pen = None
375397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Turtle._screen = None
3754601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._root = None
3755601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis            _Screen._canvas = None
375697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TurtleScreen._RUNNING = True
375797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        root.destroy()
3758477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
375997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def bye(self):
376097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Shut the turtlegraphics window.
3761477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
376297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a TurtleScreen instance named screen):
376397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.bye()
376497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
376597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self._destroy()
3766477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
376797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def exitonclick(self):
376897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Go into mainloop until the mouse is clicked.
3769477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
377097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        No arguments.
3771477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
377297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Bind bye() method to mouseclick on TurtleScreen.
377397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If "using_IDLE" - value in configuration dictionary is False
377497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        (default value), enter mainloop.
377597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        If IDLE with -n switch (no subprocess) is used, this value should be
377697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        set to True in turtle.cfg. In this case IDLE's mainloop
377797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        is active also for the client script.
3778477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
377997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        This is a method of the Screen-class and not available for
378097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        TurtleScreen instances.
3781477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
378297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Example (for a Screen instance named screen):
378397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        >>> screen.exitonclick()
3784477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
378597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """
378697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        def exitGracefully(x, y):
378797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            """Screen.bye() with two dummy-parameters"""
378897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            self.bye()
378997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        self.onclick(exitGracefully)
379097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if _CFG["using_IDLE"]:
379197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            return
379297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
379397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            mainloop()
379497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except AttributeError:
379597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            exit(0)
3796477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
3797477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
379897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisclass Turtle(RawTurtle):
379913925008dc11f2a235627dc8c0440c0ce99171d9Ezio Melotti    """RawTurtle auto-creating (scrolled) canvas.
3800477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
380197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    When a Turtle object is created or a function derived from some
380297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Turtle method is called a TurtleScreen object is automatically created.
380397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
380497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _pen = None
380597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    _screen = None
380697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
380797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def __init__(self,
380897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 shape=_CFG["shape"],
380997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 undobuffersize=_CFG["undobuffersize"],
381097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                 visible=_CFG["visible"]):
381197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if Turtle._screen is None:
381297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            Turtle._screen = Screen()
381397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        RawTurtle.__init__(self, Turtle._screen,
381497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           shape=shape,
381597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           undobuffersize=undobuffersize,
381697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                           visible=visible)
381797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
381897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. LöwisPen = Turtle
3819477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
382097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _getpen():
382197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Create the 'anonymous' turtle if not already present."""
382297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if Turtle._pen is None:
382397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turtle._pen = Turtle()
382497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return Turtle._pen
382597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
382697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _getscreen():
382797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Create a TurtleScreen if not already present."""
382897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if Turtle._screen is None:
382997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        Turtle._screen = Screen()
383097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return Turtle._screen
383197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
383297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef write_docstringdict(filename="turtle_docstringdict"):
383397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Create and write docstring-dictionary to file.
383497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
383597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Optional argument:
383697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    filename -- a string, used as filename
383797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                default value is turtle_docstringdict
383897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
383913925008dc11f2a235627dc8c0440c0ce99171d9Ezio Melotti    Has to be called explicitly, (not used by the turtle-graphics classes)
384097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    The docstring dictionary will be written to the Python script <filname>.py
384197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    It is intended to serve as a template for translation of the docstrings
384297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    into different languages.
384397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
384497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    docsdict = {}
384597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
384697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for methodname in _tg_screen_functions:
3847601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis        key = "_Screen."+methodname
384897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        docsdict[key] = eval(key).__doc__
384997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for methodname in _tg_turtle_functions:
385097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        key = "Turtle."+methodname
385197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        docsdict[key] = eval(key).__doc__
385297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
385397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f = open("%s.py" % filename,"w")
385497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    keys = sorted([x for x in docsdict.keys()
385597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                        if x.split('.')[1] not in _alias_list])
385697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write('docsdict = {\n\n')
385797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for key in 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    key = keys[-1]
386197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write('%s :\n' % repr(key))
386297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write('        """%s\n"""\n\n' % docsdict[key])
386397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.write("}\n")
386497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    f.close()
386597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
386697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef read_docstrings(lang):
386797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """Read in docstrings from lang-specific docstring dictionary.
386897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
386997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    Transfer docstrings, translated to lang, from a dictionary-file
387097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    to the methods of classes Screen and Turtle and - in revised form -
387197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    to the corresponding functions.
387297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
387397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    modname = "turtle_docstringdict_%(language)s" % {'language':lang.lower()}
387497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    module = __import__(modname)
387597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    docsdict = module.docsdict
387697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    for key in docsdict:
387797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        try:
387897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis#            eval(key).im_func.__doc__ = docsdict[key]
387997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            eval(key).__doc__ = docsdict[key]
388097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        except:
388197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            print("Bad docstring-entry: %s" % key)
388297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
388397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis_LANGUAGE = _CFG["language"]
388497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
388597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwistry:
388697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if _LANGUAGE != "english":
388797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        read_docstrings(_LANGUAGE)
388897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisexcept ImportError:
388997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    print("Cannot find docsdict for", _LANGUAGE)
389097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisexcept:
389197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    print ("Unknown Error when trying to import %s-docstring-dictionary" %
389297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                                                  _LANGUAGE)
389397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
389497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
389597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef getmethparlist(ob):
389697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    "Get strings describing the arguments for the given object"
389797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText1 = argText2 = ""
389897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    # bit of a hack for methods - turn it into a function
389997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    # but we drop the "self" param.
390097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    # Try and build one for Python defined functions
390197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argOffset = 1
390297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    counter = ob.__code__.co_argcount
390397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    items2 = list(ob.__code__.co_varnames[argOffset:counter])
390497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    realArgs = ob.__code__.co_varnames[argOffset:counter]
390597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defaults = ob.__defaults__ or []
390697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defaults = list(map(lambda name: "=%s" % repr(name), defaults))
390797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defaults = [""] * (len(realArgs)-len(defaults)) + defaults
390897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    items1 = list(map(lambda arg, dflt: arg+dflt, realArgs, defaults))
390997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if ob.__code__.co_flags & 0x4:
391097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items1.append("*"+ob.__code__.co_varnames[counter])
391197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items2.append("*"+ob.__code__.co_varnames[counter])
391297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        counter += 1
391397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if ob.__code__.co_flags & 0x8:
391497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items1.append("**"+ob.__code__.co_varnames[counter])
391597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        items2.append("**"+ob.__code__.co_varnames[counter])
391697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText1 = ", ".join(items1)
391797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText1 = "(%s)" % argText1
391897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText2 = ", ".join(items2)
391997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    argText2 = "(%s)" % argText2
392097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return argText1, argText2
392197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
392297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _turtle_docrevise(docstr):
392397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """To reduce docstrings from RawTurtle class for functions
3924477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    """
392597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    import re
392697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if docstr is None:
392797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return None
392897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    turtlename = _CFG["exampleturtle"]
392997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = docstr.replace("%s." % turtlename,"")
393097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    parexp = re.compile(r' \(.+ %s\):' % turtlename)
393197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = parexp.sub(":", newdocstr)
393297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return newdocstr
393397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
393497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisdef _screen_docrevise(docstr):
393597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """To reduce docstrings from TurtleScreen class for functions
393697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    """
393797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    import re
393897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if docstr is None:
393997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        return None
394097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    screenname = _CFG["examplescreen"]
394197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = docstr.replace("%s." % screenname,"")
394297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    parexp = re.compile(r' \(.+ %s\):' % screenname)
394397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    newdocstr = parexp.sub(":", newdocstr)
394497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    return newdocstr
394597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
394697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## The following mechanism makes all methods of RawTurtle and Turtle available
394797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## as functions. So we can enhance, change, add, delete methods to these
394897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis## classes and do not need to change anything here.
394997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
395097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
395197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisfor methodname in _tg_screen_functions:
3952601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    pl1, pl2 = getmethparlist(eval('_Screen.' + methodname))
395397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if pl1 == "":
395497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        print(">>>>>>", pl1, pl2)
395597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        continue
395697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defstr = ("def %(key)s%(pl1)s: return _getscreen().%(key)s%(pl2)s" %
395797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                   {'key':methodname, 'pl1':pl1, 'pl2':pl2})
395897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    exec(defstr)
3959601149bb8e4fd200cc5b0b670f34c608c64e0783Martin v. Löwis    eval(methodname).__doc__ = _screen_docrevise(eval('_Screen.'+methodname).__doc__)
396097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
396197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisfor methodname in _tg_turtle_functions:
396297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    pl1, pl2 = getmethparlist(eval('Turtle.' + methodname))
396397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    if pl1 == "":
396497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        print(">>>>>>", pl1, pl2)
396597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        continue
396697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    defstr = ("def %(key)s%(pl1)s: return _getpen().%(key)s%(pl2)s" %
396797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                                   {'key':methodname, 'pl1':pl1, 'pl2':pl2})
396897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    exec(defstr)
396997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    eval(methodname).__doc__ = _turtle_docrevise(eval('Turtle.'+methodname).__doc__)
397097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
397197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
3972eaa84ef1e96f1f597ef54f40147de2e6a6980e34Georg Brandldone = mainloop
397397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
397497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwisif __name__ == "__main__":
397597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def switchpen():
397697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        if isdown():
397797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pu()
397897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        else:
397997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            pd()
3980477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
398197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def demo1():
398297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Demo of old turtle.py - module"""
398397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        reset()
398497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracer(True)
3985b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        up()
398697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        backward(100)
3987b241b67b8954b0679377af00d668e3dc92f4c858Guido van Rossum        down()
398897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # draw 3 squares; the last filled
398997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width(3)
399097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(3):
399197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if i == 2:
399297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                begin_fill()
399397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for _ in range(4):
399497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                forward(20)
399597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                left(90)
399697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if i == 2:
399797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                color("maroon")
399897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                end_fill()
3999477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters            up()
400097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(30)
4001477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters            down()
400297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        width(1)
400397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color("black")
400497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # move out of the way
400597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracer(False)
400697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        up()
40070e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters        right(90)
400897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        forward(100)
40090e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters        right(90)
401097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        forward(100)
401197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        right(180)
401297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        down()
401397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # some text
401497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        write("startstart", 1)
401597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        write("start", 1)
401697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color("red")
401797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # staircase
401897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(5):
401997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
402097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            left(90)
402197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
402297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            right(90)
402397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # filled staircase
402497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tracer(True)
402597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        begin_fill()
402697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(5):
402797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
402897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            left(90)
402997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            forward(20)
403097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            right(90)
403197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        end_fill()
403297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        # more text
403397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
403497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    def demo2():
403597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        """Demo of some new features."""
403697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed(1)
403797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        st()
403897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pensize(3)
403997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        setheading(towards(0, 0))
404097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        radius = distance(0, 0)/2.0
404197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rt(90)
404297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for _ in range(18):
404397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            switchpen()
404497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            circle(radius, 10)
404597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        write("wait a moment...")
404697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        while undobufferentries():
404797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            undo()
404897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        reset()
404997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(90)
405097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        colormode(255)
405197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        laenge = 10
405297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pencolor("green")
405397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pensize(3)
405497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(180)
405597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for i in range(-2, 16):
405697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if i > 0:
405797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                begin_fill()
405897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fillcolor(255-15*i, 0, 15*i)
405997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            for _ in range(3):
406097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                fd(laenge)
406197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                lt(120)
406297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            end_fill()
406397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            laenge += 10
406497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            lt(15)
406597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            speed((speed()+1)%12)
406697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        #end_fill()
406797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
406897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(120)
406997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pu()
407097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fd(70)
407197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        rt(30)
407297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pd()
407397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        color("red","yellow")
407497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        speed(0)
407597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        begin_fill()
407697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        for _ in range(4):
407797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            circle(50, 90)
407897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            rt(90)
407997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            fd(30)
408097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            rt(90)
408197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        end_fill()
408297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        lt(90)
408397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pu()
408497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        fd(30)
408597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        pd()
408697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        shape("turtle")
408797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
408897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri = getturtle()
408997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.resizemode("auto")
409097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle = Turtle()
409197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.resizemode("auto")
409297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.shape("turtle")
409397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.reset()
409497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.left(90)
409597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.speed(0)
409697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.up()
409797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.goto(280, 40)
409897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.lt(30)
409997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.down()
410097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.speed(6)
410197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.color("blue","orange")
410297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        turtle.pensize(2)
410397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.speed(6)
4104477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters        setheading(towards(turtle))
410597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        count = 1
410697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        while tri.distance(turtle) > 4:
410797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.fd(3.5)
410897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.lt(0.6)
410997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tri.setheading(tri.towards(turtle))
411097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tri.fd(4)
411197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            if count % 20 == 0:
411297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                turtle.stamp()
411397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                tri.stamp()
411497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis                switchpen()
411597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            count += 1
411697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.write("CAUGHT! ", font=("Arial", 16, "bold"), align="right")
411797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.pencolor("black")
411897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.pencolor("red")
411997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
412097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        def baba(xdummy, ydummy):
412197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            clearscreen()
412297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            bye()
412397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
412497cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        time.sleep(2)
412597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
412697cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        while undobufferentries():
412797cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            tri.undo()
412897cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis            turtle.undo()
412997cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.fd(50)
413097cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.write("  Click me!", font = ("Courier", 12, "bold") )
413197cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis        tri.onclick(baba, 1)
413297cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis
413397cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    demo1()
4134477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters    demo2()
413597cf99fc7e8c56868711f7c91c3b1e37e4c66cbaMartin v. Löwis    exitonclick()
4136