Tcl / Tk的例子?
时间:2020-03-06 15:04:04 来源:igfitidea点击:
Tcl / Tk是编写小型GUI脚本的简单方法。
任何人都可以用按钮和文本小部件来举例说明。当按下按钮时,应该执行shell命令并将输出通过管道传递到文本小部件。
如果我们还有其他一些不错的示例来完成有用的任务,请也添加它们。
解决方案
我可以开始...请提出改进建议。即我希望它在命令输出时滚动
#!/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 "$x\n" } 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
一些建议:
要将输出添加到文本小部件,我们可以使用索引结尾,而不是指定第999999行,索引结尾指的是最后一个换行符之后的位置。例如,
.main insert end "$x\n"
要在命令输出时使文本滚动,请使用see命令。例如,添加到.main文本小部件之后
.main see end
我们可能还想考虑通过使用fileevent命令异步获取命令输出。
这是使用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
wiki.tcl.tk是各种示例的不错的网站