python学习第20节:Turtle海龟绘图

发布时间:2020/07/21 作者:天马行空 阅读(3018)

一、Turtle绘图

1.1、画一条线
如何让这只乌龟在界面上画一条线呢?如同我们用笔写字一样,需要经过“落笔”、“划过”、“抬笔”、“结束”的过程,用turtle库来表达,同样非常直观,用简单的函数就可以:

import turtle as t     # 导入turtle库
t.pendown()            # 落笔
t.forward(300)        # 划过300个单位的长度
t.penup()                # 抬笔
t.done()                 # 结束


1.2、画正方形
向左转90度,我们用turtle中的left(90),向右转30度,我们用right(30),括号中是旋转的角度。
正方形中四个角都是90度,那么小乌龟只需要旋转90度即可。

import turtle as t     # 导入turtle库
t.pendown()            # 落笔
t.forward(100)         # 划过100个单位的长度
t.left(90)                # 左转90度
t.forward(100)        # 划过100个单位的长度
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.penup()              # 抬笔
t.done()               # 结束


细心的同学们可能已经发现,上面的代码中有四组相同的语句,是不是可以用循环来实现呢?

import turtle as t
t.shape('turtle')  #显示小乌龟
t.pendown()
for j in range(4):    # 重复执行4次
    t.forward(100)
    t.left(90)
t.penup()
t.done()
import turtle as t
t.shape('turtle')  #显示小乌龟
def drawsquare():           # 定义一个绘制正方形的函数,名为drawsqure()
    t.pendown()
    for j in range(4):
        t.forward(100)
        t.left(90)
    t.penup()
drawsquare()                 # 调用这个函数
t.done()


1.3、画多个正方形

import turtle as t
def drawsquare():          # 绘制单个正方形
    t.pendown()
    for j in range(4):
        t.forward(100)
        t.left(90)
    t.penup()
def drawsquares():        # 绘制多个正方形
    for j in range(10):
        drawsquare()
        t.right(36)
drawsquares()
t.done()



1.4、画笔的颜色
填充颜色的时候,先初始化一个颜色。然后,在绘制每个图形之前使用begin_fill(),绘制之后使用end_fill()。这样就能得到一个填充效果。

t.pencolor()              # 设置画笔的颜色,可以是字符串如"green", "red",也可以是RGB 3元组。
t.pensize()               # 设置画笔的宽度;
t.speed()                 # 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
t.fillcolor()               # 设置填充的颜色
t.begin_fill()             # 开始填充
t.end_fill()               # 结束填充
import turtle as t
def drawsquare():
    t.pendown()
    t.speed(5)
    t.pensize(5)
    for j in range(4):
        t.forward(100)
        t.left(90)
    t.penup()
def drawsquares(clrs):
    for j in range(10):
        t.fillcolor(clrs[j])  # 从列表中选择颜色
        t.begin_fill()  # 开始填充
        drawsquare()
        t.end_fill()  # 结束填充
        t.right(36)
color_list = ['red', 'pink', 'yellow', 'gray', 'lightblue', 'ivory', 'lightcoral', 'violet',
              'moccasin', 'lightseagreen']  # 颜色列表
drawsquares(color_list)
t.done()


1.5、坐标系
介绍一下画布中的坐标系,你可能已经发现了,每次绘图的起点都是画布的中心,从原点到A点的距离是100 * sqrt(2):

import turtle as t
import math
t.pendown()
t.left(45)       # 等腰直角三角形的底角为45°
t.forward(100 * math.sqrt(2))    # 向前移动
t.penup()
t.done()


当然,这个小练习你也可以使用forward()函数,不过goto(x,y)会比forward()要简单很多

import turtle as t
import math
t.pendown()
t.goto(100,100)
t.penup()
t.done()


画字母

import turtle as t
import math
t.shape('turtle')        # 显示出小乌龟
t.penup()                 # 抬笔,先不要画
t.goto(-250, 100)      # 移动到起始点
t.pendown()             # 落笔
t.right(60)                # 向右旋转60度
t.forward(200)          # 向前走200个单位
t.penup()                  # 抬起笔
t.goto(-150,100)        # 去往(-150,100)坐标点
t.pendown()              # 落下笔
t.right(60)                # 向右旋转60度
t.forward(200)          # 向前走200个单位长度
t.penup()             # 第一个字母"X"画完,抬笔
t.goto(-50,100)    # 前往(-50,100)坐标点
t.pendown()         # 落笔
t.left(60)             # 向左转60度
t.forward(200)     # 向前走200个单位
t.penup()             # 抬笔
t.goto(50,100)      # 去往(50,100)坐标点
t.pendown()         # 落笔
t.right(60)            # 向右旋转60度
t.forward(200)      # 向前走200各单位长度
t.penup()              # 抬笔
t.goto(250,100)     # 前往(250,100)坐标点
t.pendown()          # 落笔
t.left(30)              # 向左转30度
t.forward(100*math.sqrt(3))     # 向前走
t.right(90)            # 向右转90度
t.forward(100)      # 向前走100个单位
t.right(90)            # 向右转90度
t.forward(50)       # 向前走50个单位
t.done()



1.6、画曲线
首先画一个圆

import turtle as t 
t.circle(100)        # 画一个半径为100的圆
t.done()         # 等效于t.done()
那如果希望turtle按顺时针方向绘制,应该怎样实现?
很简单,将t.circle(100)中的参数100改为-100即可,也就是t.circle(-100)。
import turtle as t
t.circle(100, 120)   # 画一段120度的弧线
t.penup()            # 抬起笔来
t.goto(0, 0)         # 回到圆点位置
t.left(90)     # 向上画
t.pendown()          # 落笔,开始画
t.circle(-100, 120)  # 画一段120度的弧线
t.done()

画一条蛇

import turtle as t
t.penup()                 # 抬起笔
t.goto(-150, 0)         # 到起始点
t.pensize(25)           # 设置画笔粗细
t.pencolor('green')    # 设置画笔颜色
t.left(45)                 # 画笔向左转45度
t.pendown()             # 落下画笔
t.circle(-50, 90)       # 顺时针方向画90度的弧线
t.circle(50, 90)         # 继续按逆时针方向画弧
t.circle(-50, 90)       # 顺时针方向画90度的弧线
t.circle(50, 90)         # 继续按逆时针方向画弧
t.circle(-50, 90)       # 顺时针方向画90度的弧线
t.circle(50, 90)        # 继续按逆时针方向画弧
t.circle(-50, 90)      # 顺时针方向画90度的弧线
t.circle(50, 45)        # 继续按逆时针方向画弧
t.forward(50)         # 向前走50个单位
t.circle(10, 160)      # 继续画一个160度的小弧
t.forward(8)           # 再向前伸一点
t.done()


二、递归算法
翻转字符串

def reverse_str(st):
    # TODO
    # 完成函数的定义,函数的功能是将st中的内容倒置
    if len(st) == 1:
        return st[0]
    else:
        return st[-1] + reverse_str( st[:-1] )
print(reverse_str("你是年少的欢喜"))

递归树枝

import turtle as t
def branch(plist, len):  # 自定义函数,画树枝
    if len > 16:  # 递归的退出条件,树枝的长度小于16时退出
        pen_list = []  # 新画笔列表,注意,每次递归都会重新创建一个空列表
        for i in plist:
            # 遍历原画笔列表
            # 第一次进入函数时,列表中只有一支画笔,递归时(第二次进入函数),树枝有两叉,所以有两支画笔,以此类推
            i.forward(len)  # 原画笔划过树枝长度个单位
            p = i.clone()  # 克隆一支画笔
            i.left(65)  # 原画笔左转65度
            p.right(65)  # 克隆的新画笔右转65度
            pen_list.append(i)  # 将画笔 i 存入新画笔列表 pen_list
            pen_list.append(p)  # 将话题 p 存入新画笔列表 pen_list
        branch(pen_list, len * 0.65)  # 递归,pen_list为新画笔列表,树枝长为上一层的65%
# 创建原画笔
# 按照绘制树干基础部分的方法
t.penup()
t.goto(0, -200)
t.left(90)
t.pensize(7)
t.pencolor('green')
t.pendown()
original_pen_list = [t]  # 将原画笔添加到画笔列表中
branch(original_pen_list, 200)
t.done()

总结

t.pendown()、t.forward()、t.penup()、t.done()可以分别控制画笔落下、前进、抬起、完成。
向左转90度,我们用turtle中的left(90),向右转30度,我们用right(30),括号中是旋转的角度。
我们也可以设置画笔的属性,包括画笔的颜色、宽度、移动速度、填充颜色。
turtle界面默认的坐标系为:正东方向(向右)作为0°,并按逆时针方向旋转,坐标系中的每个点也可以用坐标的形式表示。

图片.png


练习:奥运五环

import turtle as t
t.pensize(10)           # 设置画笔粗细

def hua(x,y,r=100,color='green'):
    global t
    t.pencolor(color)  # 设置画笔颜色
    t.penup()
    t.goto(x, y)
    t.pendown()
    t.circle(100)  # 画一个半径为150的圆

hua(-150, 0, color='blue')
hua(0,0, color='black')
hua(150,0, color='red')
hua(-75, -100, color='yellow')
hua(75, -100, color='green')

t.done()


练习:太极图

import turtle as t
t.pencolor('black')  # 设置画笔颜色

t.fillcolor('black')      # 设置填充的颜色
t.begin_fill()           # 开始填充
t.penup()
t.goto(0, -150)
t.pendown()
t.circle(150,180)
t.end_fill()             # 结束填充

t.fillcolor('white')      # 设置填充的颜色
t.begin_fill()           # 开始填充
t.circle(150,180)
t.end_fill()             # 结束填充

t.fillcolor('black')      # 设置填充的颜色
t.begin_fill()           # 开始填充
t.penup()
t.goto(0, 0)
t.pendown()
t.left(180)
t.circle(-75,180)
t.end_fill()             # 结束填充


t.fillcolor('white')      # 设置填充的颜色
t.begin_fill()           # 开始填充
t.penup()
t.goto(0, 0)
t.pendown()
t.circle(-75,180)
t.end_fill()             # 结束填充

t.fillcolor('white')      # 设置填充的颜色
t.begin_fill()           # 开始填充
t.penup()
t.goto(0, 100)
t.pendown()
t.circle(25)
t.end_fill()             # 结束填充

t.fillcolor('black')      # 设置填充的颜色
t.begin_fill()           # 开始填充
t.penup()
t.goto(0, -50)
t.pendown()
t.circle(25)
t.end_fill()             # 结束填充

t.done()


关键字python python教程