课程简介

这是一个基于jupyter的海龟画画课程,使用了一个ipyturtle库。ipyturtle库是jupyter的插件,用来实现logo语言的功能。

Logo语言是MIT著名计算机教授西蒙派珀特专为儿童设计的编程语言,曾经风靡全球,直到最近十年才慢慢被Scratch所替代。有人开发了一个叫做Turtle的Python库,继承了logo语言的所有功能。我希望能够借助画画的方式,让初学者熟悉Python语法,但是Python命令行形式的编程界面,总不够友好。有了Jupyter和ipyturtle后,我们可以在网页上一边画画,一边学习Python。

准备工作

1.ipyturtle的安装

安装ipyturtle之前,要先安装jupyter。

安装方法:

pip install ipyturtle jupyter nbextension enable --py --sys-prefix ipyturtle

如果pip不能安装,可以试试pip3。

ipyturtle的开源地址:https://github.com/gkvoelkl/ipython-turtle-widget

虚谷号上,已经预装了jupyter和ipyturtle,打开就可以使用。

2.谷歌浏览器

需要使用谷歌浏览器来访问。

好了,开始画图吧。

开始画画

1.准备工作:

首先是导入库,然后显示Turtle对象。执行代码(选择语句,点击“运行”。),看一看,网页上是不是出现了一张中间有小三角形标志的图片?这就是的画布

from ipyturtle import Turtle
t = Turtle()
t

如果觉得画布太大,那就设定画布大小,小一点。试一试。

# 先关闭
t.close()
# 再画一个小一点的画布
t = Turtle(fixed=False, width=100, height=100)
t

看一下,画布上是不是变小了,并且三角形标志的位置也不在中心点了。

画一条长度为40的线吧。

t.forward(40)

是不是看到图片中的三角形指示牌动起来了,并且底下出现一条线?

接下来要考一考大家:

默认情况下,三角形指示牌的坐标在“0,0”的位置,运行下面的代码,t的坐标在哪里?

t.back(20)
t.forward(60)

有没有发现,三角形指示牌移动了?我们输出坐标吧。

t.position()
(0.0, 80.0)

解释一下,back表示后退,forward表示移动,括号中的数字单位是像素。因为后退了20,再前进60,实际上是40,所以坐标在“0.0, 40.0”。那么Turtle还支持哪些操作呢?

  • 移动:forward(),back() 表示前进多少步,后退多少步,括号里面表示像素。
  • 转弯:right(10)、left(20) 右转和左转,括号里面表示角度。
  • 收起画笔:penup()
  • 重新开始:reset()

我们试一试吧,画一条线,长度是50像素的水平线。

from ipyturtle import Turtle
t = Turtle(fixed=False, width=200, height=200)
t
t.right(90)
t.forward(50)

总结一下: 要先显示t,然后移动坐标,就能看到图案,不然看到的是最终结果。

2.画出基本形状:

# 长度是100,高度是50的矩形
from ipyturtle import Turtle
t = Turtle()
t
#画出矩形
t.forward(50)
t.right(90)
t.forward(100)
t.right(90)
t.forward(50)
t.right(90)
t.forward(100)

看一下,是不是画出了矩形?

#先清除原来的结果
t
t.reset()

4.如何画三角形

这个可是难题了。

#画出三角形
from ipyturtle import Turtle
t = Turtle()
t
t.forward(100)
t.right(120)
t.forward(100)
t.right(120)
t.forward(100)
t.right(120)

说一下,这是什么原理?为什么这样画出来的就是一个三角形?

那么,如何画出一个直角三角形呢?

#画出有一个角是60度的直角三角形。
t.reset()
t.forward(100)
t.right(90)
t.forward(150)
t.right(120)
while t.position()[0]>0:
    t.forward(1)
t.right(150)
t.forward(abs(t.position()[1]))

解释一下代码:

t.position(),表示坐标,这个数据类型是元组(tuple)。因为我们不知道这个边有多长,就用while循环,一直走到坐标x超过原点(0)为止,然后回到原位。

其中,t.position()[0]是x坐标,t.position()[1]是y坐标。

问题:abs(t.position()[1])表示什么?

知识链接:while 后面跟着的是表达式,只要表达式成立,那么就一直循环。

思考:能不能用勾股定理算出边长,然后回到原点?

如:math.sqrt(1002+1502)。

如果使用sqrt,需要导入math库。在头部要加上一句“import math”

5.写个函数吧

# 正方形
def square(size):
    for i in range(4):
        t.forward(size)
        t.right(90)
t.reset()
square(100)

知识链接1:def square(size)表示一个自定义的函数,square是函数名,size是参数。函数类似一个程序代码的集合,调用起来比较方便。

知识链接2:for i in range(4)表示循环4次,分别是0,1,2,3。即从0开始,不包括4。

# 画个圆
def circle():
    for i in range(360):
        t.forward(1)
        t.right(1)
t.reset()
circle()

思考题1:如果把360改为60,图案有什么变化?要让画出来的图呈现出圆的样子,需要修改哪个数字?

思考题2:如何修改代码,画出一个正五边形?

# 画个正五边形
def triangle():
    for i in range(5):
        t.forward(60)
        t.right(72)
t.reset()
triangle()

看这画图的过程,是不是挺好玩?好了,这个海龟画画的简单教程结束了。