为什么time.sleep在打开之前暂停tkinter窗口

时间:2015-05-17 07:04:11

标签: python python-2.7 tkinter

我正在为体育场开发一个程序,time.sleep()在窗口打开之前暂停程序,而不是在我想要的时候。这种行为有什么解释?

import Tkinter as tk
import time
import random
root = tk.Tk()

label = tk.Label(root, text="Navigating To Seat")
label.pack(pady=10, padx=10)

rand = random.randint(6, 16)

while rand != 0:
    label2 = tk.Label(root, text="Foward:  " + str(rand) + "m")
    label2.pack()
    rand = rand - 1
    time.sleep(1)
    label2.pack_forget()

root.mainloop()

2 个答案:

答案 0 :(得分:5)

time.sleep的作用是暂停程序的执行。如果你这样做6-16次,每次1秒,然后再打电话给mainloop(),你就要求它在启动你的GUI之前等待6-16秒。

您可能不了解事件循环编程的工作原理。阅读一些Tkinter教程应该很好地理解这个想法。如果您想要更少关注Tkinter的解释以及有关所发生事件的详细信息以及绕过它的不同方法的更多信息,请参阅Why your GUI app freezes

无论如何,我想我可以猜到你想做什么,即使你的问题没有清楚:你想要启动GUI,然后每秒,替换{{1 }}。要做到这一点,你必须在GUI运行时等待 ,而不是在它开始之前。

但是,您也可以在GUI运行时调用Label。当程序处于睡眠状态时,GUI无法运行(同样,sleep意味着什么)。

最简单的方法是将循环转换为一系列函数调用,每个函数调用使用after方法调度下一个函数调用以后运行一秒钟。例如:

sleep

当您第一次呼叫import Tkinter as tk import random root = tk.Tk() label = tk.Label(root, text="Navigating To Seat") label.pack(pady=10, padx=10) rand = random.randint(6, 16) label2 = None def add_label(): global rand global label2 if not rand: root.quit() if label2: label2.pack_forget() label2 = tk.Label(root, text="Foward: " + str(rand) + "m") label2.pack() rand = rand - 1 root.after(1000, add_label) add_label() root.mainloop() 时,它会创建初始标签,要求add_label()在1000毫秒内再次呼叫Tkinter,然后返回。因此,在您启动循环后的第二个时间,它会再次被调用,这将创建下一个标签并要求add_label()稍后再次调用它。这一直持续到Tkinter一直递减到rand,此时你调用0而不是quit,这会结束主循环,结束程序。

您可能想要解决此计划的其他问题。例如,您不必每次都销毁和创建新的Widget标签,而只需更改其文字,或者甚至更简单地使afterIntVar连接到标签,这样只需更新{ {1}}自动更改文字。此外,对于任何比这个程序更简单的东西,你可能想要用更干净的东西替换全局变量 - 大多数Tkinter教程向你展示如何使用rand子类关于第二个或第三个例子,为您提供了一个方便的地方来组织小部件和成员变量,如rand

答案 1 :(得分:-4)

我完全不理解你的问题:

1)您可以在循环中更新您的wimdow以将其绘制到屏幕上... root.update()在time.sleep()之后或之前

2)如果你不想在执行mainloop之前隐藏你的窗口,请使用root.attributes(" -alpha",0.0)来隐藏和root.attributes(&#34) ; -alpha",1.0)显示窗口。