我无法理解如何更新Tk中的小部件以反映正在进行的过程。 基本上,现在我的程序是递归扫描目录,并且应该一次一个地输出它找到的每个目录/文件到一个文本小部件。我的问题是,脚本不是这样做,而是找到所有目录,然后在完成后立即输出所有内容。这是代码:
proc scan {{dir .}} {
global num_items_found vs_list ec_list
foreach i [lsort [glob -nocomplain -dir $dir *]] {
if {[file type $i]=="directory"} {
.main.body.log insert end "Checking $i\n";
scan $i;
} else {
if {[string tolower [file tail $i]] eq "buildlog.htm"} {
lappend vs_list $i;
incr num_items_found;
.main.body.log insert end "Found $i\n";
} elseif {[file extension $i] eq ".log"} {
lappend ec_list $i;
incr num_items_found;
.main.body.log insert end "Found $i\n";
}
}
}
return;
}
我也在一个不同的过程中调用这个过程,我也在扫描之前禁用一个按钮并在之后重新启用它;但这也不起作用。在执行扫描过程之前,脚本根本不允许我的小部件更新?我怎样才能得到理想的结果?
谢谢!
答案 0 :(得分:4)
Tk中的大多数显示更新都发生在事件循环中。在您的情况下,直到完成目录遍历后才会输入事件循环。您可能希望使用update idletasks
命令。
从手册:
update idletasks
命令在脚本中非常有用,这些脚本已对应用程序的状态进行了更改,并且您希望这些更改立即显示在显示屏上,而不是等待脚本完成。大多数显示更新都作为空闲回调执行,因此update idletasks
将导致它们运行。但是,有些类型的更新只会在响应事件时发生,例如由窗口大小更改触发的事件;更新idletasks中不会发生这些更新。