2014-06-27 21 views
1

因此,我使用Tkinter创建一个小部件,允许用户输入一些信息并单击运行按钮,该按钮将开始运行在其他地方定义的测试。这是代码。这是远远完善,这只是一个原型:当一个由Widget启动的进程正在运行时,如何在Tkinter Widget中运行计时器?

from tkinter import* 
import controller 
root = Tk() 
#create labels 
label = Label(text = "text you don't need to know") 
label.pack() 
remind = Label(text = "more text you don't need to know") 
remind.pack() 

#create text fields 
name = Entry(root) 
name.pack() 
name.insert(0, "Name") 
name.focus_set() 
testName = Entry(root) 
testName.pack() 
testName.insert(0, "Test name") 
duration = Entry(root) 
duration.pack() 
duration.insert(0, "Duration in minutes") 


def runTest(): 
    controller.main(testName.get(), name.get(), float(duration.get())) 

#create run button 
run = Button(root, text = "Run", fg = "red", width = 10, command = runTest) 
run.pack() 

root.mainloop() 

所以,这是我的问题。一旦这个项目实施,持续时间可能会设定为1-4小时左右。所以,我想要做的是在窗口小部件上出现一个倒数计时器,这样用户可以随时引用该计时器,查看数据生成之前的时间。问题是,只要我的测试运行,小部件就会锁定,直到完成。我试过的所有东西都会暂停,直到它完成测试,然后它就会按照我的要求做。在这一点上,这并没有什么帮助。

任何人都有一些实现这样的经验的经验? 谢谢。

+0

出于好奇,有什么了Tkinter的?过去几天我看到了大量的问题。 – BoppreH

+0

不知道。直到今天我开始实施我的项目的这一部分之前,我几乎什么都不知道。 – Seth

+1

你必须在线程中运行这个测试。 – furas

回答

1

你需要在runTest中分出你的工作。 threading模块将成为您的朋友(例如from threading import Thread)。

然后重写你的runTest方法:

def runTest(): 
    # pack your arguments in a tuple 
    mainArgs = (testName.get(), name.get(), float(duration.get())) 
    # create a thread object armed with your function and the args to call it with 
    thread = Thread(target=controller.main, args=mainArgs) 
    # launch it 
    thread.start() 
    #and remember, never set state (directly or indirectly) from separate threads without taking appropriate precautions! 
相关问题