Python实训2--时钟程序

今天来继续更新学习过程,完成了剩余的包含绘制表针,根据系统时间动态更新的功能

import turtle
from datetime import *


# 抬起画笔,向前运动一段距离放下
def Skip(step):
	turtle.penup()
	turtle.forward(step)
	turtle.pendown()


# 绘制表盘
def SetupClock():
	# 关闭绘图动画
	turtle.tracer(False)
	# 设置画笔属性
	turtle.pencolor("brown")
	turtle.pensize(7)

	# 画60个点
	for i in range(60):
		# 将画笔移动到半径的位置
		Skip(160)
		# 判断是画线还是画点
		if i % 5 == 0:
			# 画线
			turtle.forward(20)
			# 编辑阿拉伯数字
			number = int(i / 5)
			number = 12 if number == 0 else number
			# 5、6、7三个刻度需要向外移动
			if (number == 5) or (number == 7):
				# 将画笔外移20像素
				Skip(20)
				# 写阿拉伯数字
				turtle.write(number, align="center", font=("Courier", 14, "bold"))
				# 还原画笔位置
				Skip(-20)
			elif number == 6:
				# 将画笔外移25像素
				Skip(25)
				# 写阿拉伯数字
				turtle.write(number, align="center", font=("Courier", 14, "bold"))
				# 还原画笔位置
				Skip(-25)
			else:
				turtle.write(number, align="center", font=("Courier", 14, "bold"))
			# 将画笔还原到画线的起始位置
			Skip(-20)
		else:
			# 画点
			turtle.dot(5)
		# 将画笔再移动到原始位置
		Skip(-160)
		# 方向旋转6度
		turtle.right(6)
	# 开启绘图动画
	turtle.tracer(True)


# 创建指针形状
def mkHand(name, length):
	# 在创建形状之前,先清空窗口
	turtle.reset()
	# 确定指针尾部位置
	Skip(-length * 0.1)
	# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
	turtle.begin_poly()
	# 绘制线段
	turtle.forward(length * 1.1)
	# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
	turtle.end_poly()
	# 返回最后记录的多边形。
	handForm = turtle.get_poly()
	# 将handForm进行注册
	turtle.register_shape(name, handForm)


# 初始化表针
def Init():
	global secHand, minHand, hurHand, printer
	turtle.tracer(False)
	# 创建秒针、分针和时针三个指针形状
	mkHand("secHand", 135)
	mkHand("minHand", 125)
	mkHand("hurHand", 90)
	# 创建分别表示秒针、分针和时针的三个小乌龟
	secHand = turtle.Turtle()
	secHand.shape("secHand")
	minHand = turtle.Turtle()
	minHand.shape("minHand")
	hurHand = turtle.Turtle()
	hurHand.shape("hurHand")
	# 设置形状大小,并关闭绘图动画
	for hand in secHand, minHand, hurHand:
		hand.shapesize(1, 1, 3)
		hand.speed(0)
	# 建立输出文字Turtle
	printer = turtle.Turtle()
	# 隐藏画笔的turtle形状
	printer.hideturtle()
	printer.penup()

	turtle.tracer(True)
	# 清空窗口,重新设置
	turtle.reset()


def Week(t):
	week = ["星期一", "星期二", "星期三",
			"星期四", "星期五", "星期六", "星期日"]
	return week[t.weekday()]


def Date(t):
	y = t.year
	m = t.month
	d = t.day
	return "%s-%d-%d" % (y, m, d)


# 调整表针方向
def Tick():
	# 获取当前时间
	t = datetime.today()
	second = t.second + t.microsecond * 0.000001
	minute = t.minute + second / 60.0
	hour = t.hour + minute / 60.0
	# 调整指针的方向
	secHand.setheading(6 * second)
	minHand.setheading(6 * minute)
	hurHand.setheading(30 * hour)
	# 修改表盘上的日期
	turtle.tracer(False)  # 关闭绘图动画
	printer.forward(65)
	printer.write(Week(t), align="center", font=("Courier", 14, "bold"))
	printer.back(130)
	printer.write(Date(t), align="center", font=("Courier", 14, "bold"))
	printer.home()  # 移动到原点
	turtle.tracer(True)  # 开启绘图动画
	# 定时器
	turtle.ontimer(Tick, 100)


if __name__ == "__main__":
	# 设置乌龟模式为logo,即初始向上,正角度为顺时针
	turtle.mode('logo')
	# 初始化指针
	Init()
	# 调用绘制表盘函数
	SetupClock()
	# 调整表针方向
	Tick()
	# 等待用户操作,不自动关闭窗口
	turtle.mainloop()

发布了58 篇原创文章 · 获赞 145 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/pengxiang1998/article/details/90403781