2020 Hackathon:Python Turtle

10.23 Python Turtle Lecture

主讲:黄学文

Turtle 是什么,能做什么

Turtle 库是 Python 的基础绘图库,其主要是用于程序设计入门,是标准库之一,利用 Turtle 可以制作很多复杂的绘图。

想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。

image.png

举个例子:先执行 import turtle,再执行 turtle.right(45),它将原地右转 45 度。再执行 turtle.forward(150),它将(在屏幕上)朝所面对的 x 轴正方向前进 150 像素,随着它的移动画出一条线段。

1
2
3
4
import turtle

turtle.right(45)
turtle.forward(150)

Turtle 的安装(避坑)

大家应该都装好 Python3 了吧。

安装好 Python 3.8,turtle 模块就可以使用了,即 turtle 是 Python 的内置模块。

可以尝试用 import turtle 导入,如果没有异常(ModuleNotFoundError)抛出,turtle 就已经装好了。

但是如果没有安装 turtle(导入时报错了),就需要我们手动安装。

通常的做法是:pip install turtle

但是会报错:

image.png

通过阅读错误信息我们可以知道:错误的来源是 setup.py 第40行存在语法错误(这个语法是 Python2 的语法,在 Python3 环境下会报错),需要我们手动修改并安装。

解决办法:

  • 下载 turtle 源码:https://pypi.org/project/turtle/#files

  • 解压,并记住解压的文件夹路径(路径中不要出现空格和中文

  • 打开 setup.py 修改第40行,从 except ValueError, ve: 改成 except (ValueError, ve):

    image.png

  • 打开命令提示符(cmd)运行 pip install -e <turtle文件夹路径>

    如:pip install -e C:\Python_turtle\turtle-0.0.2

    即可完成安装。

    如果遇到错误image.png

    建议手动安装 twisted :

    • 下载对应 python 版本(如python3.8 对应 cp38)的 twisted 安装包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

      比如说我的是 32 位 python3.8,下载 “Twisted‑20.3.0‑cp38‑cp38‑win32.whl”

      存放路径中不要出现空格和中文

    • 命令提示符执行 pip install <下载文件路径>

      比如我存放在了C盘根目录,就需要执行 pip install C:\Twisted‑20.3.0‑cp38‑cp38‑win32.whl

    • 之后再执行 pip install -e <turtle文件夹路径> 即可。

Turtle 的基础功能使用简介

使用海龟画笔,获取和修改状态

当我们开始作图时,确切的说是我们调用了画图的函数时,我们就有了一个小海龟 turtle。

移动和绘制,颜色控制和填充

海龟的动作
绘图
颜色控制
填充

窗口控制

turtle 库的其他使用方法参考官方文档https://docs.python.org/zh-cn/3/library/turtle.html

例1:太阳花

1
2
3
4
5
6
7
8
9
10
import turtle 
turtle.color('red', 'yellow')
turtle.begin_fill()
while True:
turtle.forward(200)
turtle.left(170)
if abs(turtle.pos()) < 1:
break
turtle.end_fill()
turtle.done()
png

例2:彩虹线

1
2
3
4
5
6
7
8
9
import turtle
from random import randint

turtle.pensize(5)
turtle.colormode(255)
for x in range(700):
turtle.color(randint(0, 255), randint(0, 255), randint(0, 255))
turtle.circle(2 * (1 + x / 4), 5)
turtle.speed(30)

例3:绘制蟒蛇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import turtle

turtle.penup()
turtle.pencolor("red")
turtle.forward(-250)
turtle.pendown()
turtle.pensize(10)
turtle.right(45)
for i in range(4):
turtle.circle(40, 80)
turtle.circle(-40, 80)
turtle.circle(40, 80 / 2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2 / 3)
turtle.done()

这个留给大家自己去执行看看效果。

补充

官方文档中提到了面向对象的概念,简单的理解就是:把我们刚才画图用的海龟和用这个海龟画画的各种函数看作一个整体,作为现实中的笔这一事物在程序中的抽象,我们把这种抽象叫做,起名 Turtle。同样的,把画画用的窗口和控制它的函数这一类看作是现实中纸张,称作 Screen 类。

Screen 和 Turtle 可以看做是真实的纸、笔来比喻。看不懂也没关系,程序中使用过程化的方法更多。(看不懂就跳过这一部分吧~)

任务布置与 turtle 小程序演示

文件链接已失效,暂不提供下载。

子任务

[熟悉 turtle 的使用] 我们给每个队都准备了一块白板和若干水彩笔,大家可以愉快地在白板上画画;所以这个任务是将这块白板数字化,大家可以在上面用小海龟画画(不一定要和实物白板一模一样)。

主任务

在下面几个选题中任选一个,在 Hackathon 结束时各小组进行展示。

以下选题提供供参考的示例程序。

  • 选题1 分形几何——分形树的绘制 扩展:科赫曲线(雪花曲线)的绘制

    • 如果让你去测量中国的海岸线总长度,该如何测量呢?

    • 资料显示:我国海岸线长度为3.2万公里

    • 米尺:得到的结果可能会是10万千米

    • 精度再高:结果会更大

    分形就是将一个东西按照某种方式不断分割下去,形成的一种不断迭代的自相似结构。迭代次数越多,总长度等越大,形状也就更加复杂。

    • 分形几何的一个简单的实例即为分形树。
    • 通过控制笔的起始位置、方向、颜色、粗细,画出颜色和粗细不同的树干构成的分形树,且自下向上树干越来越细。

    所以,这个任务是:画分形树(或科赫曲线等类似图形)。

    参考资料

    • 分形概述:下载地址,备用下载地址,百度云链接
    • 百度百科:分形几何
    • 示例代码:下载地址,备用下载地址,百度云链接
  • 选题2 表白小程序——画樱花树 扩展:画出更漂亮的画

    当然,你也许不会满足于画这些看起来比较简单的图画。下面是更漂亮也更具有挑战性的项目,而且也有了更丰富的用途

    比如说,画一篇樱花树送给你的npy……

    image.png

    所以,这个任务很简单,就是——画出更漂亮的画(包括但不限于樱花树)。

    参考资料

    • 示例代码:下载地址,备用下载地址,百度云链接
    • 代码详解:下载地址,备用下载地址,百度云链接
  • 选题3 算法的演示程序——以冒泡排序算法为例 扩展:机器学习knn算法等的演示

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

    它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从 Z 到 A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

    这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

    算法的描述给人的感觉是枯燥的,但是将其演示出来能让我们更好地理解它。

    如果你想变强,来试试这个选题:算法的演示程序。这个范围很大,你可以挑你感兴趣的。

    推荐可以了解一下机器学习 knn 算法,并用 turtle 来演示其过程。

    我们提供一些简单的有关算法的资料,你也可以上网搜索。

    参考资料

    • 有关排序的简介(冒泡排序、选择排序):下载地址,备用下载地址,百度云链接
    • 冒泡排序演示的示例代码:下载地址,备用下载地址,百度云链接
    • 机器学习简介:下载地址,备用下载地址,百度云链接
    • 机器学习与 knn 算法介绍(视频):下载地址,备用下载地址,百度云链接
  • 选题4 挑战——铺瓷砖 扩展:用 turtle 来解决实际问题/实现一个小游戏

    题目:有一面墙,规格为长n宽m的长方形,现在要把规格为长a宽b的长方形瓷砖铺满该墙面,请问有多少种铺法?请输出所有的铺法,用户可以选定某种铺法,输出对应的 turtle 图形进行可视化。【题目来源:2019·PKU 非计算机类 Python大作业】

    挑战:大家可以思考这道题的完整做法。(虽然这超出了本次 Hackathon 的要求)

    对于选本题的小组,我们考虑给出“输出所有的铺法”的程序,由小组成员来实现可视化功能。(如果能完整实现本程序更好)

    或者,用 turtle 来解决实际问题/实现一个小游戏,我们欢迎更好的想法。

    参考资料

    • 题目与题解:下载地址,备用下载地址,百度云链接
    • 代码模板(可以直接在原代码上添加功能):下载地址,备用下载地址,百度云链接
    • 完整实现代码示例:下载地址,备用下载地址,百度云链接