2014-09-27 155 views
0

我正在使用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

您需要使用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() 
+0

谢谢!我很高兴这个网站有像你这样的人来帮助像我这样的人。迫不及待地完成我的比赛吧! – HKVariant 2014-09-27 14:36:39

+0

问题中的代码每30秒检查一次。每100ms检查一次毫无意义。至少你不应该每秒检查一次以上。毫无疑问,精确到100毫秒是没有意义的。 – 2014-09-27 15:44:40

+0

哦,对,我把时间做得如此之短,以便能够快速查看是否所有事情都按照我想要的方式工作,几个月和几年有多个数字等等。在发布时忘了查看问题的时间。然而,我从OP的评论中感受到他已经想出了如何改变自己的时间。 – fhdrsdg 2014-09-27 16:55:43