我是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的内容吗?
答案 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
手册,了解如何获取目录内容列表。