gh-106996: Add a how-to section to the turtle documentation (#107153)

Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
This commit is contained in:
Daniele Procida 2023-07-25 14:03:57 +02:00 committed by GitHub
parent 329e4a1a3f
commit 2425346fee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 114 additions and 0 deletions

View File

@ -55,6 +55,8 @@ graphical output it can be a way to do that without the overhead of
introducing more complex or external libraries into their work.
.. _turtle-tutorial:
Tutorial
========
@ -174,6 +176,118 @@ Finally, complete the filling::
``end_fill()`` command.)
.. _turtle-how-to:
How to...
=========
This section covers some typical turtle use-cases and approaches.
Get started as quickly as possible
----------------------------------
One of the joys of turtle graphics is the immediate, visual feedback that's
available from simple commands - it's an excellent way to introduce children
to programming ideas, with a minimum of overhead (not just children, of
course).
The turtle module makes this possible by exposing all its basic functionality
as functions, available with ``from turtle import *``. The :ref:`turtle
graphics tutorial <turtle-tutorial>` covers this approach.
It's worth noting that many of the turtle commands also have even more terse
equivalents, such as ``fd()`` for :func:`forward`. These are especially
useful when working with learners for whom typing is not a skill.
.. _note:
You'll need to have the :mod:`Tk interface package <tkinter>` installed on
your system for turtle graphics to work. Be warned that this is not
always straightforward, so check this in advance if you're planning to
use turtle graphics with a learner.
Use the ``turtle`` module namespace
-----------------------------------
Using ``from turtle import *`` is convenient - but be warned that it imports a
rather large collection of objects, and if you're doing anything but turtle
graphics you run the risk of a name conflict (this becomes even more an issue
if you're using turtle graphics in a script where other modules might be
imported).
The solution is to use ``import turtle`` - ``fd()`` becomes
``turtle.fd()``, ``width()`` becomes ``turtle.width()`` and so on. (If typing
"turtle" over and over again becomes tedious, use for example ``import turtle
as t`` instead.)
Use turtle graphics in a script
-------------------------------
It's recommended to use the ``turtle`` module namespace as described
immediately above, for example::
import turtle as t
from random import random
for i in range(100):
steps = int(random() * 100)
angle = int(random() * 360)
t.right(angle)
t.fd(steps)
Another step is also required though - as soon as the script ends, Python
will also close the turtle's window. Add::
t.mainloop()
to the end of the script. The script will now wait to be dismissed and
will not exit until it is terminated, for example by closing the turtle
graphics window.
Use object-oriented turtle graphics
-----------------------------------
.. seealso:: :ref:`Explanation of the object-oriented interface <turtle-explanation>`
Other than for very basic introductory purposes, or for trying things out
as quickly as possible, it's more usual and much more powerful to use the
object-oriented approach to turtle graphics. For example, this allows
multiple turtles on screen at once.
In this approach, the various turtle commands are methods of objects (mostly of
``Turtle`` objects). You *can* use the object-oriented approach in the shell,
but it would be more typical in a Python script.
The example above then becomes::
from turtle import Turtle
from random import random
t = Turtle()
for i in range(100):
steps = int(random() * 100)
angle = int(random() * 360)
t.right(angle)
t.fd(steps)
t.screen.mainloop()
Note the last line. ``t.screen`` is an instance of the :class:`Screen`
that a Turtle instance exists on; it's created automatically along with
the turtle.
The turtle's screen can be customised, for example::
t.screen.title('Object-oriented turtle demo')
t.screen.bgcolor("orange")
.. _turtle-explanation:
Explanation
===========