【发布时间】:2011-12-17 14:45:04
【问题描述】:
我在表单上有两个按钮,当我按下按钮时,它保持按下状态,并且框架保持无响应状态,直到 button1 的操作完成,在我的情况下,我调用保持打开状态的新 xterm 窗口,并且我想使用 button2打开新的 xterm,但直到我从 button1 命令关闭 xterm 窗口,整个 GUI 都没有响应。 这是为什么? 谢谢,我两天前开始使用 TKinter,所以请放轻松:)
【问题讨论】:
我在表单上有两个按钮,当我按下按钮时,它保持按下状态,并且框架保持无响应状态,直到 button1 的操作完成,在我的情况下,我调用保持打开状态的新 xterm 窗口,并且我想使用 button2打开新的 xterm,但直到我从 button1 命令关闭 xterm 窗口,整个 GUI 都没有响应。 这是为什么? 谢谢,我两天前开始使用 TKinter,所以请放轻松:)
【问题讨论】:
Tkinter 在单线程中工作。所以当你按下按钮时,回调命令显然很长时间没有返回。这会导致 Tkinter GUI 冻结,直到回调命令返回。
如果可能,解决方案是将回调命令分成更小的部分,可能是一个循环,并频繁调用update_idletasks() 以允许 Tkinter GUI 更新。
如果这是不可能的,那么回调命令应该spawn a thread 这样它的执行就不会阻塞 Tkinter 主事件循环。
【讨论】:
另一个对我有帮助的类似解决方案是运行一些
root.update()
在需要大量资源的循环/函数内部。这比 'update_idletasks()' 更加激烈,所以要小心它是否与您的 GUI 设置和/或您的一般脚本结构兼容。
'root' 当然是 Tkinter 生成的窗口/表单的名称。 另外,请注意 .update() 不仅仅是“刷新”GUI。
【讨论】: