如何在程序运行时显示列表框或文本

时间:2011-09-12 13:14:13

标签: user-interface tcl tk

这是我的编码。我遇到一个问题,它仍然在运行时没有显示“.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 个答案:

答案 0 :(得分:2)

您应该完全更改编写此代码的方式并使用idle callbacks

这个想法是你创建一个要执行的“任务”列表(可能是目标计算机列表),将其保存在某处,然后一次处理一个项目,使用空闲回调重新安排执行。 / p>

草图如下:

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]

答案 1 :(得分:0)

我从来没有做过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]

将独立于当前proc作为事件处理程序运行。也许这可以修复你的冲洗问题。 (需要eventloop或update命令)