Tcl/Tk是一种编写小型GUI脚本的简单方法.
任何人都可以用按钮和文本小部件给出一个很好的例子.按下按钮时,应执行shell命令,并将输出传送到文本小部件.
如果您有其他有用的任务的漂亮和干净的示例,请添加它们.
这是使用fileevents的更完整的示例.这将自动滚动.出于可用性目的,您可能只想在文本底部可见的情况下自动滚动(即:如果用户没有移动滚动条)但我会将其作为练习让读者保留这个已经很久的例子从得到更久.
package require Tk proc main {} { if {[lsearch -exact [font names] TkDefaultFont] == -1} { # older versions of Tk don't define this font, so pick something # suitable font create TkDefaultFont -family Helvetica -size 12 } # in 8.5 we can use {*} but this will work in earlier versions eval font create TkBoldFont [font actual TkDefaultFont] -weight bold buildUI } proc buildUI {} { frame .toolbar scrollbar .vsb -command [list .t yview] text .t \ -width 80 -height 20 \ -yscrollcommand [list .vsb set] \ -highlightthickness 0 .t tag configure command -font TkBoldFont .t tag configure error -font TkDefaultFont -foreground firebrick .t tag configure output -font TkDefaultFont -foreground black grid .toolbar -sticky nsew grid .t .vsb -sticky nsew grid rowconfigure . 1 -weight 1 grid columnconfigure . 0 -weight 1 set i 0 foreach {label command} { date {date} uptime {uptime} ls {ls -l} } { button .b$i -text $label -command [list runCommand $command] pack .b$i -in .toolbar -side left incr i } } proc output {type text} { .t configure -state normal .t insert end $text $type "\n" .t see end .t configure -state disabled } proc runCommand {cmd} { output command $cmd set f [open "| $cmd" r] fconfigure $f -blocking false fileevent $f readable [list handleFileEvent $f] } proc closePipe {f} { # turn blocking on so we can catch any errors fconfigure $f -blocking true if {[catch {close $f} err]} { output error $err } } proc handleFileEvent {f} { set status [catch { gets $f line } result] if { $status != 0 } { # unexpected error output error $result closePipe $f } elseif { $result >= 0 } { # we got some output output normal $line } elseif { [eof $f] } { # End of file closePipe $f } elseif { [fblocked $f] } { # Read blocked, so do nothing } } main