我正在使用Tkinter制作一种风险类型的游戏(有点接近帝国),我正试图制作一个游戏时钟,以增加部队和获得金钱。
问题是:当我运行它时,while循环会停止游戏的其余部分......我如何制作一个不会非常复杂的时钟来添加变量。
我的时钟代码是:
def timeclock(m,y):
while m <= 12:
time.sleep(30)
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))
clock.configure朝向我为游戏制作的标签,它显然只是刷新文本。
您知道,我没有为我的应用程序或.pack函数使用类,因为我最近创建了Tkinter并且我在不使用它的情况下学习了它。虽然我像大多数中级python程序员一样理解类。请帮忙!
答案 0 :(得分:0)
您需要使用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()