假设有一个包含无限循环条件的 a.tcl,例如,
while {1} {
puts $val
}
我想实现一个 tk 按钮,它执行一个 .tcl 文件并继续在 tk-text 窗口中运行并打印 $val 以固定的时间间隔,比如每 1 秒。此外,当我们再次单击该按钮时,它应该停止运行 a.tcl
注意:我尝试使用exec tclsh a.tcl
但由于 a.tcl 中的无限 while 循环而挂起 tk-window
如果不是使用 ,而是使用exec
以下命令启动子进程:
set pipeline [open |[list tclsh a.tcl]]
然后 GUI 将保持活动状态。但是,您可能希望不时从管道中读取。
proc line_per_second {pipeline} {
puts [gets $pipeline]
after 1000 line_per_second $pipeline
}
line_per_second $pipeline
当你close $pipeline
,它应该关闭东西(因为操作系统管道被关闭)。
请注意,对于真正的代码,与只是尽可能快地一遍又一遍地喷出同一行的代码相反,您可以使用 readablefileevent
来触发您的调用gets
。
proc read_line {pipeline} {
gets $pipeline line
if {[eof $pipeline]} {
close $pipeline
} else {
puts $line
}
}
fileevent $pipeline readable [list read_line $pipeline]
但是,使用您的特定脚本可能会过于频繁地触发并使事件的 GUI 有点饥饿。这只是一个非常大量输出的问题。