2008-10-03 13 views
10

Tcl/Tk là một cách đơn giản để viết các GUI nhỏ.Ví dụ về Tcl/Tk?

Bất kỳ ai cũng có thể đưa ra một ví dụ hay với một nút văn bản. Khi nút được nhấn nên lệnh shell được thực hiện và đầu ra được chuyển đến tiện ích văn bản.

Nếu bạn có các ví dụ đẹp và sạch khác cho các tác vụ hữu ích, vui lòng thêm chúng.

Trả lời

12

Dưới đây là ví dụ hoàn chỉnh hơn bằng cách sử dụng các tệp. Thao tác này sẽ tự động cuộn mọi lúc. Đối với mục đích khả năng sử dụng, bạn có thể chỉ muốn tự động cuộn nếu phần cuối của văn bản hiển thị (ví dụ: nếu người dùng không di chuyển thanh cuộn) nhưng tôi sẽ để nó như một bài tập để người đọc giữ ví dụ dài này không còn nữa.

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 
3

Tôi có thể bắt đầu ... vui lòng đề xuất cải tiến. Tức là tôi muốn nó di chuyển như lệnh được xuất ra

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

Một số gợi ý:

Để thêm đầu ra cho văn bản phụ tùng, thay vì quy định cụ thể dòng 999999, bạn có thể sử dụng chỉ số kết thúc, đề cập đến vị trí ngay sau dòng cuối cùng mới. Ví dụ,

.main insert end "$x\n" 

Để có cuộn văn bản như lệnh được xuất ra, sử dụng thấy lệnh. Ví dụ, sau khi phụ thêm vào các widget văn bản .main

.main see end 

Bạn cũng có thể muốn xem xét grabbing đầu ra lệnh không đồng bộ, bằng cách sử dụng các fileevent lệnh.

+0

tuyệt vời! sẽ cố gắng ... – epatel