月/年钟游戏停止我游戏的其余部分

时间:2014-09-27 12:40:48

标签: python user-interface tkinter clock

我正在使用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程序员一样理解类。请帮忙!

1 个答案:

答案 0 :(得分:0)

您需要使用after方法制作时钟,因为time.sleep会停止所有内容,直到完成为止。

看看这个例子。它会创建一个标签和一个按钮,然后在100ms后运行timeclocktimeclock函数配置时钟,然后在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()