时钟是我们日常生活中最常见的也是必不可少的东西,你有没有想过用 Python 来画一个实时动态的时钟呢?下面我们来看看如何使用简单的代码实现一个动态时钟吧!

海龟绘图介绍

Turtle 库是 Python 语言中一个很流行的绘制图像的函数库,虽然不知道为什么叫海龟这么奇怪的名字,但是可以根据这个名字联想到我们在操控一直海龟在 x 和 y 轴的二元坐标系上爬行,爬过的轨迹就是我们绘制的线条。从这个角度看,作者也是一个很有意思的人。

操纵海龟绘图有着许多的命令,这些命令可以划分为三种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

画笔运动命令

画笔控制命令

全局控制命令

其他命令

整体思路

了解了海龟绘图的命令后,我们下面来整理一下我们的绘图思路。

我们知道,一个时钟是由表盘和时针组成。

表盘是由刻度组成,一共有60个刻度,对应着一个圆的60个点,每隔4个刻度都会有一个刻度是条短线,每逢5的倍数刻度都会标有小时数(1-12)。

指针有三根,分别为秒针、分针和时针,三根指针长度由短及长。秒针走一圈,分针走一个刻度,分针走一圈,时针走一个刻度。

另外,我们还可以在表盘中显示星期和日期。

这样,我们这个时钟的元素就清晰了,包括表盘(60个刻度以及小时数)、指针(三根)、星期和日期。

代码实现

代码

确定了思路之后,我们开始运用海龟绘图的命令来绘制图像。整体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132import turtle

from datetime import *

# 抬起画笔,向前运动一段距离放下def skip(step):

turtle.penup()

turtle.forward(step)

turtle.pendown()

def mkHand(name, length):

# 注册Turtle形状,建立表针Turtle turtle.reset()

# 先反向运动一段距离,终点作为绘制指针的起点 skip(-length * 0.1)

# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。 turtle.begin_poly()

turtle.forward(length * 1.1)

# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 turtle.end_poly()

# 返回最后记录的多边形。 handForm = turtle.get_poly()

turtle.register_shape(name, handForm)

def init():

global secHand, minHand, houHand, printer

# 重置Turtle指向北 turtle.mode("logo")

# 建立三个表针Turtle并初始化 mkHand("secHand", 135)

mkHand("minHand", 125)

mkHand("houHand", 90)

secHand = turtle.Turtle()

secHand.shape("secHand")

minHand = turtle.Turtle()

minHand.shape("minHand")

houHand = turtle.Turtle()

houHand.shape("houHand")

for hand in secHand, minHand, houHand:

hand.shapesize(1, 1, 3)

hand.speed(0)

# 建立输出文字Turtle printer = turtle.Turtle()

# 隐藏画笔的turtle形状 printer.hideturtle()

printer.penup()

# 绘制表盘def setupClock(radius):

# 建立表的外框 turtle.reset()

turtle.pensize(7)

for i in range(60):

# 向前移动半径值 skip(radius)

if i % 5 == 0:

# 画长刻度线 turtle.forward(20)

# 回到中心点 skip(-radius - 20)

# 移动到刻度线终点 skip(radius + 20)

# 下面是写表盘刻度值,为了不与划线重叠,所以对于特殊位置做了处理 if i == 0:

turtle.write(int(12), align="center", font=("Courier", 14, "bold"))

elif i == 30:

skip(25)

turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))

skip(-25)

elif (i == 25 or i == 35):

skip(20)

turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))

skip(-20)

else:

turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))

# 回到中心点 skip(-radius - 20)

else:

# 画圆点 turtle.dot(5)

skip(-radius)

# 顺时针移动6° turtle.right(6)

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)

houHand.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)

# 100ms后继续调用tick turtle.ontimer(tick, 100)

def main():

# 打开/关闭龟动画,并为更新图纸设置延迟。 turtle.tracer(False)

init()

setupClock(160)

turtle.tracer(True)

tick()

turtle.mainloop()

if __name__ == "__main__":

main()

代码讲解

这里我们讲解一下代码里面的几个方法。

skip() 方法是一个公用方法,用于抬起画笔,向前移动一段距离,然后放下画笔。

mkHand() 方法是画指针的方法,思路是从表盘的中心点出发,先反向运动一段距离,终点作为绘制指针的起点,然后再向中心点画线作为指针。

setupClock() 方法是绘制表盘,绘制表盘主要注意每到第5个刻度需要绘制短线以及标注小时数。

tick() 方法是实现我们动态时钟的关键方法,它在初始化时钟的基础上,一方面是显示表盘中的星期和日期信息,另一方面通过定时刷新指针位置来达到实时显示的效果。

init() 方法是初始化时钟信息,包括指针和表盘上的星期、日期信息。

最后,我们在 main() 方法中调用了 Tkinter 的 mainloop 函数来启动事件循环,它必须是乌龟图形程序中的最后一个语句。

运行结果

直接运行程序,你会看到一个弹出窗口,上面就是我们绘制的动态时钟了,指针是在走动的哦!

总结

本文通过使用海龟绘图实现了一个动态刷新的时钟,代码本身并不复杂,重要的是实现的思路。如果你觉得有意思,赶紧点在看分享给身边的小伙伴吧!

示例代码 (https://github.com/JustDoPython/python-examples/tree/master/xianhuan/drawclock)

python绘制动态数字时钟_用 Python 画动态时钟相关推荐

  1. python绘制二维图形_使用python绘制二维图形示例

    我就废话不多说了,直接上代码吧! import matplotlib.pyplot as plt #也可以使用 import pylab as pl import matplotlib.font_ma ...

  2. 用python绘制树和森林_使用Python的Turtle库绘制森林的实例

    这是由一个小作业引发的对Python的Turtle库的学习 下面是官方手册: 1.配置编程环境 由于现在的笔记本是临时借的,编程环境不是熟悉的环境,又由于种种原因没有安装成功Anaconda,就尝试了 ...

  3. python 绘制k线图_利用python numpy+matplotlib绘制股票k线图的方法

    一.python numpy + matplotlib 画股票k线图 # -- coding: utf-8 -- import requests import numpy as np from mat ...

  4. python绘制繁花曲线代码_使用python和pygame绘制繁花曲线的方法

    前段时间看了一期<最强大脑>,里面各种繁花曲线组合成了非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意绘制, ...

  5. python字母变成数字怎么办_在Python中将字母转换为数字

    14 个答案: 答案 0 :(得分:71) 这样的事情: print [ord(char) - 96 for char in raw_input('Write Text: ').lower()] 修改 ...

  6. python文件名按数字排序_用Python按照文件的名字中包含的数字排序出文件

    使用Python按照文件的名字中包含的数字排序出文件 原来的样式: file_list = ['第10周成绩.xlsx', '第11周成绩.xlsx', '第12周成绩.xlsx', '第13周成绩. ...

  7. python绘制国内生产总值散点图_用Python分析国民生产总值

    今天学习Python的matplotlib,书上的一道例题感觉写的很好(黄红梅的Python数据分析与应用),就是 利用matplotlib的各种图来对2000-2017年季度生产总值进行分析,这道题 ...

  8. 怎样用python绘制简单的图形_用python 画几个简单图案

    原博文 2019-11-15 09:44 − 1 turtle turtle这个库真的很好玩,用很简单几行代码就能画出好看的图案,最近无聊翻了翻之前自己画的哈哈哈哈,分享几个代码 画一个类似五颜六色的 ...

  9. python绘制繁花曲线代码_使用python和pygame绘制繁花曲线

    前段时间看了一期<最强大脑>,里面各种繁花曲线组合成了非常美丽的图形,一时心血来潮,想尝试自己用代码绘制繁花曲线,想怎么组合就怎么组合. 真实的繁花曲线使用一种称为繁花曲线规的小玩意绘制, ...

  10. python绘制自己的名字_用Python做世界名画合成

    原标题:用Python做世界名画合成 如今,随着深度学习技术逐渐成为人工智能的研究热潮,python这门编程语言的热度也不断的提升,甚至一度超越Java,成为第一热门编程语言. 今天小编就带领大家,利 ...

最新文章

  1. c语言中switch语句流程图_C语言:C语言保留字(关键字)
  2. 生态学研究方法(一)
  3. 2020阿里云双12-企业飞天会员年终盛典全攻略
  4. 已知a类被打包在packagea_2021考研干货:199管理类联考综合逻辑归纳习题(1)
  5. python读取txt文件每一行存为列表,从txt文件中读取一定数量的行,并以python方式转换为list...
  6. channel c3 disabled, job failed on it will be run on another channel
  7. 安装Windows10操作系统
  8. 智能猫眼背后场景数据,助力把好居家安防第一关
  9. 【计算机毕业设计】小型OA系统设计与实现Springboot
  10. 触动精灵 获取外网IP
  11. IntelliJ Idea 下Png图片打开方式导致编码报错
  12. 醋醋SEO基础入门教程_seo入门基础知识
  13. 关于for丶foreach丶iterator 迭代器
  14. 串口转 HID 键盘鼠标芯片 CH9329
  15. 五位本科生4个月造出芯片毕业!新的后续来了……
  16. 单项选择标准化考试系统
  17. 抽中H1B回国有风险? 还没消息代表没中签? H1B审理期间常见问题解答
  18. 我写CSS的常用套路(附demo的效果实现与源码)
  19. 【NC65】主子表单据按照单表结构展现 节点客开
  20. jvm 之 国际酒店 6月25日上线内存溢出原因

热门文章

  1. 个人计算机系统的不稳定原因,cpu使用率忽高忽低怎么办 电脑cpu使用率不稳定原因分析【详解】...
  2. 国外问卷调查赚钱网站
  3. java 优酷视频缩略图_通过正则表达式获取优酷视频缩略图
  4. 华为最美小姐姐,被外派墨西哥后...
  5. 普通话测试-短文60篇文章,附带拼音(41-50篇)
  6. 人脸关键点检测PFLD论文解读
  7. java8收费_java8为什么要收费?
  8. matlab中solver函数_Matlab中solve函数用法详解
  9. java课题研究方法和技术途径_课题研究的基本方法有哪些?
  10. PPT——背景图格式(排版)和字体排版