【问题标题】:How to stop waiting for input in tkinter dialog box?如何停止等待 tkinter 对话框中的输入?
【发布时间】:2020-09-09 20:48:17
【问题描述】:

我目前正在编写一个程序,它会做一些事情(例如不断地计算数字),直到某些内容被输入到显示的对话框中。

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

有没有办法让计时器在后台连续运行,这样在 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()
    

【问题讨论】:

标签: python python-3.x tkinter input timer


【解决方案1】:

这是一个使用 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 或 threading 内置的 after() 方法。

这里有更多关于after()的内容:

  • 它需要两个位置参数,主要是msfunc
  • ms - 触发指定函数的时间(以毫秒为单位)。
  • func - 指定的ms 结束后触发的函数。

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

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

希望它消除了您的疑虑,如果有任何错误,请告诉我。

干杯

【讨论】:

  • 我试图编辑它,以便使用 after() 大约 10 秒后对话框输入框消失,但它不起作用。请问有什么帮助吗?当我包含 after(5000, root.destroy()) 时,它只会使对话框根本不显示
  • @MaxDavies 你能用你的新代码更新Q吗/
  • @MaxDavies 简单修复只需删除 () 就像 root.after(100000, root.destroy)root.after(5000, root.destroy)
  • 这是完美的。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多