Python-使用海龟绘图制作动态时钟

在实现动态时钟时,需要使用python内置的datetime模块与turtle模块。
1.datetime模块

import datetime

(1)datetime模块中datetime类的today()方法,用于返回一个表示当前本地日期时间的datetime对象。

datetime.today()

参数说明:

  • 返回值:返回一个表示当前本地日期时间的datetime对象。

实现获取当前本地日期与时间的示例代码如下:

from datetime import datetime  # 导入datetime模块中的datetime类
dt=datetime.today()         #把获取的当前本地日期时间赋给变量dt
print(dt)                   # 打印当前本地日期时间

输出结果为:

2019-10-11 09:18:35.784341

(2)如果已经获取了当前本地日期时间的datetime对象,此时可以通过该对象的变量名称获取对应的年、月、日、时、分、秒及微秒。

from datetime import datetime  # 导入datetime模块中的datetime类
dt=datetime.today()         #把获取的当前本地日期时间赋给变量dt
print(dt)        # 打印当前本地日期时间
print(dt.year,'年')
print(dt.month,'月')
print(dt.day,'日')
print(dt.hour,'时')
print(dt.minute,'分')
print(dt.second,'秒')
print(dt.microsecond,'微秒')

输出结果为:

2019-10-11 09:25:35.665185
2019101192535665185 微秒

(3)datetime对象中提供了weekday()方法,用于返回指定日期在一周内的序号,即星期几,其中周一表示为0,周日表示为6。:

datetime.weekday()

参数说明:

  • 返回值:返回指定日期在一周内的序号,即星期几,其中周一表示为0,周日表示为6。

实现获取当前本地日期对应星期的示例代码如下:

from datetime import datetime  # 导入datetime模块中的datetime类
week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
dt=datetime.today()         #把获取的当前本地日期时间赋给变量dt
print('当前日期时间为:',dt)
print(week[dt.weekday()])

输出结果为:

当前日期时间为: 2019-10-11 09:46:34.851536
星期五

2.turtle模块
turtle模块是python的内置模块,所以在使用前需要使用import导入该模块。

import turtle

(1)创建游戏窗体可以使用turtle模块中的setup()方法来实现。

turtle.setup(width=_CFG["width"],height=_CFG["height"],startx=_CFG["leftright"],starty=_CFG["topbottom"])

参数说明如下:

  • width:表示窗体的宽度,如果是整数,大小以像素为单位,如果是浮动,则为屏幕的一小部分;默认值为屏幕的50%。
  • height:表示窗体的高度,如果是整数,高度以像素为单位,如果是浮动,则为屏幕的一小部分;默认值为屏幕的75%。
  • startx:表示窗体显示在屏幕的横向位置,如果为正,则以像素为单位从屏幕左边缘开始,如果为负,则从右边缘开始,如果没有,则水平居中窗口。
  • starty:表示窗体显示在屏幕的纵向位置,如果为正,则以像素为单位从屏幕上边缘开始,如果为负,则从下边缘开始,如果没有,则垂直居中窗口。

创建游戏窗体的关键代码如下:

import turtle                          # 导入绘图海龟模块 
turtle.setup(450,450)                  # 创建窗体大小 
turtle.mainloop()                     # 不关闭窗体

(2)turtle模块中的forward()方法,用于实现画笔按照指定方向,移动指定的距离。

turtle.forward(distance)

参数说明如下:

distance:表示需要指定的移动距离(整数或浮点数)。

说明:turtle模块中的fd()方法与forward()方法相同。

实现移动绘制的示例代码如下:

import turtle                 # 导入绘图海龟模块
turtle.forward(50)             # 默认方向移动50,并绘制直线
turtle.mainloop()              # 不关闭窗体


说明:如果仅需要让画笔移动并不进行绘制时,可以在forward()方法前添加抬笔方法penup()、pu()或up()

(3)turtle模块中的forward()方法,用于实现绘制指定直径的点,可设置点的颜色。

turtle.dot(size=None,*color)

参数说明如下:

  • size:表示设置圆点直径的大小。
  • color:表示设置圆点的颜色,该值为字符串类型。

实现绘制圆点的示例代码如下:

import turtle                 # 导入绘图海龟模块
def skip(distance):          # 移动方法,不留移动痕迹
     turtle.penup()           # 抬笔不绘制
     turtle.forward(distance) # 移动指定距离
	 turtle.pendown()         # 落笔移动绘制
if __name__ == '__main__':
	turtle.hideturtle()      # 隐藏箭头
	turtle.dot()             # 默认值圆点
	skip(20)                 # 向前移动20
	turtle.dot(10)           # 指定大小的圆点
	skip(20)                 # 向前移动20
	turtle.dot(15,'red')     # 红色圆点
	turtle.mainloop()        # 不关闭窗体

(4)turtle模块中的right()方法,用于实现向右旋转画笔的角度。

turtle.right(angle)

参数说明如下:

  • angle:表示设置需要旋转的角度。

实现旋转绘制的示例代码如下:

import turtle                 # 导入绘图海龟模块
def skip(distance):          # 移动方法,不留移动痕迹
	turtle.penup()           # 抬笔不绘制
	turtle.forward(distance) # 移动指定距离
	turtle.pendown()         # 落笔移动绘制
if __name__ == '__main__':
	turtle.hideturtle()      # 隐藏箭头
	for i in range(60):
		skip(160)  # 移动160
		turtle.dot(15,'red')     # 红色圆点
		skip(-160)
		turtle.right(6)

(5)turtle模块中的register_shape()方法,用于注册图形。

turtle.register_shape(name,shape=None)

参数说明如下:

  • name:表示注册图形的字符串名称。
  • shape:表示数据结构的建模形状,可以是多边形的坐标元组、图片以及复合形状。

实现注册图形的示例代码如下:

import turtle                 # 导入绘图海龟模块
turtle.begin_poly()            # 开始记录行走位置
for i in range(2):
	turtle.forward(100)            # 向前移动100
	turtle.left(90)                # 向左旋转90度
	turtle.forward(20)             # 向前移动20
	turtle.left(90)                # 向左旋转90度
	turtle.end_poly()                  # 结束记录行走位置
	turtle.register_shape("rectangle", turtle.get_poly())
	turtle.mainloop()                  # 不关闭窗体

(6)turtle模块中的shape()方法,用于将画笔设置为指定图形。

turtle.shape(name=None)

参数说明如下:

name:表示需要设置图形的字符串名称。

实现将画笔设置为乌龟的示例代码如下:

import turtle                 # 导入绘图海龟模块
turtle.shape('turtle')         # 将画笔设置为乌龟
turtle.mainloop()                  # 不关闭窗体

实例

'''
动态时钟
'''
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()            # 不关闭窗体

猜你喜欢

转载自blog.csdn.net/Yuyu920716/article/details/111874382
今日推荐