考点:角度旋转、海龟坐标轴以及简单时间绘图算法【Python习题10】
解析:
以上图片画得不够好,请见谅,主要为了说明两个坐标轴的角度和默认方向。 2.角度旋转主要涉及到两个函数,一个是right函数,一个是setheading函数。这里必须要注意的是setheading函数的角度旋转默认是按照坐标系的方向来的,而right函数是按照实际前进方向的左右来的,right函数跟坐标系没有关系了,因为right已经决定了方向是向右的,类似的向左旋转就使用left函数了。
3.这里要注意的是写文字使用了write函数,这个函数在写的位置是当前点的位置的上方开始的,所以会导致数字位置错位,需要人工主动调整时钟的数字位置。
4.时钟要走起来,就要使用时钟来触发,这里我们直接使用turtle的ontimer事件去触发我们每次要刷新的三个指针,注意,这个函数的第一个参数在调用函数的时候,不要写括号;而第二个参数的单位是毫秒。
5.时钟的算法比较简单的,时分秒都使用系统的时间数值,从datetime库中去获取。计算时,因为一圈是360°,所以每一格就是360/60的度数,每次秒中指针的变化就直接按照这个度数乘以秒数即可。分钟指针也是类似于秒钟。不同的是小时指针,因为1小时的度数是360°/12,所以我们只要求出当前已经从0开始经历了多少小时即可知道应该转过的度数。而当前经历的小时数=实际的小时数+分钟所占的小时数,这里的分钟所占的小时数=实际分钟数/60即可。
运行效果如下图:
以上效果源代码:
# -*- coding: utf-8 -*-
"""
@File文件 : ljytest83
@Time创建时间 : 2021/12/15
@Author作者 : 刘金玉
@Contact联系方式 : selidev@qq.com 编程创造城市 http://bcczcs.com
注:作者信息请保留!否则必究法律责任!
刘金玉编程,编程创造城市!
作者微信号:selidev
作者抖音号:selidev
作者B站:刘金玉编程
微信公众号:编程创造城市
"""
import turtle #导入海龟库
import datetime #导入时间库
#画表盘函数
def drawPlanet():
#画圆
tp = turtle.Pen()
tp.speed(0.1)
# tp.dot(5)
tp.penup()
tp.forward(100)
tp.setheading(-90)
tp.pendown()
# tp.dot(5)
tp.circle(100)
k=0
#画边线
for i in range(60):
tp.penup()
tp.home()
tp.right(i*6)
if i*6%5==0:
tp.forward(80)
else:
tp.forward(90)
tp.pendown()
if i * 6 % 5 == 0:
tp.forward(20)
else:
tp.forward(10)
#数字
tp.penup()
tp.home()
tp.forward(65)
# tp.pendown()
tp.setheading(180)
tp.setpos(tp.pos()[0] - 5, tp.pos()[1]-5)
tp.write(12)
for i in range(0,12):
tp.penup()
tp.home()
# tp.pendown()
tp.right(30 * i)
tp.forward(65)
if i!=0:
tp.setpos(tp.pos()[0]-3,tp.pos()[1]-5)
tp.write(i)
#画指针函数
def drawPointer():
global hpt,mpt,spt,tnpt
cthour=datetime.datetime.now().hour
ctminite=datetime.datetime.now().minute
ctsecond=datetime.datetime.now().second
print(cthour,ctminite,ctsecond)
spt.clear()
spt.home()
spt.dot(5)
spt.setheading(360/60*ctsecond)
spt.pendown()
spt.forward(70)
spt.penup()
mpt.clear()
mpt.home()
mpt.setheading(360/60*ctminite)
mpt.pendown()
mpt.forward(55)
mpt.penup()
hpt.clear()
hpt.home()
cthour=cthour if cthour<12 else cthour-12
hpt.setheading(360/12*(cthour+ctminite/60))
hpt.pendown()
hpt.forward(40)
hpt.penup()
tnpt.clear()
tnpt.penup()
tnpt.home()
tnpt.setheading(0)
tnpt.forward(110)
tnpt.setheading(90)
tnpt.write("北京时间:")
tnpt.forward(60)
tnpt.pendown()
tnpt.write(datetime.datetime.now().strftime("%Y{}%m{}%d{} %H:%M:%S").format("年","月","日"))
turtle.ontimer(drawPointer,100)
turtle.title("刘金玉编程,模拟时钟") #要记得老刘哦!
turtle.mode("logo") #坐标轴模式的设置
turtle.tracer(False) #取消逐步绘制,让其一步到位
drawPlanet()
hpt = turtle.Pen() # 时钟
mpt = turtle.Pen() # 分钟
spt = turtle.Pen() # 秒钟
tnpt=turtle.Pen()#现在时间
drawPointer()
turtle.penup()
turtle.home()
turtle.color("blue")
turtle.write("刘金玉编程")
turtle.hideturtle()
turtle.done()
总结:
本节时钟绘制应该是很重要的知识要点,通过此题的训练,可以达到灵活使用海龟画图的中基本用法,灵活使用坐标轴、定时器,可以为未来绘制动态图形提供逻辑基础。
相关文章: