防止此代码的即时执行?

时间:2015-01-07 22:20:42

标签: recursion widget tcl tk

我无法理解如何更新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;
} 

我也在一个不同的过程中调用这个过程,我也在扫描之前禁用一个按钮并在之后重新启用它;但这也不起作用。在执行扫描过程之前,脚本根本不允许我的小部件更新?我怎样才能得到理想的结果?

谢谢!

1 个答案:

答案 0 :(得分:4)

Tk中的大多数显示更新都发生在事件循环中。在您的情况下,直到完成目录遍历后才会输入事件循环。您可能希望使用update idletasks命令。

从手册:

  

update idletasks命令在脚本中非常有用,这些脚本已对应用程序的状态进行了更改,并且您希望这些更改立即显示在显示屏上,而不是等待脚本完成。大多数显示更新都作为空闲回调执行,因此update idletasks将导致它们运行。但是,有些类型的更新只会在响应事件时发生,例如由窗口大小更改触发的事件;更新idletasks中不会发生这些更新。