我用tkinter做了一个简单的模拟时钟来研究python的GUIing。代码如下:
from tkinter import *
from datetime import datetime
import threading
from math import cos, sin, pi
root = Tk()
root.geometry('400x400')
pause = True
def sec_to_coord(second):
x = cos((second - 15) * pi / 30)
y = sin((-second - 15) * pi / 30)
return x,y
def update():
global pause
if pause: return
threading.Timer(1, update).start()
now = datetime.now()
x,y = sec_to_coord(now.second)
canv.coords(line, 200, 200, x * 100 + 200, y * 100 + 200) # drains RAM
x,y = sec_to_coord(now.minute + now.second / 60)
canv.coords(minhand, 200, 200, x * 90 + 200, y * 90 + 200) # drains RAM
x,y = sec_to_coord(now.hour * 5 + now.minute / 12)
canv.coords(hourhand, 200, 200, x * 50 + 200, y * 50 + 200) # drains RAM
print(':'.join([str(now.hour), str(now.minute), str(now.second)]))
def start():
global pause
if not pause: return
pause = False
print('pause =', pause)
update()
def halt():
global pause
if not pause:
pause = True
print('pause =', pause)
def on_closing():
halt()
print('BUY-BUY!')
root.destroy()
canv = Canvas(root, width=400, height=400)
canv.pack()
line = canv.create_line(200, 200, 200, 100)
minhand = canv.create_line(200, 200, 200, 110, width = 3)
hourhand = canv.create_line(200, 200, 200, 150, width= 7)
ticks = []
for i in range(60):
x,y = sec_to_coord(i)
if i % 5 == 0:
ticks.append(canv.create_line(x*90+200, y*90+200, \
x*100+200, y*100+200, width=3))
else:
ticks.append(canv.create_line(x*95+200, y*95+200, \
x*100+200, y*100+200, width=3))
root.protocol('WM_DELETE_WINDOW', on_closing)
start()
root.mainloop()
问题是:在滴答滴答的时候,时钟积累了RAM。通过对部分代码进行注释,我发现canv.coord()
中的def update():
函数负责。
拜托,有人能告诉我密码有什么问题吗?你知道吗
谢谢你,特里!!!解决了问题!我只需要按照你的建议更改一行
root.after(1000, update)
而不是threading.Timer(1, update).start()
,RAM累积就消失了!你知道吗相关问题 更多 >
编程相关推荐