如何停止等待tkinter对话框中的输入?

问题描述

我目前正在编码一个程序,该程序将执行某些操作(例如不断计数数字),直到在显示的对话框中输入了某些内容为止。

但是,每当我尝试这样做时,程序在等待输入时都会冻结,因此在我尝试在后台运行的计数过程中没有任何进展。

有什么办法可以让计时器在后台连续运行,以便在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(),从而导致窗口无响应,因此不建议使用whiletime.sleep()。相反,您可以通过tkinter或after()使用内置的threading方法。

关于after()的更多内容:

  • 它需要两个位置参数,主要是msfunc
  • ms-这是触发指定功能的时间(以毫秒为单位)。
  • func-它是在指定的ms确定之后触发的功能。

警告: 请记住,根窗口没有被破坏,只是被隐藏了,因此,只要根窗口没有被破坏,程序就会在后台继续运行,因此您必须带回该窗口并关闭该窗口以完成任务结束。因此,我在此添加了root.destroy()

Take a look here for a bit more understanding on after()

希望它消除了您的疑问,请让我知道是否有任何错误。

欢呼