📄 spinbox.tk
字号:
# OpenPBS (Portable Batch System) v2.3 Software License# # Copyright (c) 1999-2000 Veridian Information Solutions, Inc.# All rights reserved.# # ---------------------------------------------------------------------------# For a license to use or redistribute the OpenPBS software under conditions# other than those described below, or to purchase support for this software,# please contact Veridian Systems, PBS Products Department ("Licensor") at:# # www.OpenPBS.org +1 650 967-4675 sales@OpenPBS.org# 877 902-4PBS (US toll-free)# ---------------------------------------------------------------------------# # This license covers use of the OpenPBS v2.3 software (the "Software") at# your site or location, and, for certain users, redistribution of the# Software to other sites and locations. Use and redistribution of# OpenPBS v2.3 in source and binary forms, with or without modification,# are permitted provided that all of the following conditions are met.# After December 31, 2001, only conditions 3-6 must be met:# # 1. Commercial and/or non-commercial use of the Software is permitted# provided a current software registration is on file at www.OpenPBS.org.# If use of this software contributes to a publication, product, or# service, proper attribution must be given; see www.OpenPBS.org/credit.html# # 2. Redistribution in any form is only permitted for non-commercial,# non-profit purposes. There can be no charge for the Software or any# software incorporating the Software. Further, there can be no# expectation of revenue generated as a consequence of redistributing# the Software.# # 3. Any Redistribution of source code must retain the above copyright notice# and the acknowledgment contained in paragraph 6, this list of conditions# and the disclaimer contained in paragraph 7.# # 4. Any Redistribution in binary form must reproduce the above copyright# notice and the acknowledgment contained in paragraph 6, this list of# conditions and the disclaimer contained in paragraph 7 in the# documentation and/or other materials provided with the distribution.# # 5. Redistributions in any form must be accompanied by information on how to# obtain complete source code for the OpenPBS software and any# modifications and/or additions to the OpenPBS software. The source code# must either be included in the distribution or be available for no more# than the cost of distribution plus a nominal fee, and all modifications# and additions to the Software must be freely redistributable by any party# (including Licensor) without restriction.# # 6. All advertising materials mentioning features or use of the Software must# display the following acknowledgment:# # "This product includes software developed by NASA Ames Research Center,# Lawrence Livermore National Laboratory, and Veridian Information# Solutions, Inc.# Visit www.OpenPBS.org for OpenPBS software support,# products, and information."# # 7. DISCLAIMER OF WARRANTY# # THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ANY EXPRESS# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT# ARE EXPRESSLY DISCLAIMED.# # IN NO EVENT SHALL VERIDIAN CORPORATION, ITS AFFILIATED COMPANIES, OR THE# U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR INDIRECT,# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# # This license will be governed by the laws of the Commonwealth of Virginia,# without reference to its choice of law rules.################################################################################# This file contains procedures related to spinbox widgets.################################################################################# buildSpinbox: builds a spinbox widget to be filled with 'list_discrete_values'. If# 'list_discrete_values' is of the form "<numX>-<numY>", then it will assume# that the values are integers starting from numX up to numY. 'assocVarName' and# 'assocVarElem' are the associated variable name and element (if variable is # an array) for the spinbox entry widget.# OPTIONS:# 'label_text' - the text string to label the spinbox.# 'label_placement' - where to place 'label_text': right, left, top, bottom.# 'default_val' - default value for the spin box entry.# 'dateFormat' - a boolean for declaring entry to be of date type: meaning # numbers from 0 to 9 are to be given a 0 prefix. proc buildSpinbox {frame_name cols list_discrete_values assocVarName \ assocVarElem \ {label_text ""} {label_placement "right"} {default_val ""} \ {dateFormat 0} } { global canvas if {$dateFormat && [string length $default_val] < 2 && \ $default_val >= 0 && $default_val <= 9 } { set lboxinfo [buildFullEntrybox $frame_name 0 \ "" $cols "0$default_val" "" 0] } else { set lboxinfo [buildFullEntrybox $frame_name 0 \ "" $cols $default_val "" 0] } set sbox [lindex $lboxinfo 2] set sboxf [lindex $lboxinfo end] bind_entry_overselect $sbox pack forget $sboxf scrollbar $frame_name.spinscroll -orient vertical -relief flat \ -borderwidth 2 -command [list spincmd $sbox $dateFormat] label $frame_name.splabel -text $label_text -padx 1 -pady 1 switch -exact -- $label_placement { right { pack $sboxf $frame_name.spinscroll $frame_name.splabel -side left \ -anchor nw } left { pack $frame_name.splabel $sboxf $frame_name.spinscroll -side left \ -anchor nw } top { pack $frame_name.splabel -side top -anchor nw pack $sboxf $frame_name.spinscroll -side left -after $frame_name.splabel \ -anchor nw } bottom { pack $sboxf $frame_name.spinscroll -side left -anchor nw pack $frame_name.splabel -side bottom -anchor nw -before $sboxf } default { pack $sboxf -side left -anchor c -pady 2 pack $frame_name.spinscroll -side right -anchor nw -pady 2 } }# Initialize some special global variables if [regexp "(.+)\\((.+)\\)" $assocVarElem match elem1 elem2] { set assocVarElem "${elem1}_${elem2}" } global vlist.$sbox ;# vlist.? holds the list of ;# valid values for the ;# spin box. set vlist.$sbox $list_discrete_values if { [string compare $assocVarElem ""] != 0 } { set value.$sbox $assocVarName\($assocVarElem\) } else { set value.$sbox $assocVarName } $sbox configure -textvariable [set value.$sbox] -relief groove register_spinbox $sbox return [concat $frame_name $sbox $frame_name.spinscroll $frame_name.splabel]}# spincmd: the associated command when the spinbox widget's scrollbar is manipulated.proc spincmd { sbox dateFormat view_idx } {## It appears that since we have a one entry listbox, then pushing the up## arrow returns an index of -1, and pushing down return an index of 1. if {$view_idx == -1} { incr_spinbox $sbox $dateFormat } else { decr_spinbox $sbox $dateFormat }}# disable_spinbox: disables all the components of a spinbox.proc disable_spinbox {spinEntry spinScroll {spinLabel ""}} { global sysinfo canvas disable_fullentry "" $spinEntry "" if {[string compare $spinScroll ""] != 0} { disable_scrollbar $spinScroll $canvas(disabledColor) } if {[string compare $spinLabel ""] != 0} { disable_label $spinLabel $canvas(disabledColor) }}# enable_spinbox: enables all the components of a spinbox.proc enable_spinbox {spinEntry spinScroll {spinLabel ""}} { enable_fullentry "" $spinEntry "" if {[string compare $spinScroll ""] != 0} { enable_scrollbar $spinScroll } if {[string compare $spinLabel ""] != 0} { enable_label $spinLabel }}# incr_spinbox: procedure that brings into view the "next" element in the# spin box.# OPTION:# The option 'dateFormat' means to construct the numeric entry as a date# format, meaning, add leading 0 for numbers between 0 to 9.#proc incr_spinbox {spbox {dateFormat 0} } { global vlist.$spbox set valueList [set vlist.$spbox] set newval -1 set cval [$spbox get] if [regexp "(\[-0-9]+)-(\[-0-9]+)" $valueList match min max] { if {[string compare $cval ""] == 0} { set cval [expr [digit $min] - 1] } if { [digit $cval] < [digit $max] } { set newval [expr [digit $cval] + 1] $spbox delete 0 end if {$dateFormat && $newval >= 0 && $newval <= 9 } { $spbox insert 0 "0$newval" } else { $spbox insert 0 $newval } } } else { if { [string compare $cval ""] == 0 } { set idx -1 } else { set idx [lsearch $valueList $cval] } if { [expr $idx + 1] < [llength $valueList]} { set newval [lindex $valueList [incr idx]] $spbox delete 0 end $spbox insert 0 $newval } } return $newval}# decr_spinbox: similar to incr_spinbox except in reverse.#proc decr_spinbox {spbox {dateFormat 0} } { global vlist.$spbox set valueList [set vlist.$spbox] set newval -1 set cval [$spbox get] if [regexp "(\[-0-9]+)-(\[-0-9]+)" $valueList match min max] { if {[string compare $cval ""] == 0} { set cval [expr [digit $max] + 1] } if { [digit $cval] > [digit $min] } { set newval [expr [digit $cval] - 1] $spbox delete 0 end if {$dateFormat && $newval >= 0 && $newval <= 9 } { $spbox insert 0 "0$newval" } else { $spbox insert 0 $newval } } } else { if {[string compare $cval ""] == 0} { set idx [llength $valueList] } else { set idx [lsearch $valueList $cval] } if { [expr $idx - 1] >= 0 } { set newval [lindex $valueList [incr idx -1]] $spbox delete 0 end $spbox insert 0 $newval } } return $newval}proc check_spinbox_value {spin_entry} { global vlist.$spin_entry set valueList [set vlist.$spin_entry] set sbox_var [$spin_entry get] if [regexp "(\[-0-9]+)-(\[-0-9]+)" $valueList match min max] { if { ![regexp "^(\[-0-9]+)$" $sbox_var match] || \ ([digit $sbox_var] < $min || [digit $sbox_var] > $max) } { $spin_entry delete 0 end } } elseif { [lsearch -exact $valueList $sbox_var] == -1 } { $spin_entry delete 0 end }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -