Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么time.sleep会在窗口打开前暂停它_Python_Python 2.7_Tkinter - Fatal编程技术网

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知道它的用途,而不需要给出一个更复杂的例子(例如,添加一个“停止”按钮)?