问题描述
我目前正在编码一个程序,该程序将执行某些操作(例如不断计数数字),直到在显示的对话框中输入了某些内容为止。
但是,每当我尝试这样做时,程序在等待输入时都会冻结,因此在我尝试在后台运行的计数过程中没有任何进展。
有什么办法可以让计时器在后台连续运行,以便在5分钟内计数器立即停止运行,对话框消失呢?这是我代码的基本框架。我使用tkinter对话框进行输入,并尝试创建一个在后台运行的计时器。
from time import *
from tkinter import *
from tkinter import messageBox
from tkinter import simpledialog
while timer<300:
sleep(1)
timer += 1
ROOT = Tk()
ROOT.withdraw()
USER_INP = simpledialog.askstring(title="Code required",prompt="What's the Code?:")
最好没有外部模块,但是如果没有的话。在此先感谢:)
-
这是要求的代码
from tkinter import * from tkinter import simpledialog root = Tk() root.withdraw() def ask(): simpledialog.askstring(title="Code required",prompt="What's the Code?:") ## root.after(5000,root.destroy()) #added in the root.after() to try and terminate it after set time root.after(3000,ask) #triggers ask() after 3000 ms(3 seconds) root.after(100000,root.destroy()) # tried to wait 10 seconds before it breaks but this doesn't show the dialog Box any more root.mainloop()
解决方法
这是tkinter的基本代码,它使对话框在5秒钟后弹出。
from tkinter import *
from tkinter import simpledialog
root = Tk()
root.withdraw()
def ask():
simpledialog.askstring(title="Code Required",prompt="What's the Code?:")
root.after(5000,root.destroy) #added in the root.after() to try and terminate it after set time
root.after(3000,ask) #triggers ask() after 3000 ms(3 seconds)
#root.after(10000,root.destroy) # tried to wait 10 seconds before it breaks but this doesn't show the dialog box any more
root.mainloop()
此处after()
在给定时间(即3000毫秒(3秒))后触发功能,因此您也可以在那里调整计时器。这只是一个示例,您可以根据需要进行更多编辑。
为什么使用after()
而不是while
和计时器?
这是因为while
循环会干扰tkinter mainloop()
,从而导致窗口无响应,因此不建议使用while
或time.sleep()
。相反,您可以通过tkinter或after()
使用内置的threading
方法。
关于after()
的更多内容:
- 它需要两个位置参数,主要是
ms
和func
-
ms
-这是触发指定功能的时间(以毫秒为单位)。 -
func
-它是在指定的ms
确定之后触发的功能。
警告:
请记住,根窗口没有被破坏,只是被隐藏了,因此,只要根窗口没有被破坏,程序就会在后台继续运行,因此您必须带回该窗口并关闭该窗口以完成任务结束。因此,我在此添加了root.destroy()
。
Take a look here for a bit more understanding on after()
希望它消除了您的疑问,请让我知道是否有任何错误。
欢呼