微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Tcl/Tk : 使用 tk 按钮执行 tcl 脚本

假设有一个包含无限循环条件的 a.tcl,例如,

while {1} {
    puts $val 
}

我想实现一个 tk-button,它执行 a.tcl 文件并继续运行并以固定的时间间隔在 tk-text 窗口中打印 $val,例如每 1 秒。 另外,当我们再次点击那个按钮时,它应该停止运行 a.tcl

注意:我尝试使用 exec tclsh a.tcl 但由于 a.tcl 中的无限 while 循环,它挂起了 tk 窗口

解决方法

如果不是使用 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 时,它应该关闭(因为操作系统管道已关闭)。

请注意,对于真正的代码,而不是尽可能快地一遍又一遍地喷出同一行的代码,您可以改用可读的 fileevent 来触发对 gets 的调用。

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

但是,使用您的特定脚本可能会过于频繁地触发并使事件的 GUI 有点饥饿。这只是非常大量输出的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。