Tcl/Tk:使用Tk按钮执行Tcl脚本

Tcl/Tk:使用Tk按钮执行Tcl脚本,tcl,tcltk,Tcl,Tcltk,比如说,存在一个包含无限循环条件的.tcl,例如 while {1} { puts $val } 我想实现一个tk按钮,它执行一个.tcl文件,并在tk文本窗口中以固定的时间间隔(比如每1秒)继续运行和打印$val。 另外,当我们再次单击该按钮时,它应该停止运行a.tcl 注意:我尝试使用了exec tclsh a.tcl 但由于a.tcl中的无限while循环,如果不使用exec,而是使用以下命令启动子流程,则会挂起tk窗口: set pipeline [open |[list t

比如说,存在一个包含无限循环条件的.tcl,例如

while {1} {
    puts $val 
}
我想实现一个tk按钮,它执行一个.tcl文件,并在tk文本窗口中以固定的时间间隔(比如每1秒)继续运行和打印$val。 另外,当我们再次单击该按钮时,它应该停止运行a.tcl

注意:我尝试使用了
exec tclsh a.tcl

但由于a.tcl中的无限while循环,如果不使用
exec
,而是使用以下命令启动子流程,则会挂起tk窗口:

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
当您
关闭$pipeline
时,它应该关闭一些东西(因为操作系统管道被关闭)

请注意,对于真正的代码,与只以尽可能快的速度重复同一行的代码不同,您可以使用可读的
fileevent
来触发对
get
的调用

proc read_line {pipeline} {
    gets $pipeline line
    if {[eof $pipeline]} {
        close $pipeline
    } else {
        puts $line
    }
}
fileevent $pipeline readable [list read_line $pipeline]

但是,您的特定脚本可能会触发得太频繁,并使GUI缺少一些事件。这实际上只是一个输出量非常大的问题。

我现在没有时间正确回答,但您需要将子流程作为管道启动,然后在需要停止时终止子流程并关闭管道。你在哪个站台?这(不幸地)对这个问题意义重大。另外,您希望
a.tcl
的输出发生什么变化?您可能可以使用一个线程,而不是整个单独的进程。。。