2022年 12月 19日

Python制作一个简易时钟(可显示日期,星期)

源代码:

  1. # coding=utf-8
  2. import turtle
  3. from datetime import *
  4. # 由于表盘刻度不连续,需频繁抬起画笔,放下画笔
  5. def skip(step):
  6. turtle.penup() # 画笔抬起
  7. turtle.forward(step) # 画笔移动step
  8. turtle.pendown() # 画笔落下
  9. # 建立表针,定制表针形状和名字
  10. def make_hand(name, length):
  11. turtle.reset()
  12. skip(-length * 0.1) # 表针一端,过表盘中心一小段,开始绘制
  13. turtle.begin_poly() # 开始记录多边形的第一个顶点。
  14. turtle.forward(length * 1.1) # 设置表针长度,绘制表针
  15. turtle.end_poly() # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
  16. handForm = turtle.get_poly() # 返回最后记录的形状
  17. turtle.color('black')
  18. turtle.register_shape(name, handForm)
  19. # 三个表针初始化,实例化
  20. def init_hand():
  21. global sec_hand, min_hand, hou_hand, printer
  22. # 重置Turtle指向北
  23. turtle.mode("logo") # logo:向上(北) 顺时针 standard:向右(东) 逆时针
  24. # 建立三个表针Turtle并初始化
  25. make_hand("sec_Hand", 135)
  26. make_hand("min_Hand", 110)
  27. make_hand("hou_Hand", 70)
  28. sec_hand = turtle.Turtle()
  29. sec_hand.shape("sec_Hand")
  30. min_hand = turtle.Turtle()
  31. min_hand.shape("min_Hand")
  32. hou_hand = turtle.Turtle()
  33. hou_hand.shape("hou_Hand")
  34. # 笔的属性
  35. for hand in sec_hand, min_hand, hou_hand:
  36. hand.shapesize(1, 1, 3)
  37. hand.speed(0)
  38. # 建立输出打印的文字Turtle
  39. printer = turtle.Turtle()
  40. # 隐藏画笔的turtle形状
  41. printer.hideturtle()
  42. printer.penup()
  43. # 设置表盘
  44. def set_clock(radius):
  45. turtle.reset()
  46. turtle.pencolor('red') # 设置画笔颜色
  47. turtle.fillcolor('pink') # 设置绘制图形的填充颜色
  48. turtle.pensize(10) # 画笔宽度
  49. for i in range(60):
  50. skip(radius)
  51. # 逢五 使用线条并加粗
  52. if i % 5 == 0:
  53. turtle.forward(20)
  54. skip(-radius - 20)
  55. skip(radius + 20)
  56. # 设置数字的位置及字体,大小
  57. if i == 0:
  58. turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
  59. elif i == 30:
  60. skip(25)
  61. turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
  62. skip(-25)
  63. elif i == 25 or i == 35:
  64. skip(20)
  65. turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
  66. skip(-20)
  67. else:
  68. turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
  69. skip(-radius - 20)
  70. # 非五,以点代替
  71. else:
  72. turtle.dot(5)
  73. skip(-radius)
  74. turtle.right(6)
  75. # 显示星期
  76. def show_week(t):
  77. week = ["星期一 Mon", "星期二 Tue", "星期三 Wed", "星期四 Thu", "星期五 Fri", "星期六 Sat", "星期日 Sun"]
  78. return week[t.weekday()] # t.weekday() 周一为0,周二为1...可作为列表的index
  79. # 显示日期
  80. def show_data(t):
  81. y = t.year
  82. m = t.month
  83. d = t.day
  84. return "{} 年 {} 月 {} 日".format(y, m, d)
  85. # 显示时间
  86. # def show_time(t):
  87. # m = t.minute
  88. # h = t.hour
  89. # return "{}:{}".format(h, m)
  90. # 显示整个时钟
  91. def show_clock():
  92. # 获取时间
  93. t = datetime.today()
  94. second = t.second + t.microsecond * 0.000001
  95. minute = t.minute + second / 60.0
  96. hour = t.hour + minute / 60.0
  97. sec_hand.setheading(6 * second)
  98. min_hand.setheading(6 * minute)
  99. hou_hand.setheading(30 * hour)
  100. turtle.tracer(False)
  101. printer.forward(65)
  102. printer.write(show_week(t), align='center', font=("Courier", 14, "bold"))
  103. printer.back(65)
  104. printer.write("The Clock of Hua", align="center", font=("Courier", 16, "bold"))
  105. printer.back(65)
  106. printer.write(show_data(t), align='center', font=("Courier", 14, "bold"))
  107. # printer.back(25)
  108. # printer.write(show_time(t), align="center", font=("Courier", 14, "bold"))
  109. # 回到原点,以便于下一轮的显示
  110. printer.home()
  111. turtle.tracer(True)
  112. # 100ms后继续调用show_clock
  113. turtle.ontimer(show_clock, 100)
  114. # main函数
  115. def main():
  116. turtle.tracer(False)
  117. # 设置背景
  118. ts = turtle.getscreen()
  119. ts.bgcolor("#cccccc")
  120. # 初始化
  121. init_hand()
  122. # 设置时钟
  123. set_clock(180)
  124. turtle.tracer(True)
  125. # 显示时钟
  126. show_clock()
  127. turtle.mainloop()
  128. if __name__ == "__main__":
  129. main()

 模块:turtle   datetime

定义函数:

                skip:指定重复动作

                make_hand():建立表针   

                init_hand():表针初始化,实例化

                set_clock():设置表盘

                show_week():显示星期

                show_data():显示日期

                show_clock():显示时钟

                main():主函数

效果: