widget
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:12k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/bin/sh
  2. # the next line restarts using wish 
  3. exec wish "$0" "$@"
  4. # widget --
  5. # This script demonstrates the various widgets provided by Tk,
  6. # along with many of the features of the Tk toolkit.  This file
  7. # only contains code to generate the main window for the
  8. # application, which invokes individual demonstrations.  The
  9. # code for the actual demonstrations is contained in separate
  10. # ".tcl" files is this directory, which are sourced by this script
  11. # as needed.
  12. #
  13. # RCS: @(#) $Id: widget,v 1.9.2.3 2007/11/09 06:48:32 das Exp $
  14. eval destroy [winfo child .]
  15. wm title . "Widget Demonstration"
  16. if {[tk windowingsystem] eq "x11"} {
  17.     # This won't work everywhere, but there's no other way in core Tk
  18.     # at the moment to display a coloured icon.
  19.     image create photo TclPowered 
  20.     -file [file join $tk_library images logo64.gif]
  21.     wm iconwindow . [toplevel ._iconWindow]
  22.     pack [label ._iconWindow.i -image TclPowered]
  23.     wm iconname . "tkWidgetDemo"
  24. }
  25. array set widgetFont {
  26.     main   {Helvetica 12}
  27.     bold   {Helvetica 12 bold}
  28.     title  {Helvetica 18 bold}
  29.     status {Helvetica 10}
  30.     vars   {Helvetica 14}
  31. }
  32. set widgetDemo 1
  33. set font $widgetFont(main)
  34. #----------------------------------------------------------------
  35. # The code below create the main window, consisting of a menu bar
  36. # and a text widget that explains how to use the program, plus lists
  37. # all of the demos as hypertext items.
  38. #----------------------------------------------------------------
  39. menu .menuBar -tearoff 0
  40. if {[tk windowingsystem] ne "classic" && [tk windowingsystem] ne "aqua"} {
  41.     .menuBar add cascade -menu .menuBar.file -label "File" -underline 0
  42.     menu .menuBar.file -tearoff 0
  43.     .menuBar.file add command -label "About..." -command "tkAboutDialog" 
  44. -underline 0 -accelerator "<F1>"
  45.     .menuBar.file add sep
  46.     .menuBar.file add command -label "Quit" -command "exit" -underline 0 
  47. -accelerator "Meta-Q"
  48.     bind . <F1> tkAboutDialog
  49. }
  50. . configure -menu .menuBar
  51. frame .statusBar
  52. label .statusBar.lab -text "   " -relief sunken -bd 1 
  53. -font $widgetFont(status) -anchor w
  54. label .statusBar.foo -width 8 -relief sunken -bd 1 
  55. -font $widgetFont(status) -anchor w
  56. pack .statusBar.lab -side left -padx 2 -expand yes -fill both
  57. pack .statusBar.foo -side left -padx 2
  58. pack .statusBar -side bottom -fill x -pady 2
  59. set textheight 30
  60. catch {
  61.     set textheight [expr {
  62. ([winfo screenheight .] - 200) /
  63. [font metrics $widgetFont(main) -displayof . -linespace]
  64.     }]
  65. }
  66. frame .textFrame
  67. scrollbar .s -orient vertical -command {.t yview} -highlightthickness 0 
  68.     -takefocus 1
  69. pack .s -in .textFrame -side right -fill y
  70. text .t -yscrollcommand {.s set}  -wrap word  -width 70  -height $textheight 
  71. -font $widgetFont(main)  -setgrid 1  -highlightthickness 0 
  72. -padx 4  -pady 2  -takefocus 0
  73. pack .t -in .textFrame -expand y -fill both -padx 1
  74. pack  .textFrame -expand yes -fill both
  75. # Create a bunch of tags to use in the text widget, such as those for
  76. # section titles and demo descriptions.  Also define the bindings for
  77. # tags.
  78. .t tag configure title -font $widgetFont(title)
  79. .t tag configure bold  -font $widgetFont(bold)
  80. # We put some "space" characters to the left and right of each demo description
  81. # so that the descriptions are highlighted only when the mouse cursor
  82. # is right over them (but not when the cursor is to their left or right)
  83. #
  84. .t tag configure demospace -lmargin1 1c -lmargin2 1c
  85. if {[winfo depth .] == 1} {
  86.     .t tag configure demo -lmargin1 1c -lmargin2 1c 
  87. -underline 1
  88.     .t tag configure visited -lmargin1 1c -lmargin2 1c 
  89. -underline 1
  90.     .t tag configure hot -background black -foreground white
  91. } else {
  92.     .t tag configure demo -lmargin1 1c -lmargin2 1c 
  93. -foreground blue -underline 1
  94.     .t tag configure visited -lmargin1 1c -lmargin2 1c 
  95. -foreground #303080 -underline 1
  96.     .t tag configure hot -foreground red -underline 1
  97. }
  98. .t tag bind demo <ButtonRelease-1> {
  99.     invoke [.t index {@%x,%y}]
  100. }
  101. set lastLine ""
  102. .t tag bind demo <Enter> {
  103.     set lastLine [.t index {@%x,%y linestart}]
  104.     .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
  105.     .t config -cursor hand2
  106.     showStatus [.t index {@%x,%y}]
  107. }
  108. .t tag bind demo <Leave> {
  109.     .t tag remove hot 1.0 end
  110.     .t config -cursor xterm
  111.     .statusBar.lab config -text ""
  112. }
  113. .t tag bind demo <Motion> {
  114.     set newLine [.t index {@%x,%y linestart}]
  115.     if {[string compare $newLine $lastLine] != 0} {
  116. .t tag remove hot 1.0 end
  117. set lastLine $newLine
  118. set tags [.t tag names {@%x,%y}]
  119. set i [lsearch -glob $tags demo-*]
  120. if {$i >= 0} {
  121.     .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
  122. }
  123.     }
  124.     showStatus [.t index {@%x,%y}]
  125. }
  126. # Create the text for the text widget.
  127. proc addDemoSection {title demos} {
  128.     .t insert end "n" {} $title title " n " demospace
  129.     set num 0
  130.     foreach {name description} $demos {
  131. .t insert end "[incr num]. $description." [list demo demo-$name]
  132. .t insert end " n " demospace
  133.     }
  134. }
  135. .t insert end "Tk Widget Demonstrationsn" title
  136. .t insert end "nThis application provides a front end for several short
  137. scripts that demonstrate what you can do with Tk widgets.  Each of
  138. the numbered lines below describes a demonstration;  you can click
  139. on it to invoke the demonstration.  Once the demonstration window
  140. appears, you can click the " {} "See Code" bold " button to see the
  141. Tcl/Tk code that created the demonstration.  If you wish, you can
  142. edit the code and click the " {} "Rerun Demo" bold " button in the
  143. code window to reinvoke the demonstration with the modified code.n"
  144. addDemoSection "Labels, buttons, checkbuttons, and radiobuttons" {
  145.     label "Labels (text and bitmaps)"
  146.     unicodeout "Labels and UNICODE text"
  147.     button "Buttons"
  148.     check "Check-buttons (select any of a group)"
  149.     radio "Radio-buttons (select one of a group)"
  150.     puzzle "A 15-puzzle game made out of buttons"
  151.     icon "Iconic buttons that use bitmaps"
  152.     image1 "Two labels displaying images"
  153.     image2 "A simple user interface for viewing images"
  154.     labelframe "Labelled frames"
  155. }
  156. addDemoSection "Listboxes" {
  157.     states "The 50 states"
  158.     colors "Colors: change the color scheme for the application"
  159.     sayings "A collection of famous and infamous sayings"
  160. }
  161. addDemoSection "Entries and Spin-boxes" {
  162.     entry1 "Entries without scrollbars"
  163.     entry2 "Entries with scrollbars"
  164.     entry3 "Validated entries and password fields"
  165.     spin "Spin-boxes"
  166.     form "Simple Rolodex-like form"
  167. }
  168. addDemoSection "Text" {
  169.     text "Basic editable text"
  170.     style "Text display styles"
  171.     bind "Hypertext (tag bindings)"
  172.     twind "A text widget with embedded windows"
  173.     search "A search tool built with a text widget"
  174. }
  175. addDemoSection "Canvases" {
  176.     items "The canvas item types"
  177.     plot "A simple 2-D plot"
  178.     ctext "Text items in canvases"
  179.     arrow "An editor for arrowheads on canvas lines"
  180.     ruler "A ruler with adjustable tab stops"
  181.     floor "A building floor plan"
  182.     cscroll "A simple scrollable canvas"
  183. }
  184. addDemoSection "Scales" {
  185.     hscale "Horizontal scale"
  186.     vscale "Vertical scale"
  187. }
  188. addDemoSection "Paned Windows" {
  189.     paned1 "Horizontal paned window"
  190.     paned2 "Vertical paned window"
  191. }
  192. addDemoSection "Menus" {
  193.     menu "Menus and cascades (sub-menus)"
  194.     menubu "Menu-buttons"
  195. }
  196. addDemoSection "Common Dialogs" {
  197.     msgbox "Message boxes"
  198.     filebox "File selection dialog"
  199.     clrpick "Color picker"
  200. }
  201. addDemoSection "Miscellaneous" {
  202.     bitmap "The built-in bitmaps"
  203.     dialog1 "A dialog box with a local grab"
  204.     dialog2 "A dialog box with a global grab"
  205. }
  206. .t configure -state disabled
  207. focus .s
  208. # positionWindow --
  209. # This procedure is invoked by most of the demos to position a
  210. # new demo window.
  211. #
  212. # Arguments:
  213. # w - The name of the window to position.
  214. proc positionWindow w {
  215.     wm geometry $w +300+300
  216. }
  217. # showVars --
  218. # Displays the values of one or more variables in a window, and
  219. # updates the display whenever any of the variables changes.
  220. #
  221. # Arguments:
  222. # w - Name of new window to create for display.
  223. # args - Any number of names of variables.
  224. proc showVars {w args} {
  225.     global widgetFont
  226.     catch {destroy $w}
  227.     toplevel $w
  228.     wm title $w "Variable values"
  229.     label $w.title -text "Variable values:" -width 20 -anchor center 
  230.     -font $widgetFont(vars)
  231.     pack $w.title -side top -fill x
  232.     set len 1
  233.     foreach i $args {
  234. if {[string length $i] > $len} {
  235.     set len [string length $i]
  236. }
  237.     }
  238.     foreach i $args {
  239. frame $w.$i
  240. label $w.$i.name -text "$i: " -width [expr $len + 2] -anchor w
  241. label $w.$i.value -textvar $i -anchor w
  242. pack $w.$i.name -side left
  243. pack $w.$i.value -side left -expand 1 -fill x
  244. pack $w.$i -side top -anchor w -fill x
  245.     }
  246.     button $w.ok -text OK -command "destroy $w" -default active
  247.     bind $w <Return> "tkButtonInvoke $w.ok"
  248.     pack $w.ok -side bottom -pady 2
  249. }
  250. # invoke --
  251. # This procedure is called when the user clicks on a demo description.
  252. # It is responsible for invoking the demonstration.
  253. #
  254. # Arguments:
  255. # index - The index of the character that the user clicked on.
  256. proc invoke index {
  257.     global tk_library
  258.     set tags [.t tag names $index]
  259.     set i [lsearch -glob $tags demo-*]
  260.     if {$i < 0} {
  261. return
  262.     }
  263.     set cursor [.t cget -cursor]
  264.     .t configure -cursor watch
  265.     update
  266.     set demo [string range [lindex $tags $i] 5 end]
  267.     uplevel [list source [file join $tk_library demos $demo.tcl]]
  268.     update
  269.     .t configure -cursor $cursor
  270.     .t tag add visited "$index linestart +1 chars" "$index lineend -1 chars"
  271. }
  272. # showStatus --
  273. #
  274. # Show the name of the demo program in the status bar. This procedure
  275. # is called when the user moves the cursor over a demo description.
  276. #
  277. proc showStatus index {
  278.     global tk_library
  279.     set tags [.t tag names $index]
  280.     set i [lsearch -glob $tags demo-*]
  281.     set cursor [.t cget -cursor]
  282.     if {$i < 0} {
  283. .statusBar.lab config -text " "
  284. set newcursor xterm
  285.     } else {
  286. set demo [string range [lindex $tags $i] 5 end]
  287. .statusBar.lab config -text "Run the "$demo" sample program"
  288. set newcursor hand2
  289.     }
  290.     if [string compare $cursor $newcursor] {
  291. .t config -cursor $newcursor
  292.     }
  293. }
  294. # showCode --
  295. # This procedure creates a toplevel window that displays the code for
  296. # a demonstration and allows it to be edited and reinvoked.
  297. #
  298. # Arguments:
  299. # w - The name of the demonstration's window, which can be
  300. # used to derive the name of the file containing its code.
  301. proc showCode w {
  302.     global tk_library
  303.     set file [string range $w 1 end].tcl
  304.     if ![winfo exists .code] {
  305. toplevel .code
  306. frame .code.buttons
  307. pack .code.buttons -side bottom -fill x
  308. button .code.buttons.dismiss -text Dismiss 
  309.             -default active -command "destroy .code"
  310. button .code.buttons.rerun -text "Rerun Demo" -command {
  311.     eval [.code.text get 1.0 end]
  312. }
  313. pack .code.buttons.dismiss .code.buttons.rerun -side left 
  314.     -expand 1 -pady 2
  315. frame .code.frame
  316. pack  .code.frame -expand yes -fill both -padx 1 -pady 1
  317. text .code.text -height 40 -wrap word
  318.     -xscrollcommand ".code.xscroll set" 
  319.     -yscrollcommand ".code.yscroll set" 
  320.     -setgrid 1 -highlightthickness 0 -pady 2 -padx 3
  321. scrollbar .code.xscroll -command ".code.text xview" 
  322.     -highlightthickness 0 -orient horizontal
  323. scrollbar .code.yscroll -command ".code.text yview" 
  324.     -highlightthickness 0 -orient vertical
  325. grid .code.text -in .code.frame -padx 1 -pady 1 
  326.     -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news
  327. grid .code.yscroll -in .code.frame -padx 1 -pady 1 
  328.     -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
  329. # grid .code.xscroll -in .code.frame -padx 1 -pady 1 
  330. #     -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
  331. grid rowconfig    .code.frame 0 -weight 1 -minsize 0
  332. grid columnconfig .code.frame 0 -weight 1 -minsize 0
  333.     } else {
  334. wm deiconify .code
  335. raise .code
  336.     }
  337.     wm title .code "Demo code: [file join $tk_library demos $file]"
  338.     wm iconname .code $file
  339.     set id [open [file join $tk_library demos $file]]
  340.     .code.text delete 1.0 end
  341.     .code.text insert 1.0 [read $id]
  342.     .code.text mark set insert 1.0
  343.     close $id
  344. }
  345. # tkAboutDialog --
  346. #
  347. # Pops up a message box with an "about" message
  348. #
  349. proc tkAboutDialog {} {
  350.     tk_messageBox -icon info -type ok -title "About Widget Demo" -message 
  351. "Tk widget demonstration
  352. Copyright (c) 1996-1997 Sun Microsystems, Inc.
  353. Copyright (c) 1997-2000 Ajuba Solutions, Inc.
  354. Copyright (c) 2001-2002 Donal K. Fellows
  355. Copyright (c) 2002-2007 Daniel A. Steffen"
  356. }
  357. # Local Variables:
  358. # mode: tcl
  359. # End: