在网页上画画
Awesome summary
这是一个基于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.谷歌浏览器
需要使用谷歌浏览器来访问。
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()
解释一下,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()
看这画图的过程,是不是挺好玩?好了,这个海龟画画的简单教程结束了。