Although standard Tk doesn't supply a toggle button, and most developers seem content to use a checkbox in its place, Uwe Klein illustrates how easy it is to customize a button by refinement of a label:
set ::state OFF label .lb -textvariable ::state -relief raised -bd 4 bind .lb <ButtonPress-1> { if {"$::state" == "OFF"} { set ::state ON %W configure -relief sunken } else { set ::state OFF %W configure -relief raised } } label .l -textvariable ::state pack .lb .l -side left
[Comments: all buttons thus; deserves abstraction; backward-compatible only to 8.?]