time.sleep()相当于Tkinter

时间:2015-10-16 16:37:40

标签: python python-3.x time tkinter

我必须停止循环并在几秒钟后恢复。我尝试使用after(),但循环不会冻结。当我使用time.sleep()(解决tkinter)时,tkinter会冻结。有另一种方法或函数等效time.sleep()而不冻结。

代码:

for message in listOfMessages:
    time.sleep(message.time)
    #manipulate message
    #change text widget

这将冻结我的tkinter应用程序。

我尝试使用after()但是message.time是一个浮点数:0.5054564到1.5234244。这是随机的。并且支持后只有int。我无法转换为int,因为低数字会产生不同的数字。如果我在int中转换0.52342342:523 ...我丢失了其他42342

这也不行:

def changes(#values):
    #manipulate message
    #change text widget

for message in listOfMessages:
    app.after(message.time, lambda: changes(#values))

还有另一个函数等效time.sleep不冻结tkinter并且与after()不同吗?如果没有,还有另一种方法吗?谢谢你的关注。

1 个答案:

答案 0 :(得分:2)

创建模拟:

for message in listOfMessages:
    time.sleep(message.time)
    change(message)
tkinter中的

def update_widget(app, messages):
    message = next(messages, None)
    if message is None: # end of the loop
        return
    delay = int(message.time * 1000) # milliseconds
    app.after(delay, change, message) # execute body
    app.after(delay, update_widget, app, messages) # next iteration

update_widget(app, iter(listOfMessages))

如果您想等到change(message)完成后再继续循环:

def iterate(message, app, messages):
    change(message)
    update_widget(app, messages)

def update_widget(app, messages):
    message = next(messages, None)
    if message is None: # end of the loop
        return
    delay = int(message.time * 1000) # milliseconds
    app.after(delay, iterate, message, app, messages)

update_widget(app, iter(listOfMessages))