turtle
是 Python 的一个标准库模块,它提供了一个绘图板(通常称为画布)和一个小海龟(Turtle),你可以控制这个小海龟在画布上移动,从而绘制出各种图形和图案。这个模块非常适合初学者学习编程,因为它提供了一种直观的方式来理解程序的执行流程,同时也可以用来教授编程的基本概念,如循环、条件判断和函数等。
以下是 turtle
模块的一些基本功能和用法:
-
初始化画布和Turtle:当你导入
turtle
模块并创建一个 Turtle 对象时,会自动打开一个窗口,显示一个空白的画布和一个起点在画布中心的小海龟。 -
移动Turtle:你可以使用
forward()
、backward()
、left()
和right()
等方法来控制小海龟的移动。 -
绘制图形:通过移动小海龟并绘制线条,你可以绘制出各种图形,如正方形、圆形、多边形等。
-
提升和放下笔:使用
penup()
方法可以提升笔,使小海龟移动时不绘制线条;pendown()
方法可以放下笔,恢复绘制。 -
改变画笔大小和颜色:
pensize()
方法可以改变绘制线条的粗细,color()
方法可以改变线条的颜色。 -
循环和重复:你可以使用循环结构来重复绘制相同的图案或图形,创建复杂的图案。
-
定义形状:
turtle
允许你定义和使用自定义形状,这可以通过register_shape()
方法实现。 -
事件循环:
mainloop()
或done()
方法会启动turtle
的事件循环,使程序保持运行状态,直到你关闭窗口。 -
动画效果:通过控制小海龟的移动速度和绘制动作,你可以创建动画效果。
turtle
模块的这些功能使得它成为一个强大的工具,可以用来创建艺术作品、教学演示、游戏原型等。它也是许多编程入门课程和教材中的常用工具。
import turtle # 导入绘图海龟模块
import datetime # 导入日期时间模块
# 移动一段距离
def skip(distance): # 移动方法,不留移动痕迹
turtle.penup() # 抬笔不绘制
turtle.forward(distance) # 移动指定距离
turtle.pendown() # 落笔移动绘制
def draw_clock_dial(): # 绘制表盘的方法
turtle.reset() # 删除图形归位
turtle.hideturtle() # 隐藏箭头
for i in range(60): # 循环执行60次,一圈为360度所以每一秒的角度为6度
skip(160) # 移动160,相当于表盘圆的半径
# 每5秒绘制一个小时刻度
if i % 5 == 0:
turtle.pensize(7) # 刻度大小
# 画时钟
turtle.forward(20) # 小时刻度的长度为20
# if i == 0: # 判断第一个位置为12点
# # 写入数字12
# turtle.write(12, align='center', font=('Courier', 14, 'bold'))
# elif i == 25 or i == 30 or i == 35: # 5、6、7
# skip(25) # 避免与刻度重叠,所以多移动一段距离
# # 根据i除以5获取,5点、6点、7点并写入对应的数字
# turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))
# skip(-25) # 回到原位置
# else:
# # 根据i除以5获取其它时间的数字并写入
# turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))
skip(-20) # 复原小时刻度的位置
else:
turtle.pensize(1) # 将画笔大小设置为1
turtle.dot() # 绘制分钟刻度的小圆点
skip(-160) # 回到中心位置
turtle.right(6) # 向右旋转6度
def get_week(t): # 获取星期的方法
week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
return week[t.weekday()] # 返回当天的星期
def create_pointer(length, name): # 创建指针方法
turtle.reset() # 删除图形归位
skip(-length * 0.1) # 抬笔移动指定距离
turtle.begin_poly() # 记录多边形
turtle.forward(length * 1.1) # 绘制指定长度的指针
turtle.end_poly() # 停止记录多边形
# 注册多边形状
turtle.register_shape(name, turtle.get_poly())
def init_pointer(): # 初始化指针
global secHand, minHand, hurHand, printer
turtle.mode("logo") # 重置Turtle指向上
create_pointer(135,"secHand") # 创建秒针图形
create_pointer(110,"minHand") # 创建分针图形
create_pointer(90,"hurHand") # 创建时针图形
secHand = turtle.Turtle() # 创建秒针turtle对象
secHand.shape("secHand") # 创建指定秒针名称的形状
minHand = turtle.Turtle() # 创建分针turtle对象
minHand.shape("minHand") # 创建指定分针名称的形状
hurHand = turtle.Turtle() # 创建时针turtle对象
hurHand.shape("hurHand") # 创建指定时针名称的形状
for hand in secHand, minHand, hurHand: # 循环遍历三个指针
hand.shapesize(1, 1, 5) # 设置形状拉伸大小和轮廓线
hand.speed(0) # 设置速度为最快
printer = turtle.Turtle() # 创建绘制文字的Turtle对象
printer.hideturtle() # 隐藏箭头
printer.penup() # 抬笔
def move_pointer(): # 移动指针的方法
# 不停的获取时间
t = datetime.datetime.today()
second = t.second + t.microsecond * 0.000001 # 计算移动的秒
minute = t.minute + second/60 # 计算移动的分
hour = t.hour + minute/60 # 计算移动的小时
secHand.setheading(6*second) # 设置秒针的角度
minHand.setheading(6*minute) # 设置分针的角度
hurHand.setheading(30*hour) # 设置时针的角度
turtle.tracer(False) # 关闭绘画效果
printer.forward(65) # 向上移动65
# 绘制星期
printer.write(get_week(t), align="center",font=("Courier", 14, "bold"))
printer.back(130) # 倒退130
# 绘制年月日
printer.write(t.strftime('%Y-%m-%d'), align="center",font=("Courier", 14, "bold"))
printer.home() # 归位
turtle.tracer(True) # 开启绘画效果
turtle.ontimer(move_pointer, 10) # 10毫秒后调用move_pointer()方法
if __name__ == '__main__':
turtle.setup(450, 450) # 创建窗体大小
init_pointer() # 调用初始化指针的方法
turtle.tracer(False) # 关闭绘画效果
draw_clock_dial() # 绘制表盘
move_pointer() # 调用移动指针的方法
turtle.mainloop() # 不关闭窗体
下面是代码的主要功能和组成部分的解释:
-
导入模块:程序开始处导入了
turtle
模块用于绘制图形,以及datetime
模块用于获取当前时间。 -
辅助函数:
skip(distance)
:移动海龟指定的距离,但不绘制线条。draw_clock_dial()
:绘制时钟的表盘,包括60个刻度。
-
绘制表盘:使用
for
循环绘制表盘上的刻度,每5秒一个长刻度,其它为短刻度。 -
获取星期:
get_week(t)
函数根据提供的日期时间对象t
返回对应的星期名称。 -
创建指针:
create_pointer(length, name)
函数用于创建时钟指针的形状,并通过turtle.register_shape
注册为turtle
可以使用的形状。 -
初始化指针:
init_pointer()
函数初始化秒针、分针和时针的turtle
对象,并设置它们的形状和大小。 -
移动指针:
move_pointer()
函数不断更新时钟指针的位置以反映当前时间。它使用datetime.datetime.today()
获取当前时间,并计算出秒针、分针和时针应该指向的角度。然后,它更新指针的位置,并绘制当前的星期和日期。 -
主程序:在程序的主部分,设置窗体大小,调用初始化指针的函数,绘制表盘,启动指针移动,并进入主循环以保持窗体打开。
这个程序创建了一个图形界面,显示了一个动态更新的时钟,包括时针、分针、秒针,以及当前的星期和日期。指针的移动是通过定时器函数 turtle.ontimer
实现的,它每10毫秒调用一次 move_pointer()
函数来更新时钟。