跳至正文
View Categories

1 min read

主要内容 #

  1. 综合应用:参照python -m turtledemo的clock模型,制作自己的时钟

4.时钟的动画设置 #

上两节课我们完成了时钟钟盘以及钟针的绘制,以及时钟的时间获取和展示,接下来只需要合理的设置钟针的动画效果,就能完成时钟的制作。 该示例代码无法单独完成运行,仅作为钟针动画设置讲解,示例2有运行示例
while True:
    t=time.localtime()#通过无限循环不断获得目前时间
    myturtle[0].setheading(t.tm_sec*6)#设置秒针旋转角度,每秒旋转6度
    myturtle[1].setheading(t.tm_min*6)#设置分针针旋转角度,每分旋转6度
    myturtle[2].setheading((t.tm_hour+t.tm_min/60)*30)#设置时针旋转角度,每小时旋转30度

5.时钟的完整制作 #

通过frame(radius),inithand(radius),mytime(radius)三个主要函数,以及mymove(x,y),myregisiter(name, length)两个辅助函数我们完成了钟盘的制作,表针的制作以及设置,时间的展示。再通过while True的无限循环完成了钟针的动画设置。 在这些函数定义和使用中,列表是我们使用的主要数据类型,循环和分支结构的使用,使我们的代码更加清晰明了。
import turtle
import time
########################
def mymove(x,y):#定义mymove函数,功能是让turtle画笔移动到指定位置
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
def frame(radius):#定义frame函数,该函数有一个参数表示钟盘的半径
    turtle.mode('logo')#采用logo模式
    num=[12]+[i for i in range(1,12)]#num列表,两个列表的链接表示钟盘的数字
    turtle.pensize(7)
    for i in range(60):#实际钟盘有60个格子,我们使用60次循环完成绘制
        turtle.penup();turtle.forward(radius);turtle.pendown()#每次循环开始我们先把画笔移动到钟盘半径处
        if i % 5 == 0:#每绘制5个小格时到了整点数,我们做一个长度为20的标记
            turtle.forward(20)
            if  i//5<=4 or i//5>=8:#此层判断语句,是为了调整点数5,6,7的位置,可以尝试不加试一试效果
                turtle.write('%d'%(num[i//5]),align='center',font=("Courier", 18, "bold"))
            else:
                turtle.penup();turtle.forward(25);turtle.pendown()
                turtle.write('%d'%(num[i//5]),align='center',font=("Courier", 18, "bold"))
            mymove(0,0)
        else:
            turtle.dot(5)#如果不是正点数,我们用一个直径为5的点表示
            mymove(0,0)#每次做完标记回到时钟中心,这里的中心是(0,0)
        turtle.right(6)#每个小格代表360/60=6度,旋转6度完成下次循环中一个小格的绘制
def myregisiter(name, length):#name和length分别表示需要注册表针的名字和大小
    mymove(0,0)
    turtle.penup()#形状注册时我们一般抬起画笔,只需注册相应形状即可
    turtle.hideturtle()#隐藏画笔
    turtle.forward(-length * 0.1)
    turtle.begin_poly()#开始记录多边形
    turtle.forward(length * 1.1)
    turtle.end_poly()#结束记录多边形
    p = turtle.get_poly()#得到多边形,完成注册
    turtle.register_shape(name, p)
def inithand(radius):#定义inithand(radius)函数,radius表示钟盘半径大小,返回值是已经初始化好的钟针列表
    myturtle = [turtle.Turtle() for i in range(3)]#钟针画笔列表
    myshape = ["secHand", "minHand", "hourHand"]#钟针画笔名字列表
    for i in range(3):
        myregisiter(myshape[i], radius-10 - i * 20)#注册表针形状,长度秒针>分针>时针
        myturtle[i].shape(myshape[i])#设置表针画笔的形状
        myturtle[i].shapesize(1, 1, i*2)#设置表针粗细
        myturtle[i].setheading(i*90)#初始化钟针的角度时间是6:15,结合钟表想一想为什么是6:15
    return myturtle #返回钟针列表 
def mytime(radius):#定义mytime(radius)函数,radius表示时钟半径
    t = time.localtime()#获取当地时间
    week = ["星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"]
    mymove(0,radius/3)
    turtle.write(week[t.tm_wday], align="center",font=("Courier", 14, "bold"))#写入周几
    mymove(0,-radius/1.3)
    turtle.write('%d'%t.tm_year+' '+'%d'%t.tm_mon+' '+'%d'%t.tm_mday,\
                 align="center",font=("Courier", 14, "bold"))#写入年月日
########################
turtle.tracer(False)
radius=100
frame(radius)#调用表盘绘制函数
myturtle=inithand(radius)#调用表针初始化函数,并返回注册好的钟针列表
mytime(radius)#调用时间展示函数
turtle.tracer(True)
#钟针动画设置
while True:
    t=time.localtime()#通过无限循环不断获得目前时间
    myturtle[0].setheading(t.tm_sec*6)#设置秒针旋转角度,每秒旋转6度
    myturtle[1].setheading(t.tm_min*6)#设置分针针旋转角度,每分旋转6度
    myturtle[2].setheading((t.tm_hour+t.tm_min/60)*30)#设置时针旋转角度,每小时旋转30度
turtle.done()

习题 #

  1. 链接python turtle是python的参考文库,打开链接找到其中title()函数的用法,给我们的时钟加上你喜欢的标题
  2. OJ训练题 #

    1、零花钱问题 – ★
    2、国王的金币 – ★
    3、小明的游泳时间 – ★★
    4、素数问题 – ★★
    5、玫瑰花圃 – ★★★