时钟玩具.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # File : 时钟玩具.py
  4. # Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
  5. # Date : 2022/12/8
  6. '''
  7. 动态时钟附带十二时辰显示
  8. '''
  9. import turtle # 导入绘图海龟模块
  10. import datetime # 导入日期时间模块
  11. # 十二时辰对照表(地支)
  12. dizhi = {
  13. '23': ['子', '胆经当令, 万籁俱静正好眠'],
  14. '0': ['子', '胆经当令, 万籁俱静正好眠'],
  15. '1': ['丑', '肝经当令,肝脏藏血不熬夜'],
  16. '2': ['丑', '肝经当令,肝脏藏血不熬夜'],
  17. '3': ['寅', '肺经当令,肺脏主气好歇息'],
  18. '4': ['寅', '肺经当令,肺脏主气好歇息'],
  19. '5': ['卯', '大肠经当令,大肠当值宜排便'],
  20. '6': ['卯', '大肠经当令,大肠当值宜排便'],
  21. '7': ['辰', '胃经当令,食用早餐正当时'],
  22. '8': ['辰', '胃经当令,食用早餐正当时'],
  23. '9': ['巳', '脾经当令,脾经当值精神足'],
  24. '10': ['巳', '脾经当令,脾经当值精神足'],
  25. '11': ['午', '心经当令,心主神明当小憩'],
  26. '12': ['午', '心经当令,心主神明当小憩'],
  27. '13': ['未', '小肠经当令,畅通血管多喝水'],
  28. '14': ['未', '小肠经当令,畅通血管多喝水'],
  29. '15': ['申', '膀胱经当令,工作学习练身体'],
  30. '16': ['申', '膀胱经当令,工作学习练身体'],
  31. '17': ['酉', '肾经当令,养经两相宜'],
  32. '18': ['酉', '肾经当令,养经两相宜'],
  33. '19': ['戌', '心包经当令,心包当令宜散步谈心'],
  34. '20': ['戌', '心包经当令,心包当令宜散步谈心'],
  35. '21': ['亥', '三焦经当令,温水泡脚助安眠'],
  36. '22': ['亥', '三焦经当令,温水泡脚助安眠']
  37. }
  38. # 获取当前时间
  39. today = datetime.datetime.today()
  40. # 移动一段距离
  41. def skip(distance): # 移动方法,不留移动痕迹
  42. turtle.penup() # 抬笔不绘制
  43. turtle.forward(distance) # 移动指定距离
  44. turtle.pendown() # 落笔移动绘制
  45. def draw_clock_dial(): # 绘制表盘的方法
  46. turtle.reset() # 删除图形归位
  47. turtle.hideturtle() # 隐藏箭头
  48. for i in range(60): # 循环执行60次,一圈为360度所以每一秒的角度为6度
  49. skip(160) # 移动160,相当于表盘圆的半径
  50. # 每5秒绘制一个小时刻度
  51. if i % 5 == 0:
  52. turtle.pensize(7) # 刻度大小
  53. # 画时钟
  54. turtle.forward(20) # 小时刻度的长度为20
  55. if i == 0: # 判断第一个位置为12点
  56. # 写入数字12
  57. turtle.write(12, align='center', font=('Courier', 14, 'bold'))
  58. elif i == 25 or i == 30 or i == 35: # 5、6、7
  59. skip(25) # 避免与刻度重叠,所以多移动一段距离
  60. # 根据i除以5获取,5点、6点、7点并写入对应的数字
  61. turtle.write(int(i / 5), align='center', font=('Courier', 14, 'bold'))
  62. skip(-25) # 回到原位置
  63. else:
  64. # 根据i除以5获取其它时间的数字并写入
  65. turtle.write(int(i / 5), align='center', font=('Courier', 14, 'bold'))
  66. skip(-20) # 复原小时刻度的位置
  67. else:
  68. turtle.pensize(1) # 将画笔大小设置为1
  69. turtle.dot() # 绘制分钟刻度的小圆点
  70. skip(-160) # 回到中心位置
  71. turtle.right(6) # 向右旋转6度
  72. def draw_shichen_clock_dial(shichen): # 绘制十二时辰表盘的方法
  73. today = datetime.datetime.today()
  74. forenoon, afternoon = {}, {}
  75. for i in shichen.items():
  76. if int(i[0]) >= 12:
  77. afternoon[i[0]] = i[1]
  78. else:
  79. forenoon[i[0]] = i[1]
  80. # 做个判断,大于12点用后半日时辰
  81. if today.hour >= 12:
  82. show_shichen_time = afternoon
  83. else:
  84. show_shichen_time = forenoon
  85. for i in show_shichen_time.items(): # 循环执行12次,一圈为360度所以每次的角度为30度
  86. skip(240)
  87. turtle.write(i[1][0], align='center', font=('Courier', 16, 'bold'))
  88. skip(-240) # 回到中心位置
  89. turtle.right(30) # 向右旋转30度
  90. def draw_old_clock_dial(): # 绘制表盘的当前时辰和当值经络
  91. turtle.hideturtle() # 隐藏箭头
  92. skip(100)
  93. turtle.color('red')
  94. shichen = get_sc(today.hour)
  95. turtle.write('当前:' + shichen[0], align='center', font=('Courier', 16, 'bold'))
  96. skip(-380)
  97. turtle.write(shichen[1], align='center', font=('Courier', 16, 'bold'))
  98. skip(280) # 回中心点位置
  99. # 获取时间对应的具体时辰
  100. def get_sc(hour):
  101. shichen = []
  102. if hour >= 0:
  103. hour = str(hour)
  104. shichen.append(dizhi.get(hour)[0] + '时')
  105. shichen.append(dizhi.get(hour)[1])
  106. else:
  107. shichen = '时间参数错误'
  108. return shichen
  109. def get_week(t): # 获取星期的方法
  110. week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
  111. return week[t.weekday()] # 返回当天的星期
  112. def create_pointer(length, name, color='red'): # 创建指针方法
  113. turtle.reset() # 删除图形归位
  114. skip(-length * 0.1) # 抬笔移动指定距离
  115. turtle.begin_poly() # 记录多边形
  116. turtle.forward(length * 1.1) # 绘制指定长度的指针
  117. turtle.end_poly() # 停止记录多边形
  118. # 注册多边形状
  119. turtle.register_shape(name, turtle.get_poly())
  120. def init_pointer(): # 初始化指针
  121. global secHand, minHand, hurHand, printer
  122. turtle.mode("logo") # 重置Turtle指向上
  123. create_pointer(135, "secHand") # 创建秒针图形
  124. create_pointer(110, "minHand") # 创建分针图形
  125. create_pointer(80, "hurHand") # 创建时针图形
  126. secHand = turtle.Turtle() # 创建秒针turtle对象
  127. secHand.shape("secHand") # 创建指定秒针名称的形状
  128. minHand = turtle.Turtle() # 创建分针turtle对象
  129. minHand.shape("minHand") # 创建指定分针名称的形状
  130. hurHand = turtle.Turtle() # 创建时针turtle对象
  131. hurHand.shape("hurHand") # 创建指定时针名称的形状
  132. for hand in secHand, minHand, hurHand: # 循环遍历三个指针
  133. hand.shapesize(1, 1, 5) # 设置形状拉伸大小和轮廓线
  134. hand.speed(0) # 设置速度为最快
  135. printer = turtle.Turtle() # 创建绘制文字的Turtle对象
  136. printer.hideturtle() # 隐藏箭头
  137. printer.penup() # 抬笔
  138. def move_pointer(): # 移动指针的方法
  139. # 不停的获取时间
  140. t = datetime.datetime.today()
  141. second = t.second + t.microsecond * 0.000001 # 计算移动的秒
  142. minute = t.minute + second / 60 # 计算移动的分
  143. hour = t.hour + minute / 60 # 计算移动的小时
  144. secHand.setheading(6 * second) # 设置秒针的角度
  145. minHand.setheading(6 * minute) # 设置分针的角度
  146. hurHand.setheading(30 * hour) # 设置时针的角度
  147. turtle.tracer(False) # 关闭绘画效果
  148. printer.forward(65) # 向上移动65
  149. # 绘制星期
  150. printer.write(get_week(t), align="center", font=("Courier", 14, "bold"))
  151. printer.back(130) # 倒退130
  152. # 绘制年月日
  153. printer.write(t.strftime('%Y-%m-%d'), align="center", font=("Courier", 14, "bold"))
  154. printer.home() # 归位
  155. turtle.tracer(True) # 开启绘画效果
  156. turtle.ontimer(move_pointer, 10) # 10毫秒后调用move_pointer()方法
  157. if __name__ == '__main__':
  158. turtle.setup(650, 650) # 创建窗体大小
  159. init_pointer() # 调用初始化指针的方法
  160. turtle.tracer(False) # 关闭绘画效果
  161. draw_clock_dial() # 绘制表盘
  162. draw_shichen_clock_dial(dizhi)
  163. draw_old_clock_dial() # 绘制十二时辰表盘
  164. move_pointer() # 调用移动指针的方法
  165. turtle.mainloop() # 不关闭窗体