Python 为什么time.sleep会在窗口打开前暂停它
我正在为一个体育场开发一个程序,Python 为什么time.sleep会在窗口打开前暂停它,python,python-2.7,tkinter,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:
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()
它的作用是暂停程序的执行。如果在调用mainloop()
之前执行6-16次,每次1秒,则要求它在启动GUI之前等待6-16秒
您可能不了解事件循环编程是如何工作的。通读一些Tkinter教程可以很好地理解这个想法。如果您想要一个不太关注Tkinter的解释,以及更多关于正在发生的事情的细节和解决问题的不同方法的信息,请参阅
无论如何,我想我可以猜到你想要做什么,即使你的问题不清楚:你想启动GUI,然后,每秒钟,更换标签。要做到这一点,您必须在GUI运行时等待,而不是在它启动之前
但是,您也不能在GUI运行时调用sleep
。当您的程序处于休眠状态时,GUI无法运行(这也是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()
时,它会创建初始标签,要求Tkinter
在1000毫秒内再次调用add_label()
,然后返回。因此,在启动循环一秒钟后,它会再次被调用,这将创建下一个标签,并要求Tkinter
在一秒钟后再次调用它。这将一直持续下去,直到您将rand
减至0
,此时您将调用quit
,而不是在之后调用,这将结束主循环,从而结束程序
关于此程序,您可能还需要解决其他问题。例如,与每次销毁和创建新的小部件标签不同,您可以只更改其文本,或者更简单地说,将rand
连接到标签,因此只需更新rand
即可自动更改文本。此外,对于任何比这个程序更简单的东西,您可能希望用更干净的东西替换全局变量。大多数Tkinter教程通过第二个或第三个示例向您展示了如何使用Frame
子类,这为您提供了一个方便的地方来组织小部件和成员变量,如rand
您是否尝试将问题的标题放入谷歌搜索?它会暂停程序吗?这正是睡眠的目的。如果你不想让它这样做,为什么要叫它呢?这是一个很好的解释,但是如果你提到取消后的方法,@Xenomorph:对于这个设计,你会在哪里使用取消后的?after
方法不会重复触发,只会触发一次,因此这里没有什么可以取消的。与after
方法相比,我没有说解决方案需要它。。也许我只是疯了。@Xenomorph:我认为这与这里没有什么关系,我链接到的文档之后的中已经提到了它(以及下一节)。你能想出一种方法来提供一个解释,让OP知道它的用途,而不需要给出一个更复杂的例子(例如,添加一个“停止”按钮)?