Updated 2013-09-16 22:27:07 by RLE

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.?]

KPV: tile has something similar--the Toolbutton style for a checkbutton. This is designed for a button bar, so it usually looks better if you have an image in the widget.
 package require tile
 ::ttk::checkbutton .c1 -text "ON" -style Toolbutton
 pack .c1

MG The Tk checkbutton has very simple support for this feature, too, with the -indicatoron option, which makes it work exactly as a togglebutton.
  pack [checkbutton .c -text "Click me" -indicatoron false]

JM 11Feb2011 radiobutton has this option too, so we can have a mutually exclusive set of buttons:
 pack [radiobutton .o1 -text A -indicatoron false -variable valor -value A]
 pack [radiobutton .o2 -text B -indicatoron false -variable valor -value B]
 pack [radiobutton .o3 -text C -indicatoron false -variable valor -value C]