您需要使用after
方法来创建您的时钟,因为time.sleep
会停止一切,直到完成。
看看这个例子。它创建一个标签和一个按钮,然后在100ms后运行timeclock
。 timeclock
函数配置时钟,然后在100ms后再次调用自己。这不会中断Tkinter主循环,这就是按钮仍然有效的原因。
但是,只要你不把你的应用程序放在一个类中,你将不得不让m和y全局在功能中使用它们,除非你可以从标签文本中提取它们。
import Tkinter as tk
def timeclock():
global m, y
if m < 12:
m += 1
clock.configure(text = "Month: "+str(m)+", Year: "+str(y))
else:
m = 1
y += 1
clock.configure(text = "Month: "+str(m)+", Year: "+str(y))
root.after(100, timeclock)
def reset():
global m, y
m = 0
y = 0
root = tk.Tk()
clock = tk.Label(root, text='Clock')
clock.pack()
m = 0
y = 0
button = tk.Button(root, text='Reset clock', command=reset)
button.pack()
root.after(100, timeclock)
root.mainloop()
为了避免出现全局情况,您可以在下面的示例中执行类似操作。它通过查看标签获得月份和年份。
import Tkinter as tk
import re
def timeclock():
result = re.match('Month: (\d+), Year: (\d+)', clock['text'])
m, y = int(result.group(1)), int(result.group(2))
if m < 12:
m += 1
clock.configure(text = "Month: "+str(m)+", Year: "+str(y))
else:
m = 1
y += 1
clock.configure(text = "Month: "+str(m)+", Year: "+str(y))
root.after(100, timeclock)
def reset():
m = 1
y = 0
clock.configure(text = "Month: "+str(m)+", Year: "+str(y))
root = tk.Tk()
m = 1
y = 0
clock = tk.Label(root, text="Month: "+str(m)+", Year: "+str(y))
clock.pack()
button = tk.Button(root, text='Reset clock', command=reset)
button.pack()
root.after(100, timeclock)
root.mainloop()
谢谢!我很高兴这个网站有像你这样的人来帮助像我这样的人。迫不及待地完成我的比赛吧! – HKVariant 2014-09-27 14:36:39
问题中的代码每30秒检查一次。每100ms检查一次毫无意义。至少你不应该每秒检查一次以上。毫无疑问,精确到100毫秒是没有意义的。 – 2014-09-27 15:44:40
哦,对,我把时间做得如此之短,以便能够快速查看是否所有事情都按照我想要的方式工作,几个月和几年有多个数字等等。在发布时忘了查看问题的时间。然而,我从OP的评论中感受到他已经想出了如何改变自己的时间。 – fhdrsdg 2014-09-27 16:55:43