2015-01-07 3 views
0

У меня возникли проблемы с пониманием того, как обновить виджет в 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; 
} 

Я также вызов этого прок в другой прок, в котором я также отключить кнопку до начала сканирования и повторное включение его после; но это тоже не работает. Сценарий не позволяет моим виджетам вообще обновляться до выполнения proc proc? Как я могу получить желаемый результат?

Спасибо!

+0

Вы не позволяете циклу событий работать и выполнять свою работу. Взгляните на http://wiki.tcl.tk/946 – schlenk

+0

Спасибо! Это очень помогло. – Grandclosing

ответ

4

Большинство обновлений в Tk происходят из цикла событий. В вашем случае цикл события не вводится до тех пор, пока вы не закончите обход каталога. Вы можете использовать команду update idletasks.

Из инструкции:

Команда update idletasks полезна в сценариях, где изменения были внесены в состояние приложения, и вы хотите, чтобы эти изменения отображаются на дисплее сразу, а не ждать сценария для завершения , Большинство обновлений дисплея выполняются как незапланированные обратные вызовы, поэтому update idletasks приведет к их запуску. Однако есть некоторые виды обновлений, которые происходят только в ответ на события, например, вызванные изменениями размера окна; эти обновления не будут возникать при обновлении idletasks.

+1

Если вы предпримете шаги, чтобы избежать проблем с повторным подключением, лучше «обновить», поскольку он позволяет обрабатывать запросы перерисовки из ОС. OTOH, вы должны быть осторожны с ним, иначе вы получите нежелательные рекурсивные вызовы в обработчики событий; это [часто считается вредным] (http://wiki.tcl.tk/1255) по очень веской причине. –

+0

Благодарим вас обоих за отзыв; очень полезно. – Grandclosing

Смежные вопросы