使用tcl在GUI中显示内容

时间:2012-09-26 06:48:32

标签: perl user-interface tcl

我是GUI的新手,我试图在tcl中创建一个简单的GUI。它有一个按钮,按下该按钮运行代码并在目录中生成输出'.l'文件。但我希望输出在GUI本身打印。那我该如何改变这段代码才能完成任务。

proc makeTop { } {
    toplevel .top ;#Make the window
    #Put things in it
    label .top.lab -text "This is output Window" -font "ansi 12 bold"
    text .top.txt 
    .top.txt insert end "XXX.l"
    #An option to close the window.
    button .top.but -text "Close" -command { destroy .top }
    #Pack everything
    pack .top.lab .top.txt .top.but
}

label .lab -text "This is perl" -font "ansi 12 bold"
button .but -text "run perl" -command { exec perl run_me }
pack .lab .but

任何人都可以帮我在GUI本身显示输出文件XXX.l的内容吗?

1 个答案:

答案 0 :(得分:0)

对于只将结果打印到stdout的简单程序,它很简单:exec返回程序的所有标准输出。因此,您只需阅读exec来电的返回值:

proc exec_and_print {args} {
    .top.txt insert end [exec {*}$args]
}

但请记住,exec只在程序退出后返回。对于您希望输出立即显示在文本框中的长时间运行程序,您可以使用open。如果传递给open的文件名的第一个字符是|,则open假定该字符串是要执行的命令行。使用open,您可以获得一个可以连续阅读的i / o频道:

proc long_running_exec {args} {
    set chan [open "| $args"]

    # disable blocking to prevent read from freezing our UI:
    fconfigure $chan -blocking 0

    # use fileevent to read $chan only when data is available:
    fileevent $chan readable {
        .top.text insert end [read $chan]

        # remember to clean up after ourselves if the program exits:
        if {[eoc $chan]} {
            close $chan
        }
    }
}

上面的long_running_exec函数立即返回并使用事件来读取输出。这允许您的GUI在外部程序运行时继续运行而不是冻结。要使用它,只需:

button .but -text "run perl" -command { long_running_exec perl run_me }

补充答案:

如果程序生成一个文件作为输出,并且您只想显示该文件的内容,那么只需读取该文件:

proc exec_and_print {args} {
    exec {*}$args

    set f [open output_file]
    .top.txt insert end [read $f]
    close $f
}

如果您知道文件的生成位置但不知道确切的文件名,请阅读glob手册,了解如何获取目录内容列表。