WISH Color Picker

D. McC: Nov 17 2005 - Three things I don't find satisfactory about tk_chooseColor are (1) it doesn't continuously update the color display as you move the sliders; (2) it only shows you a tiny approximation of what color you will get if you move a slider to an area of the scale, and (3) it doesn't let you select colors by name. Here's some code that, whatever may be its shortcomings, doesn't have these three. Just configure the color-display button (.colo.color) to do what you want (e.g., "puts $color" in the code below); then save it as a file, source the file, and run the "wishcolor" command. In this self-contained version, the color names and components are explicitly included; of course you could modify the code if you really want to refer to "rgb.txt" and use "winfo rgb" and whatnot.

 set colorlist [list \
 {255 250 250        snow} \
 {248 248 255        GhostWhite} \
 {245 245 245        WhiteSmoke} \
 {220 220 220        gainsboro} \
 {255 250 240        FloralWhite} \
 {253 245 230        OldLace} \
 {250 240 230        linen} \
 {250 235 215        AntiqueWhite} \
 {255 239 213        PapayaWhip} \
 {255 235 205        BlanchedAlmond} \
 {255 228 196        bisque} \
 {255 218 185        PeachPuff} \
 {255 222 173        NavajoWhite} \
 {255 228 181        moccasin} \
 {255 248 220        cornsilk} \
 {255 255 240        ivory} \
 {255 250 205        LemonChiffon} \
 {255 245 238        seashell} \
 {240 255 240        honeydew} \
 {245 255 250        MintCream} \
 {240 255 255        azure} \
 {240 248 255        AliceBlue} \
 {230 230 250        lavender} \
 {255 240 245        LavenderBlush} \
 {255 228 225        MistyRose} \
 {255 255 255        white} \
 {0 0 0        black} \
 {47 79 79        DarkSlateGray} \
 {105 105 105        DimGray} \
 {112 128 144        SlateGray} \
 {119 136 153        LightSlateGray} \
 {190 190 190        gray} \
 {211 211 211        LightGray} \
 {25 25 112        MidnightBlue} \
 {0 0 128        NavyBlue} \
 {100 149 237        CornflowerBlue} \
 {72 61 139        DarkSlateBlue} \
 {106 90 205        SlateBlue} \
 {123 104 238        MediumSlateBlue} \
 {132 112 255        LightSlateBlue} \
 {0 0 205        MediumBlue} \
 {65 105 225        RoyalBlue} \
 {0 0 255        blue} \
 {30 144 255        DodgerBlue} \
 {0 191 255        DeepSkyBlue} \
 {135 206 235        SkyBlue} \
 {135 206 250        LightSkyBlue} \
 {70 130 180        SteelBlue} \
 {176 196 222        LightSteelBlue} \
 {173 216 230        LightBlue} \
 {176 224 230        PowderBlue} \
 {175 238 238        PaleTurquoise} \
 {0 206 209        DarkTurquoise} \
 {72 209 204        MediumTurquoise} \
 {64 224 208        turquoise} \
 {0 255 255        cyan} \
 {224 255 255        LightCyan} \
 {95 158 160        CadetBlue} \
 {102 205 170        MediumAquamarine} \
 {127 255 212        aquamarine} \
 {0 100 0        DarkGreen} \
 {85 107 47        DarkOliveGreen} \
 {143 188 143        DarkSeaGreen} \
 {46 139 87        SeaGreen} \
 {60 179 113        MediumSeaGreen} \
 {32 178 170        LightSeaGreen} \
 {152 251 152        PaleGreen} \
 {0 255 127        SpringGreen} \
 {124 252 0        LawnGreen} \
 {0 255 0        green} \
 {127 255 0        chartreuse} \
 {0 250 154        MediumSpringGreen} \
 {173 255 47        GreenYellow} \
 {50 205 50        LimeGreen} \
 {154 205 50        YellowGreen} \
 {34 139 34        ForestGreen} \
 {107 142 35        OliveDrab} \
 {189 183 107        DarkKhaki} \
 {240 230 140        khaki} \
 {238 232 170        PaleGoldenrod} \
 {250 250 210        LightGoldenrodYellow} \
 {255 255 224                LightYellow} \
 {255 255 0        yellow} \
 {255 215 0        gold} \
 {238 221 130        LightGoldenrod} \
 {218 165 32        goldenrod} \
 {184 134 11        DarkGoldenrod} \
 {188 143 143        RosyBrown} \
 {205 92 92        IndianRed} \
 {139 69 19        SaddleBrown} \
 {160 82 45        sienna} \
 {205 133 63        peru} \
 {222 184 135        burlywood} \
 {245 245 220        beige} \
 {245 222 179        wheat} \
 {244 164 96        SandyBrown} \
 {210 180 140        tan} \
 {210 105 30        chocolate} \
 {178 34 34        firebrick} \
 {165 42 42        brown} \
 {233 150 122        DarkSalmon} \
 {250 128 114        salmon} \
 {255 160 122        LightSalmon} \
 {255 165 0        orange} \
 {255 140 0        DarkOrange} \
 {255 127 80        coral} \
 {240 128 128        LightCoral} \
 {255 99 71        tomato} \
 {255 69 0        OrangeRed} \
 {255 0 0        red} \
 {255 105 180        HotPink} \
 {255 20 147        DeepPink} \
 {255 192 203        pink} \
 {255 182 193        LightPink} \
 {219 112 147        PaleVioletRed} \
 {176 48 96        maroon} \
 {199 21 133        MediumVioletRed} \
 {208 32 144        VioletRed} \
 {255 0 255        magenta} \
 {238 130 238        violet} \
 {221 160 221        plum} \
 {218 112 214        orchid} \
 {186 85 211        MediumOrchid} \
 {153 50 204        DarkOrchid} \
 {148 0 211        DarkViolet} \
 {138 43 226        BlueViolet} \
 {160 32 240        purple} \
 {147 112 219        MediumPurple} \
 {216 191 216        thistle} \
 {255 250 250        snow1} \
 {238 233 233        snow2} \
 {205 201 201        snow3} \
 {139 137 137        snow4} \
 {255 245 238        seashell1} \
 {238 229 222        seashell2} \
 {205 197 191        seashell3} \
 {139 134 130        seashell4} \
 {255 239 219        AntiqueWhite1} \
 {238 223 204        AntiqueWhite2} \
 {205 192 176        AntiqueWhite3} \
 {139 131 120        AntiqueWhite4} \
 {255 228 196        bisque1} \
 {238 213 183        bisque2} \
 {205 183 158        bisque3} \
 {139 125 107        bisque4} \
 {255 218 185        PeachPuff1} \
 {238 203 173        PeachPuff2} \
 {205 175 149        PeachPuff3} \
 {139 119 101        PeachPuff4} \
 {255 222 173        NavajoWhite1} \
 {238 207 161        NavajoWhite2} \
 {205 179 139   NavajoWhite3} \
 {139 121 94        NavajoWhite4} \
 {255 250 205        LemonChiffon1} \
 {238 233 191        LemonChiffon2} \
 {205 201 165        LemonChiffon3} \
 {139 137 112        LemonChiffon4} \
 {255 248 220        cornsilk1} \
 {238 232 205        cornsilk2} \
 {205 200 177        cornsilk3} \
 {139 136 120        cornsilk4} \
 {255 255 240        ivory1} \
 {238 238 224        ivory2} \
 {205 205 193        ivory3} \
 {139 139 131        ivory4} \
 {240 255 240        honeydew1} \
 {224 238 224        honeydew2} \
 {193 205 193        honeydew3} \
 {131 139 131        honeydew4} \
 {255 240 245        LavenderBlush1} \
 {238 224 229        LavenderBlush2} \
 {205 193 197        LavenderBlush3} \
 {139 131 134        LavenderBlush4} \
 {255 228 225        MistyRose1} \
 {238 213 210        MistyRose2} \
 {205 183 181        MistyRose3} \
 {139 125 123        MistyRose4} \
 {240 255 255        azure1} \
 {224 238 238        azure2} \
 {193 205 205        azure3} \
 {131 139 139        azure4} \
 {131 111 255        SlateBlue1} \
 {122 103 238        SlateBlue2} \
 {105 89 205        SlateBlue3} \
 {71 60 139        SlateBlue4} \
 {72 118 255        RoyalBlue1} \
 {67 110 238        RoyalBlue2} \
 {58 95 205        RoyalBlue3} \
 {39 64 139        RoyalBlue4} \
 {0 0 255        blue1} \
 {0 0 238        blue2} \
 {0 0 205        blue3} \
 {0 0 139        blue4} \
 {30 144 255        DodgerBlue1} \
 {28 134 238        DodgerBlue2} \
 {24 116 205        DodgerBlue3} \
 {16 78 139        DodgerBlue4} \
 {99 184 255        SteelBlue1} \
 {92 172 238        SteelBlue2} \
 {79 148 205        SteelBlue3} \
 {54 100 139        SteelBlue4} \
 {0 191 255        DeepSkyBlue1} \
 {0 178 238        DeepSkyBlue2} \
 {0 154 205        DeepSkyBlue3} \
 {0 104 139        DeepSkyBlue4} \
 {135 206 255        SkyBlue1} \
 {126 192 238        SkyBlue2} \
 {108 166 205        SkyBlue3} \
 {74 112 139        SkyBlue4} \
 {176 226 255        LightSkyBlue1} \
 {164 211 238        LightSkyBlue2} \
 {141 182 205        LightSkyBlue3} \
 {96 123 139        LightSkyBlue4} \
 {198 226 255        SlateGray1} \
 {185 211 238        SlateGray2} \
 {159 182 205        SlateGray3} \
 {108 123 139        SlateGray4} \
 {202 225 255        LightSteelBlue1} \
 {188 210 238        LightSteelBlue2} \
 {162 181 205        LightSteelBlue3} \
 {110 123 139        LightSteelBlue4} \
 {191 239 255        LightBlue1} \
 {178 223 238        LightBlue2} \
 {154 192 205        LightBlue3} \
 {104 131 139        LightBlue4} \
 {224 255 255        LightCyan1} \
 {209 238 238        LightCyan2} \
 {180 205 205        LightCyan3} \
 {122 139 139        LightCyan4} \
 {187 255 255        PaleTurquoise1} \
 {174 238 238        PaleTurquoise2} \
 {150 205 205        PaleTurquoise3} \
 {102 139 139        PaleTurquoise4} \
 {152 245 255        CadetBlue1} \
 {142 229 238        CadetBlue2} \
 {122 197 205        CadetBlue3} \
 {83 134 139        CadetBlue4} \
 {0 245 255        turquoise1} \
 {0 229 238        turquoise2} \
 {0 197 205        turquoise3} \
 {0 134 139        turquoise4} \
 {0 255 255        cyan1} \
 {0 238 238        cyan2} \
 {0 205 205        cyan3} \
 {0 139 139        cyan4} \
 {151 255 255        DarkSlateGray1} \
 {141 238 238        DarkSlateGray2} \
 {121 205 205        DarkSlateGray3} \
 {82 139 139        DarkSlateGray4} \
 {127 255 212        aquamarine1} \
 {118 238 198        aquamarine2} \
 {102 205 170        aquamarine3} \
 {69 139 116        aquamarine4} \
 {193 255 193        DarkSeaGreen1} \
 {180 238 180        DarkSeaGreen2} \
 {155 205 155        DarkSeaGreen3} \
 {105 139 105        DarkSeaGreen4} \
 {84 255 159        SeaGreen1} \
 {78 238 148        SeaGreen2} \
 {67 205 128        SeaGreen3} \
 {46 139 87        SeaGreen4} \
 {154 255 154        PaleGreen1} \
 {144 238 144        PaleGreen2} \
 {124 205 124        PaleGreen3} \
 {84 139 84        PaleGreen4} \
 {0 255 127        SpringGreen1} \
 {0 238 118        SpringGreen2} \
 {0 205 102        SpringGreen3} \
 {0 139        69        SpringGreen4} \
 {0 255        0        green1} \
 {0 238 0        green2} \
 {0 205 0        green3} \
 {0 139 0        green4} \
 {127 255 0        chartreuse1} \
 {118 238 0        chartreuse2} \
 {102 205 0        chartreuse3} \
 {69 139 0        chartreuse4} \
 {192 255 62        OliveDrab1} \
 {179 238 58        OliveDrab2} \
 {154 205 50        OliveDrab3} \
 {105 139 34        OliveDrab4} \
 {202 255 112        DarkOliveGreen1} \
 {188 238 104        DarkOliveGreen2} \
 {162 205 90        DarkOliveGreen3} \
 {110 139 61        DarkOliveGreen4} \
 {255 246 143        khaki1} \
 {238 230 133        khaki2} \
 {205 198 115        khaki3} \
 {139 134 78        khaki4} \
 {255 236 139        LightGoldenrod1} \
 {238 220 130        LightGoldenrod2} \
 {205 190 112        LightGoldenrod3} \
 {139 129 76        LightGoldenrod4} \
 {255 255 224        LightYellow1} \
 {238 238 209        LightYellow2} \
 {205 205 180        LightYellow3} \
 {139 139 122        LightYellow4} \
 {255 255 0        yellow1} \
 {238 238 0        yellow2} \
 {205 205 0        yellow3} \
 {139 139 0        yellow4} \
 {255 215 0        gold1} \
 {238 201 0        gold2} \
 {205 173 0        gold3} \
 {139 117 0        gold4} \
 {255 193 37        goldenrod1} \
 {238 180 34        goldenrod2} \
 {205 155 29        goldenrod3} \
 {139 105 20        goldenrod4} \
 {255 185 15        DarkGoldenrod1} \
 {238 173 14        DarkGoldenrod2} \
 {205 149 12        DarkGoldenrod3} \
 {139 101 8        DarkGoldenrod4} \
 {255 193 193        RosyBrown1} \
 {238 180 180        RosyBrown2} \
 {205 155 155        RosyBrown3} \
 {139 105 105        RosyBrown4} \
 {255 106 106        IndianRed1} \
 {238 99 99        IndianRed2} \
 {205 85 85        IndianRed3} \
 {139 58 58        IndianRed4} \
 {255 130 71        sienna1} \
 {238 121 66        sienna2} \
 {205 104 57        sienna3} \
 {139 71 38        sienna4} \
 {255 211 155        burlywood1} \
 {238 197 145        burlywood2} \
 {205 170 125        burlywood3} \
 {139 115 85        burlywood4} \
 {255 231 186        wheat1} \
 {238 216 174        wheat2} \
 {205 186 150        wheat3} \
 {139 126 102        wheat4} \
 {255 165 79        tan1} \
 {238 154 73        tan2} \
 {205 133 63        tan3} \
 {139 90 43        tan4} \
 {255 127 36        chocolate1} \
 {238 118 33        chocolate2} \
 {205 102 29        chocolate3} \
 {139 69 19        chocolate4} \
 {255 48 48        firebrick1} \
 {238 44 44        firebrick2} \
 {205 38 38        firebrick3} \
 {139 26 26        firebrick4} \
 {255 64 64        brown1} \
 {238 59 59        brown2} \
 {205 51 51        brown3} \
 {139 35 35        brown4} \
 {255 140 105        salmon1} \
 {238 130 98        salmon2} \
 {205 112 84        salmon3} \
 {139 76 57        salmon4} \
 {255 160 122        LightSalmon1} \
 {238 149 114        LightSalmon2} \
 {205 129 98        LightSalmon3} \
 {139 87 66        LightSalmon4} \
 {255 165 0        orange1} \
 {238 154 0        orange2} \
 {205 133 0        orange3} \
 {139 90 0        orange4} \
 {255 127 0        DarkOrange1} \
 {238 118 0        DarkOrange2} \
 {205 102 0        DarkOrange3} \
 {139 69 0        DarkOrange4} \
 {255 114 86        coral1} \
 {238 106 80        coral2} \
 {205 91 69        coral3} \
 {139 62 47        coral4} \
 {255 99 71        tomato1} \
 {238 92 66        tomato2} \
 {205 79 57        tomato3} \
 {139 54 38        tomato4} \
 {255 69 0        OrangeRed1} \
 {238 64 0        OrangeRed2} \
 {205 55 0        OrangeRed3} \
 {139 37 0        OrangeRed4} \
 {255 0 0        red1} \
 {238 0 0        red2} \
 {205 0 0        red3} \
 {139 0 0        red4} \
 {255 20 147        DeepPink1} \
 {238 18 137        DeepPink2} \
 {205 16 118        DeepPink3} \
 {139 10 80        DeepPink4} \
 {255 110 180        HotPink1} \
 {238 106 167        HotPink2} \
 {205 96 144        HotPink3} \
 {139 58 98        HotPink4} \
 {255 181 197        pink1} \
 {238 169 184        pink2} \
 {205 145 158        pink3} \
 {139 99 108        pink4} \
 {255 174 185        LightPink1} \
 {238 162 173        LightPink2} \
 {205 140 149        LightPink3} \
 {139 95 101        LightPink4} \
 {255 130 171        PaleVioletRed1} \
 {238 121 159        PaleVioletRed2} \
 {205 104 137        PaleVioletRed3} \
 {139 71 93        PaleVioletRed4} \
 {255 52 179        maroon1} \
 {238 48 167        maroon2} \
 {205 41 144        maroon3} \
 {139 28 98        maroon4} \
 {255 62 150        VioletRed1} \
 {238 58 140        VioletRed2} \
 {205 50 120        VioletRed3} \
 {139 34 82        VioletRed4} \
 {255 0 255        magenta1} \
 {238 0 238        magenta2} \
 {205 0 205        magenta3} \
 {139 0 139        magenta4} \
 {255 131 250        orchid1} \
 {238 122 233        orchid2} \
 {205 105 201        orchid3} \
 {139 71 137        orchid4} \
 {255 187 255        plum1} \
 {238 174 238        plum2} \
 {205 150 205        plum3} \
 {139 102 139        plum4} \
 {224 102 255        MediumOrchid1} \
 {209 95 238        MediumOrchid2} \
 {180 82 205        MediumOrchid3} \
 {122 55 139        MediumOrchid4} \
 {191 62 255        DarkOrchid1} \
 {178 58 238        DarkOrchid2} \
 {154 50 205        DarkOrchid3} \
 {104 34 139        DarkOrchid4} \
 {155 48 255        purple1} \
 {145 44 238        purple2} \
 {125 38 205        purple3} \
 {85 26 139        purple4} \
 {171 130 255        MediumPurple1} \
 {159 121 238        MediumPurple2} \
 {137 104 205        MediumPurple3} \
 {93 71 139        MediumPurple4} \
 {255 225 255        thistle1} \
 {238 210 238        thistle2} \
 {205 181 205        thistle3} \
 {139 123 139        thistle4} \
 {169 169 169        DarkGray} \
 {0 0 139        DarkBlue} \
 {0 139 139        DarkCyan} \
 {139 0 139        DarkMagenta} \
 {139 0 0        DarkRed} \
 {144 238 144        LightGreen}]

 set colorlist [lsort -dictionary -index end $colorlist]

 # Procedure for setting up color selection box:
 # RGB Color-setting Scale
 # from Graphical Applications with Tcl and Tk, 2nd edition, Chapter 3
 # by Eric Foster-Johnson
 # modified by David McClamrock
 # Thanks to Ulrich Schöbel for suggesting that I add color names,
 # and for contributing some code!

 proc wishcolor {} {
        # Set variables for red, green, blue, color selected,
        # and hexadecimal code color; set background
        # (number 128 will be midpoint of color scale):
        global red green blue color hex colorlist showname
        toplevel .colo
        wm title .colo "WISH Color Picker"
        tk_setPalette background bisque selectBackground cyan
        set red 255
        set green 204
        set blue 153
        set color ""
        set showname nothing
        set hex black
        grid [label .colo.pick -text "Right-click or double left-click\
                color name (or move sliders)" -bg "#FFF0E4" -pady 4] \
                -row 0 -column 0 -columnspan 5 -sticky news

        # Sliding scale to change the amount of red:
        set scaleng 200 ; # Length of scales
        set scalwid 12 ; # Width of scales
        set slidleng 24 ; # Length of sliders
        grid [label .colo.reddo -text "Red : "] \
                -row 1 -column 0 -sticky news
        grid [scale .colo.red -from 0 -to 255 -orient horizontal \
                -length $scaleng -width $scalwid -sliderlength $slidleng \
                -variable red -activebackground red -tickinterval 64 \
                -command "modify_color red"] \
                -row 1 -column 1 -columnspan 2 -sticky news

        # Same for green and blue:
        grid [label .colo.greeno -text "Green : "] \
                -row 2 -column 0 -sticky news
        grid [scale .colo.green -from 0 -to 255 -orient horizontal \
                -length $scaleng -width $scalwid -sliderlength $slidleng \
                -variable green -activebackground green -tickinterval 64 \
                -command "modify_color green"] \
                -row 2 -column 1 -columnspan 2 -sticky news
        grid [label .colo.bluey -text "Blue : "] \
                -row 3 -column 0 -sticky news
        grid [scale .colo.blue -from 0 -to 255 -orient horizontal \
                -length $scaleng -width $scalwid -sliderlength $slidleng \
                -variable blue -activebackground blue -tickinterval 64 \
                -command "modify_color blue"] \
                -row 3 -column 1 -columnspan 2 -sticky news
                
        foreach scala [list .colo.red .colo.green .colo.blue] {
                bind $scala <ButtonRelease-1> {
                        catch {.colo.list selection clear 0 end}
                }
        }
        
        # Scrolling listbox for color names:
        grid [listbox .colo.list -bg "#FFFFF0" -width 20] \
                -row 1 -column 3 -rowspan 4 -sticky news
        grid [scrollbar .colo.rolly -width 12 -command ".colo.list yview"] \
                -row 1 -column 4 -rowspan 4 -sticky news
        .colo.list configure -yscrollcommand ".colo.rolly set"
        foreach couleur $colorlist {
                .colo.list insert end [lindex $couleur end]
        }
        .colo.rolly configure -command ".colo.list yview"        
        bind .colo.list <Double-Button-1> {
                set item [.colo.list curselection]
                set showname [.colo.list get $item]
                pickname $item
        }
        bind .colo.list <Button-3> {
                .colo.list selection clear 0 end
                set clixel %y
                set clickline [.colo.list nearest $clixel]
                .colo.list selection set $clickline $clickline
                set item [.colo.list curselection]
                set showname [.colo.list get $item]
                pickname $item
        }
        
        # Labeled button to show the color selected:
        grid [label .colo.pico -text "PICK: "] -row 4 -column 0 -sticky news
        grid [button .colo.color -textvariable color -border 4 -pady 4] \
                -row 4 -column 1 -sticky news
        grid [button .colo.close -text "Close" -command {destroy .colo}] \
                -row 4 -column 2 -sticky news

        # Tell the color-selection button what to do
        # (modify this to fit the purpose at hand):
        .colo.color configure -command {puts $color}
 }

 # Procedure for changing the color selected:
 proc modify_color {which_color value} {
        global color red green blue showname
        switch $which_color {
                red {set red $value}
                green {set green $value}
                blue {set blue $value}
        }
        if {[expr $red + $green + $blue < 480] && \
                [expr $green < 180]} {
                set hex white
        } else {
                set hex black
        }
        if {$color ne $showname} {
                set color [format "#%2.2X%2.2X%2.2X" \
                        $red $green $blue]
        }
        .colo.color configure -background $color \
                -foreground $hex
 }

 # Procedure for getting a color name selection
 # to make the sliders move and the color code change:

 proc pickname {item} {
        global color colorlist red green blue showname
        set listline [lindex $colorlist $item]
        set red [lindex $listline 0]
        modify_color red $red
        set green [lindex $listline 1]
        modify_color green $green
        set blue [lindex $listline 2]
        modify_color blue $blue
        set color $showname
        set showname nothing
 }

 # Test in interactive mode, after saving as "wishcolor.tcl":
 source wishcolor.tcl
 wish color

RLH 2005-11-17: I would have expected the scrollbar for the colors to be on the right and not the left.

D. McC Nov 18 2005 - Many months ago, if I recall correctly, I tried putting it on the right, and I thought it looked funny because there wasn't a clear enough separation between the listbox (which scrolled) and the scales (which didn't). Today I tried it again, and it looked OK on the right after all, so I changed the code above to put it on the right. Thanks!