本文实例讲述了Python Tkinter模块实现时钟功能。分享给大家供大家参考,具体如下:
本机测试效果:
完整代码:
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
|
# coding=utf-8
from Tkinter import *
import _tkinter
import math
import time
from threading import Thread
class Clock:
def __init__( self , master, x, y, width, height, radius):
'''
:param master: 父窗口
:param x: 时钟中心点的x坐标
:param y: 时钟中心点的y坐标
:param width: 画布的宽度
:param height: 画布的高度
:param radius: 时钟钟盘的半径
'''
self .centerX = x
self .centerY = y
self .radius = radius
self .canvas = Canvas(master, width = width, height = height) # 画布
self .canvas.pack()
self .canvas.create_oval(
x - radius,
y - radius,
x + radius,
y + radius) # 画钟框
self .id_lists = []
self .hourHandRadius = self .radius * 1.0 / 4 # 指针长度
self .minHandRadius = self .radius * 2.0 / 3 # 分针长度
self .secHandRadius = self .radius * 4.0 / 5 # 秒针长度
self .timeVar = StringVar()
# self.timeVar.set('')
self .timeLabel = Label( self .canvas.master, textvariable = self .timeVar)
self .timeLabel.pack(side = BOTTOM)
#self.canvas.master.protocol('WM_DELETE_WINDOW', self.canvas.master.destroy)
def __del__( self ):
self ._deleteItems( self .id_lists)
# 绘制时钟钟盘
def drawClockDial( self ):
# 绘制钟盘上的数字1-12
r = self .radius - 15
for i in range ( 1 , 13 ):
rad = 2 * math.pi / 12 * i
x = self .centerX + math.sin(rad) * r
y = self .centerY - math.cos(rad) * r
id = self .canvas.create_text(x, y, text = str (i))
self .id_lists.append( id )
# 绘制钟盘上的刻度
r1 = self .radius - 5
r2 = self .radius
for i in range ( 1 , 61 ):
rad = 2 * math.pi / 60 * i
x1, y1 = self ._getPosByRadAndRadius(rad, r1)
x2, y2 = self ._getPosByRadAndRadius(rad, r2)
id = self .canvas.create_line(x1, y1, x2, y2)
self .id_lists.append( id )
# 显示时间
def showTime( self , tm):
hour = tm.tm_hour % 12
min = tm.tm_min
sec = tm.tm_sec
sec_rad = 2 * math.pi / 60 * sec
min_rad = 2 * math.pi / 60 * ( min + sec / 60.0 )
hour_rad = 2 * math.pi / 12 * (hour + min / 60.0 )
timeStr = '当前时间: %d-%02d-%02d %02d:%02d:%02d' % (
tm.tm_year, tm.tm_mon, tm.tm_mday, hour, min , sec)
self .timeVar. set (timeStr)
hour_id = self ._drawLine(hour_rad, self .hourHandRadius, 6 )
min_id = self ._drawLine(min_rad, self .minHandRadius, 4 )
sec_id = self ._drawLine(sec_rad, self .secHandRadius, 3 )
return (hour_id, min_id, sec_id)
def run( self ):
def _run():
while True :
tm = time.localtime()
id_lists = self .showTime(tm)
self .canvas.master.update()
time.sleep( 1 )
self ._deleteItems(id_lists)
thrd = Thread(target = _run) # 创建新的线程
thrd.run() # 启动线程
def _drawLine( self , rad, radius, width):
x, y = self ._getPosByRadAndRadius(rad, radius)
id = self .canvas.create_line(
self .centerX, self .centerY, x, y, width = width)
return id
def _getPosByRadAndRadius( self , rad, radius):
x = self .centerX + radius * math.sin(rad)
y = self .centerY - radius * math.cos(rad)
return (x, y)
def _deleteItems( self , id_lists):
for id in id_lists:
try :
self .canvas.delete( id )
except BaseException:
pass
if __name__ = = '__main__' :
root = Tk()
root.title( 'www.zzvips.com 时钟' )
clock = Clock(root, 200 , 200 , 400 , 400 , 150 )
clock.drawClockDial()
clock.run()
root.mainloop()
|
待解决的bug:
关闭程序的时候,会出现如下的错误:
希望本文所述对大家Python程序设计有所帮助。
原文链接:http://www.cnblogs.com/hupeng1234/p/6939991.html