用户界面-Tcl/Tk示例



Tcl/Tk是编写小型GUI脚本的一种简单方法。

有人能举一个按钮文本小部件的好例子吗。按下该按钮时,应执行shell命令,并将输出管道传输到text小部件。

如果你有其他有用任务的好例子,也请添加它们。

这里有一个使用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

一些建议:

要将输出附加到text小部件,您可以使用索引end,而不是指定行999999,它指的是最后一行换行符之后的位置。例如,

.main insert end "$xn"

要在输出命令时滚动文本,请使用请参阅命令。例如,在附加到.main文本小部件之后

.main see end

您可能还需要考虑使用fileevent命令异步获取命令输出。

我可以开始。。。请提出改进建议。I.e我希望它在命令输出时滚动

#!/usr/bin/wish
proc push_button {} {
    put_text
    .main see end
}
proc put_text {} {
  set f [ open "| date" r]
  while {[gets $f x] >= 0} {
    .main insert end "$xn"    
  }
  catch {close $f}
}
button .but -text "Push Me" -command "push_button"
text .main -relief sunken -bd 2 -yscrollcommand ".scroll set"
scrollbar .scroll -command ".main yview"
pack .but
pack .main -side left -fill y
pack .scroll -side right -fill y

wiki.tcl.tk是一个很好的网站,适用于各种示例

相关内容

  • 没有找到相关文章

最新更新