目录
1.Turtle库的简介
Turtle库,作为Python的标准库之一,通过其直观的海龟绘图体系,成为初学者学习编程的热门选择。在计算机等级考试或编程入门课程中,turtle绘图常被用作简单应用的第一题,旨在通过图形化方式教授基础编程概念,激发学习兴趣,培养编程思维和创造力。
2.Turtle的空间坐标体系
(1)绝对坐标体系是以计算机屏幕为基准建立的,其中心点被设定为坐标原点(0,0)。利用Python的turtle库,通过调用 turtle.goto(x, y) 方法,可以精确地指挥海龟(即绘图光标)从当前所在位置直接移动到指定的坐标点(x,y)上,从而实现在屏幕上的精确定位与绘图。
(2)另外一种是海龟坐标,是以海龟本身为参考系,默认的初始方向为0度(水平向右)。通过 turtle.left(angle) 和 turtle.right(angle) 来以海龟为参考系改变方向,其中 angle 为角度。其中需要注意的是 right 可以理解为往右也可以理解成顺时针,反之 left 同理。
例题 1 :使用turtle库的turtle. right() 函数和turtle.fd() 函数绘制一个菱形,边长为200像素,4个内角度数为2个60度和2个120度,效果如图所示。
该题给出的初始代码为:
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle
turtle.right(-30)
___(1)___
turtle.right(60)
turtle.fd(200)
___(2)___
turtle.fd(200)
turtle.right(60)
turtle.fd(200)
turtle.right(120)
从题目给出的初始代码可知,这道题考察的是海龟坐标体系,是以海龟本身为参考系进行方向判断。在海龟坐标中,默认的初始方向为0度(水平向右)。修改后的代码如下:
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle
turtle.right(-30)
turtle.fd(200)
turtle.right(60)
turtle.fd(200)
turtle.right(120)
turtle.fd(200)
turtle.right(60)
turtle.fd(200)
turtle.right(120)
3.Turtle与其他函数的结合
我们在使用turtle绘图的时候,for循环是一个极其有用的工具,它可以帮助我们缩减重复的代码步骤,使绘图过程更加简洁和高效。通过结合range函数,我们可以控制循环的次数,从而精确地控制turtle的移动、旋转或其他绘图操作。
例题 2:使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个每方向为100像素长度的十字形,效果如图所示。
该题给出的初始代码为:
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle
for i in range(4):
turtle.fd(100)
___(1)___(-100)
___(2)___((i+1)*90)
从题目给出的初始代码可知,这道题考察的是与range函数的结合。其中 i 的取值分别为0,1,2,3。因此旋转的角度分别为90,180,270,360。其中我们需要注意的是 turtle.seth() 使用的是绝对角度。修改后的代码如下:
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle
for i in range(4):
turtle.fd(100)
turtle.fd(-100)
turtle.seth((i+1)*90)
当然如果我们不考虑题目提供的代码 ,我们还可以把代码修改为:(但是考试的时候不能替换原始代码)
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle
d = 0
for i in range(4):
turtle.fd(100)
turtle.fd(-100)
d+=90
turtle.seth(d)
4.Turtle绘制多图形结合
我们在使用turtle绘图的时候,有时候在绘制复杂图形的时候需要绘制2个或2个以上的图形,这也是计算机二级中常考的题型。
例题 3:使用turtle库的turtle.fd(函数和turtle.left()函数绘制一个边长为200像素的正方形及一个紧挨四个顶点的圆形。效果如下图所示。
该题给出的初始代码为:
'''
在横线处补充代码,不得修改其它代码
'''
import turtle
turtle.pensize(2)
for i in range(_______(1)_________):
turtle.fd(200)
turtle.left(90)
turtle.left(_______(2)_________)
turtle.circle(_______(3)_________*pow(2,0.5))
从题目给出的初始代码可知,这道题先绘制正方形然后再绘制圆形。需要注意的是,turtle.circle()在绘制圆形的时候,默认方向是朝向x轴正方向。因此修改后的代码如下:
'''
在横线处补充代码,不得修改其它代码
'''
import turtle
turtle.pensize(2)
for i in range(4):
turtle.fd(200)
turtle.left(90)
turtle.left(-45)
turtle.circle(100*pow(2,0.5))
5.Turtle与列表的结合
Turtle(海龟绘图)与列表(List)的结合是Python编程中一个非常有趣且强大的组合。Turtle图形库提供了绘制各种图形的简单方法,而列表作为一种数据结构,能够存储和管理一系列的元素。通过将Turtle绘图与列表相结合,可以创建更加复杂和动态的图形效果。
例题4:根据列表中保存的数据采用turtle库画图直方图,显示输出在屏幕上,效果如下图所示。ls=[69, 292. 33,131.61.254]
该题给出的初始代码为:
# 在____________上补充代码
# 请不要修改其他代码
____________
ls = [69, 292, 33, 131, 61, 254]
X_len = 400
Y_len = 300
x0 = -200
y0 = -100
t.penup()
t.goto(x0, y0)
t.pendown()
t.fd(X_len)
t.fd(-X_len)
t.seth(____________)
t.fd(Y_len)
t.pencolor('red')
t.pensize(5)
for i in range(len(ls)):
t.____________
t.goto(x0 + (i+1)*50, ____________)
t.seth(90)
t.pendown()
t.fd(____________)
t.done()
从题目给出的初始代码可知,这道题我们需要利用海龟绘制一张直方图,而直方图的数据在列表之中。修改后的代码如下:
# 在____________上补充代码
# 请不要修改其他代码
import turtle as t #更简洁地调用turtle库
# 定义一个列表ls,包含了一系列的数字,这些数字将作为后续绘制直线段的长度
ls = [69, 292, 33, 131, 61, 254]
X_len = 400 # 画布在X轴上的长度
Y_len = 300 # 画布在Y轴上的长度
#初始位置
x0 = -200
y0 = -100
# 抬起画笔,移动到初始位置(x0, y0),然后放下画笔
t.penup()
t.goto(x0, y0)
t.pendown()
# 绘制一个水平的参考线,从(x0, y0)到(x0 + X_len, y0)
t.fd(X_len)
t.fd(-X_len)
t.seth(90) #设置笔的起始角度
t.fd(Y_len)
t.pencolor('red')
t.pensize(5)
for i in range(len(ls)):
t.penup() #提起画笔
t.goto(x0 + (i+1)*50, y0) #移到绝对坐标处,这里x坐标动,y坐标不动
t.seth(90)
t.pendown() #放下画笔
t.fd(ls[i]) #表示直线爬行的距离
t.done()
6.Turtle与颜色的填充
在Turtle图形库中, turtle.color()函数用于设置画笔的颜色。这个函数可以接受一个参数或两个参数,具体取决于你想要如何设置颜色。
单参数模式:当你只传递一个参数给 turtle.color() 时,这个参数应该是一个颜色字符串或者是一个颜色代码。这个颜色将同时应用于画笔的填充色和线条色。
双参数模式:你也可以传递两个参数给 turtle.color(),第一个参数是线条色 (pen color),第二个参数是填充色 (fill color)。这样,你就可以分别设置线条和填充区域的颜色了。
例题5:使用turtle库,在屏幕上绘制正方形及其内接圆形。其中,正方形左下角坐标为(0,0),边长为黑色,长度200像素,线宽1像素,内切圆为绿色,线宽5像素,内部以红色填充。示例如下:
该题给出的初始代码为:
# 请在______处补充一行代码
# 请不要修改其他代码
import turtle as t
for i in range(4):
(1) _____________________
t.left(90)
t.penup()
(2)___________________
t.pendown()
(3)___________________
t.pensize(5)
t.begin_fill()
(4)_________________
(5)_________________
t.done()
从题目给出的初始代码可知,这道题先绘制正方形再绘制圆形,最后对圆形进行填充。修改后的代码如下:
# 请在______处补充一行代码
# 请不要修改其他代码
import turtle as t
for i in range(4):
t.forward(200) # 向前移动200个距离单位
t.left(90)
t.penup()
t.goto(100, 0) # 向前移动100个距离单位,该处为正方形内切圆的切点。
t.pendown()
t.color('green', 'red') # 根据题目设置前景色(线条色)和背景色(填充色)
t.pensize(5)
t.begin_fill()
t.circle(100) # 绘制圆形。
t.end_fill() # 结束填充。
t.done()
7.Turtle绘制较为复杂图形
我们在绘制复杂图形时,通常需要编写更长的代码,其中包含多个循环、条件语句以及可能的函数调用来组织代码结构。例如,绘制一个分形图案(如雪花、科赫曲线等)或是一个复杂的螺旋结构,就需要精确控制海龟的移动路径和绘制顺序。此外,还可以利用颜色变化、线宽调整以及填充效果来增强图形的视觉效果。
例题6 :利用random库和turtle库,在屏幕上绘制4个小雪花,雪花的中心点坐标出列表points给出,雪花的半径长度由randint()函数产生。雪花的颜色是红色,效果如下图所示 。
该题给出的初始代码为:
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle as t
import random as r
r.seed(1)
t.pensize(2)
t.____________('red')
angles = 6
points= [[0,0],[50,40],[70,80],[-40,30]]
for i in range(____________):
x0,y0 = points[i]
t.penup()
t.goto(____________)
t.pendown()
length = r.randint(6, 16)
for j in range(angles):
t.____________(length)
t.____________(length)
t.right(360 / angles)
t.done()
从题目给出的初始代码可知,我们需要绘制4个雪花一样的图形。修改后的代码如下:
# 请在______处使用一行代码或表达式替换
# 注意:请不要修改其他已给出代码
import turtle as t
import random as r
r.seed(1)
t.pensize(2)
t.pencolor('red') #设置笔的颜色
angles = 6
points= [[0,0],[50,40],[70,80],[-40,30]]
for i in range(len(points)):
x0,y0 = points[i]
t.penup() #提起画笔,与pendown配对使用
t.goto(x0,y0) #移到绝对坐标处
t.pendown() #放下画笔
length = r.randint(6, 16)
for j in range(angles):
t.forward(length) #沿着当前方向前面指定距离
t.backward(length) #沿着当前相反方向前进指定距离
t.right(360 / angles)
t.done()
8.Turtle总结
Turtle库是Python的一个强大而直观的图形绘制库,通过控制“海龟”在屏幕上的移动和绘图,实现各种图形和图案的绘制。它适合初学者学习编程逻辑和图形界面设计,简单有趣,是Python编程教学中的经典工具。
最后,转载于https://blog.csdn.net/July__July/article/details/99543992,为大家提供一个有趣的皮卡丘绘制方法。
# coding:utf-8
import turtle as t
import time
# 皮卡丘
# 基础设置
t.screensize(800, 600)
t.pensize(2) # 设置画笔的大小
t.speed(10) # 设置画笔速度为10
# 画左偏曲线函数
def radian_left(ang, dis, step, n):
for i in range(n):
dis += step # dis增大step
t.lt(ang) # 向左转ang度
t.fd(dis) # 向前走dis的步长
def radian_right(ang, dis, step, n):
for i in range(n):
dis += step
t.rt(ang) # 向左转ang度
t.fd(dis) # 向前走dis的步长
# 画耳朵
def InitEars():
t.color("black", "yellow")
# 左耳朵曲线
t.pu() # 提笔
t.goto(-50, 100) # 笔头初始位置
t.pd() # 下笔
t.setheading(110) # 画笔角度
t.begin_fill()
radian_left(1.2, 0.4, 0.1, 40)
t.setheading(270) # 画笔角度
radian_left(1.2, 0.4, 0.1, 40)
t.setheading(44) # 画笔角度
t.forward(32)
t.end_fill()
# 右耳朵曲线
t.pu() # 提笔
t.goto(50, 100) # 笔头初始位置
t.pd() # 下笔
t.setheading(70) # 画笔角度
t.begin_fill()
radian_right(1.2, 0.4, 0.1, 40)
t.setheading(270) # 画笔角度
radian_right(1.2, 0.4, 0.1, 40)
t.setheading(136) # 画笔角度
t.forward(32)
t.end_fill()
# 耳朵黑
t.begin_fill()
t.fillcolor("black")
t.pu() # 提笔
t.goto(88, 141) # 笔头初始位置
t.pd() # 下笔
t.setheading(35) # 画笔角度
radian_right(1.2, 1.6, 0.1, 16)
t.setheading(270) # 画笔角度
radian_right(1.2, 0.4, 0.1, 25)
t.setheading(132) # 画笔角度
t.forward(31)
t.end_fill()
t.begin_fill()
t.fillcolor("black")
t.pu() # 提笔
t.goto(-88, 141) # 笔头初始位置
t.pd() # 下笔
t.setheading(145) # 画笔角度
radian_left(1.2, 1.6, 0.1, 16)
t.setheading(270) # 画笔角度
radian_left(1.2, 0.4, 0.1, 25)
t.setheading(48) # 画笔角度
t.forward(31)
t.end_fill()
# 画尾巴
def InitTail():
# 尾巴
t.begin_fill()
t.fillcolor("yellow")
t.pu() # 提笔
t.goto(64, -140) # 笔头初始位置
t.pd() # 下笔
t.setheading(10) # 画笔角度
t.forward(20)
t.setheading(90) # 画笔角度
t.forward(20)
t.setheading(10) # 画笔角度
t.forward(10)
t.setheading(80) # 画笔角度
t.forward(100)
t.setheading(35) # 画笔角度
t.forward(80)
t.setheading(260) # 画笔角度
t.forward(100)
t.setheading(205) # 画笔角度
t.forward(40)
t.setheading(260) # 画笔角度
t.forward(37)
t.setheading(205) # 画笔角度
t.forward(20)
t.setheading(260) # 画笔角度
t.forward(25)
t.setheading(175) # 画笔角度
t.forward(30)
t.setheading(100) # 画笔角度
t.forward(13)
t.end_fill()
# 画脚
def InitFoots():
# 脚
t.begin_fill()
t.fillcolor("yellow")
t.pensize(2)
t.pu() # 提笔
t.goto(-70, -200) # 笔头初始位置
t.pd() # 下笔
t.setheading(225) # 画笔角度
radian_left(0.5, 1.2, 0, 12)
radian_left(35, 0.6, 0, 4)
radian_left(1, 1.2, 0, 18)
t.setheading(160) # 画笔角度
t.forward(13)
t.end_fill()
t.begin_fill()
t.fillcolor("yellow")
t.pensize(2)
t.pu() # 提笔
t.goto(70, -200) # 笔头初始位置
t.pd() # 下笔
t.setheading(315) # 画笔角度
radian_right(0.5, 1.2, 0, 12)
radian_right(35, 0.6, 0, 4)
radian_right(1, 1.2, 0, 18)
t.setheading(20) # 画笔角度
t.forward(13)
t.end_fill()
# 画身体
def InitBody():
# 外形轮廓
t.begin_fill()
t.pu() # 提笔
t.goto(112, 0) # 笔头初始位置
t.pd() # 下笔
t.setheading(90) # 画笔角度
t.circle(112, 180)
t.setheading(250) # 画笔角度
radian_left(1.6, 1.3, 0, 50)
radian_left(0.8, 1.5, 0, 25)
t.setheading(255) # 画笔角度
radian_left(0.4, 1.6, 0.2, 27)
radian_left(2.8, 1, 0, 45)
radian_right(0.9, 1.4, 0, 31)
t.setheading(355) # 画笔角度
radian_right(0.9, 1.4, 0, 31)
radian_left(2.8, 1, 0, 45)
radian_left(0.4, 7.2, -0.2, 27)
t.setheading(10) # 画笔角度
radian_left(0.8, 1.5, 0, 25)
radian_left(1.6, 1.3, 0, 50)
t.end_fill()
def InitEyes():
# 左眼睛
t.begin_fill()
t.fillcolor("black")
t.pu() # 提笔
t.goto(-46, 10) # 笔头初始位置
t.pd() # 下笔
t.setheading(90) # 画笔角度
t.circle(5, 360)
t.end_fill()
# 右眼睛
t.begin_fill()
t.fillcolor("black")
t.pu() # 提笔
t.goto(46, 10) # 笔头初始位置
t.pd() # 下笔
t.setheading(-90) # 画笔角度
t.circle(5, 360)
t.end_fill()
# 画脸
def InitFace():
# 脸蛋
t.begin_fill()
t.fillcolor("red")
t.pu() # 提笔
t.goto(-63, -10) # 笔头初始位置
t.pd() # 下笔
t.setheading(90) # 画笔角度
t.circle(10, 360)
t.end_fill()
t.begin_fill()
t.fillcolor("red")
t.pu() # 提笔
t.goto(63, -10) # 笔头初始位置
t.pd() # 下笔
t.setheading(-90) # 画笔角度
t.circle(10, 360)
t.end_fill()
# 嘴巴
t.pensize(2.2)
t.pu() # 提笔
t.goto(0, 0) # 笔头初始位置
t.pd() # 下笔
t.setheading(235) # 画笔角度
radian_right(5, 0.8, 0, 30)
t.pu() # 提笔
t.goto(0, 0) # 笔头初始位置
t.pd() # 下笔
t.setheading(305) # 画笔角度
radian_left(5, 0.8, 0, 30)
# 画手
def InitHands():
# 左手
t.pensize(2)
t.pu() # 提笔
t.goto(-46, -100) # 笔头初始位置
t.pd() # 下笔
t.setheading(285) # 画笔角度
radian_right(0.4, 1.2, 0, 26)
radian_right(5, 0.35, 0, 26)
radian_right(0.3, 1.2, 0, 15)
# 右手
t.pu() # 提笔
t.goto(46, -100) # 笔头初始位置
t.pd() # 下笔
t.setheading(255) # 画笔角度
radian_left(0.4, 1.2, 0, 26)
radian_left(5, 0.35, 0, 26)
radian_left(0.3, 1.2, 0, 15)
def CloseEyes():
# 左眼睛
t.pu() # 提笔
t.goto(-46, 12) # 笔头初始位置
t.pd() # 下笔
t.setheading(180) # 画笔角度
t.forward(10)
# 右眼睛
t.pu() # 提笔
t.goto(46, 12) # 笔头初始位置
t.pd() # 下笔
t.setheading(0) # 画笔角度
t.forward(10)
# 初始化
def Init():
InitEars()
InitTail()
InitFoots()
InitBody()
InitFace()
InitHands()
InitEyes()
# 眨眼睛
def Upgarde():
InitEars()
InitTail()
InitFoots()
InitBody()
InitFace()
InitHands()
CloseEyes()
def Upgarde_Init():
InitEars()
InitTail()
InitFoots()
InitBody()
InitFace()
InitHands()
InitEyes()
def main():
Init()
t.tracer(False)
# 眨眼睛动画
for i in range(30):
if i % 2 == 0:
t.reset()
t.hideturtle()
Upgarde()
t.update()
time.sleep(0.3)
else:
t.reset()
t.hideturtle()
Upgarde_Init()
t.update()
time.sleep(1)
main()
# 结束画笔
t.done()
祝大家顺利通过计算机二级考试!