# button.tcl --## This file defines the default bindings for Tk label, button,# checkbutton, and radiobutton widgets and provides procedures# that help in implementing those bindings.## Copyright (c) 1992-1994 The Regents of the University of California.# Copyright (c) 1994-1996 Sun Microsystems, Inc.# Copyright (c) 2002 ActiveState Corporation.## See the file "license.terms" for information on usage and redistribution# of this file, and for a DISCLAIMER OF ALL WARRANTIES.##-------------------------------------------------------------------------# The code below creates the default class bindings for buttons.#-------------------------------------------------------------------------if {[tk windowingsystem] eq "aqua"} {bind Radiobutton <Enter> {tk::ButtonEnter %W}bind Radiobutton <1> {tk::ButtonDown %W}bind Radiobutton <ButtonRelease-1> {tk::ButtonUp %W}bind Checkbutton <Enter> {tk::ButtonEnter %W}bind Checkbutton <1> {tk::ButtonDown %W}bind Checkbutton <ButtonRelease-1> {tk::ButtonUp %W}bind Checkbutton <Leave> {tk::ButtonLeave %W}}if {"win32" eq [tk windowingsystem]} {bind Checkbutton <equal> {tk::CheckRadioInvoke %W select}bind Checkbutton <plus> {tk::CheckRadioInvoke %W select}bind Checkbutton <minus> {tk::CheckRadioInvoke %W deselect}bind Checkbutton <1> {tk::CheckRadioDown %W}bind Checkbutton <ButtonRelease-1> {tk::ButtonUp %W}bind Checkbutton <Enter> {tk::CheckRadioEnter %W}bind Checkbutton <Leave> {tk::ButtonLeave %W}bind Radiobutton <1> {tk::CheckRadioDown %W}bind Radiobutton <ButtonRelease-1> {tk::ButtonUp %W}bind Radiobutton <Enter> {tk::CheckRadioEnter %W}}if {"x11" eq [tk windowingsystem]} {bind Checkbutton <Return> {if {!$tk_strictMotif} {tk::CheckInvoke %W}}bind Radiobutton <Return> {if {!$tk_strictMotif} {tk::CheckRadioInvoke %W}}bind Checkbutton <1> {tk::CheckInvoke %W}bind Radiobutton <1> {tk::CheckRadioInvoke %W}bind Checkbutton <Enter> {tk::CheckEnter %W}bind Radiobutton <Enter> {tk::ButtonEnter %W}bind Checkbutton <Leave> {tk::CheckLeave %W}}bind Button <space> {tk::ButtonInvoke %W}bind Checkbutton <space> {tk::CheckRadioInvoke %W}bind Radiobutton <space> {tk::CheckRadioInvoke %W}bind Button <<Invoke>> {tk::ButtonInvoke %W}bind Checkbutton <<Invoke>> {tk::CheckRadioInvoke %W}bind Radiobutton <<Invoke>> {tk::CheckRadioInvoke %W}bind Button <FocusIn> {}bind Button <Enter> {tk::ButtonEnter %W}bind Button <Leave> {tk::ButtonLeave %W}bind Button <1> {tk::ButtonDown %W}bind Button <ButtonRelease-1> {tk::ButtonUp %W}bind Checkbutton <FocusIn> {}bind Radiobutton <FocusIn> {}bind Radiobutton <Leave> {tk::ButtonLeave %W}if {"win32" eq [tk windowingsystem]} {########################## Windows implementation########################## ::tk::ButtonEnter --# The procedure below is invoked when the mouse pointer enters a# button widget. It records the button we're in and changes the# state of the button to active unless the button is disabled.## Arguments:# w - The name of the widget.proc ::tk::ButtonEnter w {variable ::tk::Privif {[$w cget -state] ne "disabled"} {# If the mouse button is down, set the relief to sunken on entry.# Overwise, if there's an -overrelief value, set the relief to that.set Priv($w,relief) [$w cget -relief]if {$Priv(buttonWindow) eq $w} {$w configure -relief sunken -state activeset Priv($w,prelief) sunken} elseif {[set over [$w cget -overrelief]] ne ""} {$w configure -relief $overset Priv($w,prelief) $over}}set Priv(window) $w}# ::tk::ButtonLeave --# The procedure below is invoked when the mouse pointer leaves a# button widget. It changes the state of the button back to inactive.# Restore any modified relief too.## Arguments:# w - The name of the widget.proc ::tk::ButtonLeave w {variable ::tk::Privif {[$w cget -state] ne "disabled"} {$w configure -state normal}# Restore the original button relief if it was changed by Tk.# That is signaled by the existence of Priv($w,prelief).if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}set Priv(window) ""}# ::tk::ButtonDown --# The procedure below is invoked when the mouse button is pressed in# a button widget. It records the fact that the mouse is in the button,# saves the button's relief so it can be restored later, and changes# the relief to sunken.## Arguments:# w - The name of the widget.proc ::tk::ButtonDown w {variable ::tk::Priv# Only save the button's relief if it does not yet exist. If there# is an overrelief setting, Priv($w,relief) will already have been set,# and the current value of the -relief option will be incorrect.if {![info exists Priv($w,relief)]} {set Priv($w,relief) [$w cget -relief]}if {[$w cget -state] ne "disabled"} {set Priv(buttonWindow) $w$w configure -relief sunken -state activeset Priv($w,prelief) sunken# If this button has a repeatdelay set up, get it going with an afterafter cancel $Priv(afterId)set delay [$w cget -repeatdelay]set Priv(repeated) 0if {$delay > 0} {set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]]}}}# ::tk::ButtonUp --# The procedure below is invoked when the mouse button is released# in a button widget. It restores the button's relief and invokes# the command as long as the mouse hasn't left the button.## Arguments:# w - The name of the widget.proc ::tk::ButtonUp w {variable ::tk::Privif {$Priv(buttonWindow) eq $w} {set Priv(buttonWindow) ""# Restore the button's relief if it was cached.if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}# Clean up the after event from the auto-repeaterafter cancel $Priv(afterId)if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} {$w configure -state normal# Only invoke the command if it wasn't already invoked by the# auto-repeater functionalityif { $Priv(repeated) == 0 } {uplevel #0 [list $w invoke]}}}}# ::tk::CheckRadioEnter --# The procedure below is invoked when the mouse pointer enters a# checkbutton or radiobutton widget. It records the button we're in# and changes the state of the button to active unless the button is# disabled.## Arguments:# w - The name of the widget.proc ::tk::CheckRadioEnter w {variable ::tk::Privif {[$w cget -state] ne "disabled"} {if {$Priv(buttonWindow) eq $w} {$w configure -state active}if {[set over [$w cget -overrelief]] ne ""} {set Priv($w,relief) [$w cget -relief]set Priv($w,prelief) $over$w configure -relief $over}}set Priv(window) $w}# ::tk::CheckRadioDown --# The procedure below is invoked when the mouse button is pressed in# a button widget. It records the fact that the mouse is in the button,# saves the button's relief so it can be restored later, and changes# the relief to sunken.## Arguments:# w - The name of the widget.proc ::tk::CheckRadioDown w {variable ::tk::Privif {![info exists Priv($w,relief)]} {set Priv($w,relief) [$w cget -relief]}if {[$w cget -state] ne "disabled"} {set Priv(buttonWindow) $wset Priv(repeated) 0$w configure -state active}}}if {"x11" eq [tk windowingsystem]} {###################### Unix implementation###################### ::tk::ButtonEnter --# The procedure below is invoked when the mouse pointer enters a# button widget. It records the button we're in and changes the# state of the button to active unless the button is disabled.## Arguments:# w - The name of the widget.proc ::tk::ButtonEnter {w} {variable ::tk::Privif {[$w cget -state] ne "disabled"} {# On unix the state is active just with mouse-over$w configure -state active# If the mouse button is down, set the relief to sunken on entry.# Overwise, if there's an -overrelief value, set the relief to that.set Priv($w,relief) [$w cget -relief]if {$Priv(buttonWindow) eq $w} {$w configure -relief sunkenset Priv($w,prelief) sunken} elseif {[set over [$w cget -overrelief]] ne ""} {$w configure -relief $overset Priv($w,prelief) $over}}set Priv(window) $w}# ::tk::ButtonLeave --# The procedure below is invoked when the mouse pointer leaves a# button widget. It changes the state of the button back to inactive.# Restore any modified relief too.## Arguments:# w - The name of the widget.proc ::tk::ButtonLeave w {variable ::tk::Privif {[$w cget -state] ne "disabled"} {$w configure -state normal}# Restore the original button relief if it was changed by Tk.# That is signaled by the existence of Priv($w,prelief).if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}set Priv(window) ""}# ::tk::ButtonDown --# The procedure below is invoked when the mouse button is pressed in# a button widget. It records the fact that the mouse is in the button,# saves the button's relief so it can be restored later, and changes# the relief to sunken.## Arguments:# w - The name of the widget.proc ::tk::ButtonDown w {variable ::tk::Priv# Only save the button's relief if it does not yet exist. If there# is an overrelief setting, Priv($w,relief) will already have been set,# and the current value of the -relief option will be incorrect.if {![info exists Priv($w,relief)]} {set Priv($w,relief) [$w cget -relief]}if {[$w cget -state] ne "disabled"} {set Priv(buttonWindow) $w$w configure -relief sunkenset Priv($w,prelief) sunken# If this button has a repeatdelay set up, get it going with an afterafter cancel $Priv(afterId)set delay [$w cget -repeatdelay]set Priv(repeated) 0if {$delay > 0} {set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]]}}}# ::tk::ButtonUp --# The procedure below is invoked when the mouse button is released# in a button widget. It restores the button's relief and invokes# the command as long as the mouse hasn't left the button.## Arguments:# w - The name of the widget.proc ::tk::ButtonUp w {variable ::tk::Privif {$w eq $Priv(buttonWindow)} {set Priv(buttonWindow) ""# Restore the button's relief if it was cached.if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}# Clean up the after event from the auto-repeaterafter cancel $Priv(afterId)if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} {# Only invoke the command if it wasn't already invoked by the# auto-repeater functionalityif { $Priv(repeated) == 0 } {uplevel #0 [list $w invoke]}}}}}if {[tk windowingsystem] eq "aqua"} {##################### Mac implementation##################### ::tk::ButtonEnter --# The procedure below is invoked when the mouse pointer enters a# button widget. It records the button we're in and changes the# state of the button to active unless the button is disabled.## Arguments:# w - The name of the widget.proc ::tk::ButtonEnter {w} {variable ::tk::Privif {[$w cget -state] ne "disabled"} {# If there's an -overrelief value, set the relief to that.if {$Priv(buttonWindow) eq $w} {$w configure -state active} elseif {[set over [$w cget -overrelief]] ne ""} {set Priv($w,relief) [$w cget -relief]set Priv($w,prelief) $over$w configure -relief $over}}set Priv(window) $w}# ::tk::ButtonLeave --# The procedure below is invoked when the mouse pointer leaves a# button widget. It changes the state of the button back to# inactive. If we're leaving the button window with a mouse button# pressed (Priv(buttonWindow) == $w), restore the relief of the# button too.## Arguments:# w - The name of the widget.proc ::tk::ButtonLeave w {variable ::tk::Privif {$w eq $Priv(buttonWindow)} {$w configure -state normal}# Restore the original button relief if it was changed by Tk.# That is signaled by the existence of Priv($w,prelief).if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}set Priv(window) ""}# ::tk::ButtonDown --# The procedure below is invoked when the mouse button is pressed in# a button widget. It records the fact that the mouse is in the button,# saves the button's relief so it can be restored later, and changes# the relief to sunken.## Arguments:# w - The name of the widget.proc ::tk::ButtonDown w {variable ::tk::Privif {[$w cget -state] ne "disabled"} {set Priv(buttonWindow) $w$w configure -state active# If this button has a repeatdelay set up, get it going with an afterafter cancel $Priv(afterId)set Priv(repeated) 0if { ![catch {$w cget -repeatdelay} delay] } {if {$delay > 0} {set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]]}}}}# ::tk::ButtonUp --# The procedure below is invoked when the mouse button is released# in a button widget. It restores the button's relief and invokes# the command as long as the mouse hasn't left the button.## Arguments:# w - The name of the widget.proc ::tk::ButtonUp w {variable ::tk::Privif {$Priv(buttonWindow) eq $w} {set Priv(buttonWindow) ""$w configure -state normal# Restore the button's relief if it was cached.if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}# Clean up the after event from the auto-repeaterafter cancel $Priv(afterId)if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} {# Only invoke the command if it wasn't already invoked by the# auto-repeater functionalityif { $Priv(repeated) == 0 } {uplevel #0 [list $w invoke]}}}}}################### Shared routines################### ::tk::ButtonInvoke --# The procedure below is called when a button is invoked through# the keyboard. It simulate a press of the button via the mouse.## Arguments:# w - The name of the widget.proc ::tk::ButtonInvoke w {if {[winfo exists $w] && [$w cget -state] ne "disabled"} {set oldRelief [$w cget -relief]set oldState [$w cget -state]$w configure -state active -relief sunkenafter 100 [list ::tk::ButtonInvokeEnd $w $oldState $oldRelief]}}# ::tk::ButtonInvokeEnd --# The procedure below is called after a button is invoked through# the keyboard. It simulate a release of the button via the mouse.## Arguments:# w - The name of the widget.# oldState - Old state to be set back.# oldRelief - Old relief to be set back.proc ::tk::ButtonInvokeEnd {w oldState oldRelief} {if {[winfo exists $w]} {$w configure -state $oldState -relief $oldReliefuplevel #0 [list $w invoke]}}# ::tk::ButtonAutoInvoke --## Invoke an auto-repeating button, and set it up to continue to repeat.## Arguments:# w button to invoke.## Results:# None.## Side effects:# May create an after event to call ::tk::ButtonAutoInvoke.proc ::tk::ButtonAutoInvoke {w} {variable ::tk::Privafter cancel $Priv(afterId)set delay [$w cget -repeatinterval]if {$Priv(window) eq $w} {incr Priv(repeated)uplevel #0 [list $w invoke]}if {$delay > 0} {set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]]}}# ::tk::CheckRadioInvoke --# The procedure below is invoked when the mouse button is pressed in# a checkbutton or radiobutton widget, or when the widget is invoked# through the keyboard. It invokes the widget if it# isn't disabled.## Arguments:# w - The name of the widget.# cmd - The subcommand to invoke (one of invoke, select, or deselect).proc ::tk::CheckRadioInvoke {w {cmd invoke}} {if {[$w cget -state] ne "disabled"} {uplevel #0 [list $w $cmd]}}# Special versions of the handlers for checkbuttons on Unix that do the magic# to make things work right when the checkbutton indicator is hidden;# radiobuttons don't need this complexity.# ::tk::CheckInvoke --# The procedure below invokes the checkbutton, like ButtonInvoke, but handles# what to do when the checkbutton indicator is missing. Only used on Unix.## Arguments:# w - The name of the widget.proc ::tk::CheckInvoke {w} {variable ::tk::Privif {[$w cget -state] ne "disabled"} {# Additional logic to switch the "selected" colors around if necessary# (when we're indicator-less).if {![$w cget -indicatoron] && [info exist Priv($w,selectcolor)]} {if {[$w cget -selectcolor] eq $Priv($w,aselectcolor)} {$w configure -selectcolor $Priv($w,selectcolor)} else {$w configure -selectcolor $Priv($w,aselectcolor)}}uplevel #0 [list $w invoke]}}# ::tk::CheckEnter --# The procedure below enters the checkbutton, like ButtonEnter, but handles# what to do when the checkbutton indicator is missing. Only used on Unix.## Arguments:# w - The name of the widget.proc ::tk::CheckEnter {w} {variable ::tk::Privif {[$w cget -state] ne "disabled"} {# On unix the state is active just with mouse-over$w configure -state active# If the mouse button is down, set the relief to sunken on entry.# Overwise, if there's an -overrelief value, set the relief to that.set Priv($w,relief) [$w cget -relief]if {$Priv(buttonWindow) eq $w} {$w configure -relief sunkenset Priv($w,prelief) sunken} elseif {[set over [$w cget -overrelief]] ne ""} {$w configure -relief $overset Priv($w,prelief) $over}# Compute what the "selected and active" color should be.if {![$w cget -indicatoron] && [$w cget -selectcolor] ne ""} {set Priv($w,selectcolor) [$w cget -selectcolor]lassign [winfo rgb $w [$w cget -selectcolor]] r1 g1 b1lassign [winfo rgb $w [$w cget -activebackground]] r2 g2 b2set Priv($w,aselectcolor) \[format "#%04x%04x%04x" [expr {($r1+$r2)/2}] \[expr {($g1+$g2)/2}] [expr {($b1+$b2)/2}]]# use uplevel to work with other var resolversif {[uplevel #0 [list set [$w cget -variable]]]eq [$w cget -onvalue]} {$w configure -selectcolor $Priv($w,aselectcolor)}}}set Priv(window) $w}# ::tk::CheckLeave --# The procedure below leaves the checkbutton, like ButtonLeave, but handles# what to do when the checkbutton indicator is missing. Only used on Unix.## Arguments:# w - The name of the widget.proc ::tk::CheckLeave {w} {variable ::tk::Privif {[$w cget -state] ne "disabled"} {$w configure -state normal}# Restore the original button "selected" color; assume that the user# wasn't monkeying around with things too much.if {![$w cget -indicatoron] && [info exist Priv($w,selectcolor)]} {$w configure -selectcolor $Priv($w,selectcolor)}unset -nocomplain Priv($w,selectcolor) Priv($w,aselectcolor)# Restore the original button relief if it was changed by Tk. That is# signaled by the existence of Priv($w,prelief).if {[info exists Priv($w,relief)]} {if {[info exists Priv($w,prelief)] && \$Priv($w,prelief) eq [$w cget -relief]} {$w configure -relief $Priv($w,relief)}unset -nocomplain Priv($w,relief) Priv($w,prelief)}set Priv(window) ""}return# Local Variables:# mode: tcl# fill-column: 78# End:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。