代码之家  ›  专栏  ›  技术社区  ›  epatel

Tcl/Tk示例?

  •  10
  • epatel  · 技术社区  · 17 年前

    Tcl/Tk

    有人能举一个好例子吗 按钮 文本 小装置。按下按钮时,是否应执行shell命令并将输出通过管道传输到 文本

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

    4 回复  |  直到 17 年前
        1
  •  14
  •   Bryan Oakley    17 年前

    下面是一个使用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
    
        2
  •  4
  •   erichui    17 年前

    将输出附加到 文本 小部件,而不是指定行999999,您可以使用索引 终止

    .main insert end "$x\n"
    

    要在命令输出时滚动文本,请使用 看见

    .main see end
    

    文件事件 命令

        3
  •  3
  •   epatel    17 年前

    我可以开始…请提出改进建议。也就是说,我希望它在命令输出时滚动

    #!/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
    
        4
  •  2
  •   raspi    17 年前