Tcl/Tk:使用Tk按钮执行Tcl脚本
比如说,存在一个包含无限循环条件的.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
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
的输出发生什么变化?您可能可以使用一个线程,而不是整个单独的进程。。。