Как отобразить список или текст при запуске программы - PullRequest
0 голосов
/ 12 сентября 2011

Это моя кодировка. Я столкнулся с проблемой, когда он не отображал «.display_message», пока он еще работает. Я получаю сообщение только после того, как proc torun {} выполнит свою задачу. Кстати, после 2000 года моя программа работает. Это очень длинный код, и я считаю, что он неприменим, поэтому я удалил его, чтобы упростить. Пожалуйста, ведите меня в этом. Спасибо.

proc torun {} {
    set total [.display_pc2 size]
    .display_message insert end "test" 


    for {set x 0} {$x < $total} {incr x} {
        set machine [.display_pc2 get $x]
            .display_message insert end "Copy to $machine now. Please wait..."
            .display_message see end
            after 2000
            .display_message insert end "Copy to $machine done"
            .display_message see end
            after 2000
    }
}

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Вы должны полностью изменить способ написания этого кода и использовать бездействующие обратные вызовы .

Идея состоит в том, что вы создаете список «задач», которые нужно выполнить (возможно, это был бы список целевых компьютеров), сохраняете его где-то, а затем обрабатываете его по одному элементу за раз, перепланируя выполнение с помощью обратного вызова в режиме ожидания.

Эскиз следует:

proc show_transfer_start {target} {
  .display_progress add ... $target
}

proc show_transfer_result {res} {
  .display_progress add ... $res
}

proc schedule_transfer {target rest} {
  after idle [after 0 [list do_step $target $rest]]
}

proc do_step {target rest} {
  set res [copy --to $target]
  show_transfer_result $res
  if {[llength $rest] > 0} {
    set next [lindex $rest 0]
    show_transfer_start $next
    schedule_tranfer $next [lrange $rest 1 end]
  }
}

set targets [list box1 box2 box3]
set first [lindex $targets 0]
show_transfer_start $first
schedule_transfer $first [lrange $targets 1 end]
0 голосов
/ 12 сентября 2011

Я никогда не делал tk (если это gui, что вы делаете), но, возможно, вам нужен какой-то эквивалент flush при использовании puts для принудительного отображения сообщения.

Так как яне могу догадаться, что сделано внутри .display_message proc.

Редактировать:

Только что пришла в голову идея: вы можете использовать команду after для фальсификации многопоточностиваше приложение.

after 0 [list .display_message insert end "Copy to $machine now. Please wait..."; .display_message see end]

, которое будет работать независимо от вашего текущего процесса в качестве обработчика событий.Возможно, это решит вашу проблему с флешем.(Требуется команда eventloop или update)

...