在实现动态时钟时,需要使用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
2019 年
10 月
11 日
9 时
25 分
35 秒
665185 微秒
(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() # 不关闭窗体