Python第二周:初始turtle库画图

案例展示

结果展示

 

程序展示

 1 #PythonDraw.py
 2 import turtle
 3 turtle.setup(650, 350, 200, 200)
 4 turtle.penup()
 5 turtle.fd(-250)
 6 turtle.pendown()
 7 turtle.pensize(25)
 8 turtle.pencolor("purple")
 9 turtle.seth(-40)
10 for i in range(4):
11 turtle.circle(40, 80)
12 turtle.circle(-40, 80)
13 turtle.circle(40, 80/2)
14 turtle.fd(40)
15 turtle.circle(16, 180)
16 turtle.fd(40 * 2/3)
17 turtle.done()

 

程序解析

  • #PythonDraw.py

     这是文件名,写Python文件时开头注释文件名

  • import turtle

     导入turtle作图的库

  • for循环

     range(4)会生成一个序列,并不是列表,其使用一般是用于for循环及生成有规律的数组,可利用list()转化为列表。参考https://www.runoob.com/python/python-func-range.html

 turtle的初识

原理:有一只海龟,其实在窗体正中心,在画布上游走走过的轨迹形成了绘制的图形
海龟由程序控制,可以变换颜色、改变宽度等 。
turtle最小单位是像素。

turtle的绘图窗体:

 

 

 

 

 

 

 

 

 方法turtle.goto(x,y)是由当前位置向坐标(x,y)移动,并留下直线轨迹。

 

 

 turtle.circle(r,angle)是以r为半径,在当前方向基础上旋转angle角度;turtle(r):默认旋转360

 

 turtle.setheading(angle) ,别名turtle.seth(angle)

 

 

 

 seth()方法是在0度基础上改变

而left(angle),right(angle)方法是在原有基础上改变

turtle.bk(d),turtle.fd(d)分别是后退和前进d距离,原名是turtle.back(d) turtle.forward(d)

 

 关于turtle的一些方法

turtle.penup()和turtle.pendown()是一对。其中penup()是提笔,从此移动不形成轨迹,用于另起一个地方绘制;pendown()则是关闭。

 

 

 

 关于RGB:

 

 

具体的颜色的对应可见取色板

turtle.pensize(25):改变画笔的粗细

更多方法可见链接:https://blog.csdn.net/Xin_101/article/details/85850265

 编码风格

第一种:a.b(参数)

a为库名,b为方法名。缺点:较为繁琐。

例:turtle.circle(100,180)

第二种:b(),b为方法名字

使用前提:在引入库的时候使用:from a import b或者from a import *

缺点:可能方法名与编程者所使用的方法名冲突;优点:方便

 

第三种:自定义名字

使用方法:import a as b

a是原始库名,b为自定义库名

 实例2:七段数码管绘制(来自于第五周学习)

 

 代码:解释均在注释处

 1 #stopwatch.py
 2 #目的:输入需要倒计时的秒数,利用turtle库进行计时
 3 #方法drawconstant(numbers,gap)目的在于画出连续的一串数字
 4 #number是一串连续数字,gap为数字之间的间隔,默认为5
 5 #number_list是元素为单个数字的列表
 6 #方法list(map(int,list(number_str)))是将list中每一个元素转化为数字形成的map对象再转化为list
 7 def drawconstant(numbers,gap=15):
 8     number_str = str(numbers)
 9     number_list = list(map(int,list(number_str)))
10     for s in number_list:
11         drawdigit(s)
12         turtle.penup()
13         turtle.fd(gap)
14 #stopwatch(numbers)在于输入秒数numbers进行倒计时
15 #sleep(1)为程序停止一秒
16 #turtle.reset()是清空画布,回归原始
17 def stopwatch(numbers):
18     for i in range(numbers,-1,-1):
19         turtle.pensize(5)
20         turtle.pencolor(random.random(), random.random(), random.random())
21         drawconstant(i, gap=15)
22         time.sleep(1)
23         turtle.reset()
24 #drawdigit(numbers)是画出单个数字,一个数字分七步走
25 def drawdigit(number):
26     # 第一步:
27     drawline(True) if number in [2, 3, 4, 5, 6, 8, 9] else drawline(False)
28     # 第二步
29     drawline(True) if number in [0, 3, 4, 5, 6, 7, 8, 9] else drawline(False)
30     # 第三步
31     drawline(True) if number in [0, 2, 3, 5, 6, 8, 9] else drawline(False)
32     # 第四步
33     drawline(True) if number in [0,1, 2, 6, 8] else drawline(False)
34     turtle.left(90)
35     # 第五步
36     drawline(True) if number in [0,1,4, 5, 6, 8, 9] else drawline(False)
37     # 第六步
38     drawline(True) if number in [0, 2, 3, 5, 6, 7, 8, 9] else drawline(False)
39     # 第七步
40     drawline(True) if number in [0, 2, 3, 4, 7, 8, 9] else drawline(False)
41     turtle.left(180)
42 #drawgap()是数字的一笔一画之间留一点空隙
43 def drawgap():
44     turtle.penup()
45     turtle.fd(5)
46 #drawline(draw)draw为True或者False,控制一步画或者不画
47 def drawline(draw):
48     drawgap()
49     turtle.pendown() if draw else turtle.penup()
50     turtle.fd(40)
51     drawgap()
52     turtle.right(90)
53 import  turtle
54 import random
55 import time
56 turtle.Turtle().screen.delay(0)
57 turtle.setup(800,400)
58 stopwatch(10)#输入秒数为10
59 turtle.done()
60 #注意:此方法进行计时误差太大,主要是因为turtle反应需要时间,不推荐使用
倒计时的代码

 代码中有一处:

drawline(True) if number in [2, 3, 4, 5, 6, 8, 9] else drawline(False)

 表达式1 if 判别式 else 表达式

这个表达式很有用,适合简短的if else语句

 

实例3:科赫雪花小包裹(来自第五周)

科赫曲线:

高大上的分形几何:是一种具有迭代关系的几何图形,广泛存在于自然界中。

简单来说可以理解为整体与局部具有很相似的结构

 科赫曲线,也称为雪花曲线

 雪花的局部与整体有一些相似性,这种相似性可以表达为科赫曲线的一种数学描述。

用python绘制科赫曲线

 解释:取一条直线,取中间1/3的长度在中间形成一个等边三角形。同一个操作不断迭代,每分一次加一阶。

需达到的效果:输入阶数与原始长度,输出对应科赫曲线

方法:使用递归,同时使用turtle画图

思想:

递归 = 函数+分支;

递归链条:线段的组合;

当n为1时,也就是使用四次基例;当n为2时也就是在四次的基础上分成16次基例·······

递归基例:极端情况,n=0,画直线。

程序:

 1 #demo2.py
 2 def koch(n,size):#n是阶数,size是原始线段长度
 3     # 递归基例
 4     if n == 0 :
 5         turtle.fd(size)
 6     #递归链条
 7     else :
 8         for angle in [0,60,240,60]:
 9             turtle.left(angle)
10             koch(n-1,size*(1/3))
11 #主程序
12 import turtle
13 turtle.setup(800,400)
14 turtle.pencolor("blue")
15 turtle.pensize(2)
16 turtle.penup()
17 turtle.goto(-300,-100)
18 turtle.pendown()
19 koch(5,600)
20 turtle.done()

绘图时,可能绘图速度会很慢,可以使用如下代码:

1 turtle.speed(0)
2 '''参数0为最快,10为较快,6为正常,3为较慢,1为最慢'''
3 '''turtle.Turtle().screen.delay(0)即完全消除延迟'''

科赫曲线→科赫雪花

加入代码:

1 koch(4,300)
2 turtle.right(120)
3 koch(4,300)
4 turtle.right(120)
5 koch(4,300)
6 turtle.right(120)
7 turtle.done()

 

 

turtle.hideturtle()为隐藏画笔的turtle形状

 

 深入理解函数递归的思想

 

posted @ 2020-01-31 21:54  焕熊  阅读(1004)  评论(0编辑  收藏  举报