【问题标题】:Tcl/Tk examples?Tcl/Tk 例子?
【发布时间】:2008-10-03 10:25:17
【问题描述】:

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

谁能给出一个带有 buttontext 小部件的好例子。当按下按钮时,应该执行一个 shell 命令并将输出通过管道传送到 text 小部件。

如果您有其他漂亮且干净的有用任务示例,请也添加它们。

【问题讨论】:

    标签: user-interface scripting tcl tk


    【解决方案1】:

    这是一个使用文件事件的更完整示例。这将一直自动滚动。出于可用性目的,您可能只想在文本底部可见时自动滚动(即:如果用户没有移动滚动条),但我将把它作为练习留给读者,以保持这个已经很长的例子不要再长了。

    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】:

      一些建议:

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

      .main insert end "$x\n"
      

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

      .main see end
      

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

      【讨论】:

        【解决方案3】:

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

        #!/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】:

          wiki.tcl.tk是各种examples的好网站

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多