2006-03-13 [HE] An alternative to the old-fashioned Unix colorchooser. Developed for the use in etcl, you can use it together with the [Alternative dialogs for pocketPC/etcl]. There I also describe how to replace tk_chooseColor. [http://mini.net/files/colorchooser.jpg] With some changes you can use it in other enviroments than etcl (Remove windowfit is the first step) # colorBox.tcl (wiki version) # Version 0.1 # inspired by the book 'Effektiv Tcl/Tk programmieren'. Used their code to begin the project. # Mark Harrison, DSC Communications Corp. # Michael McLennan, Bell Labs Innovations for Lucent Technologies # based on informationen from http://de.wikipedia.org/wiki/HSV-Farbraum # Histo: # Version 0.0 started at 22.02.2006 # Version 0.1 started at 14.03.2006 # HE: removed array ::he::dialog::colors and procedure ::he::dialog::colorname2color # Richard Suchenwirth shows me a way to avoid them. # Function: # A color chooser (a replacement for tk_chooseColor) namespace eval ::he::dialog { variable colordialog set colordialog(c00) #000019 set colordialog(c01) #000033 set colordialog(c02) #00004c set colordialog(c03) #000066 set colordialog(c04) #00007f set colordialog(c05) #000099 set colordialog(c06) #0000b2 set colordialog(c07) #0000cc set colordialog(c08) #0000e5 set colordialog(c09) #0000ff set colordialog(c10) #001900 set colordialog(c11) #003300 set colordialog(c12) #004c00 set colordialog(c13) #006600 set colordialog(c14) #007f00 set colordialog(c15) #009900 set colordialog(c16) #00b200 set colordialog(c17) #00cc00 set colordialog(c18) #00e500 set colordialog(c19) #00ff00 set colordialog(c20) #190000 set colordialog(c21) #330000 set colordialog(c22) #4c0000 set colordialog(c23) #660000 set colordialog(c24) #7f0000 set colordialog(c25) #990000 set colordialog(c26) #b20000 set colordialog(c27) #cc0000 set colordialog(c28) #e50000 set colordialog(c29) #ff0000 set colordialog(c30) #191919 set colordialog(c31) #333333 set colordialog(c32) #4c4c4c set colordialog(c33) #666666 set colordialog(c34) #7f7f7f set colordialog(c35) #999999 set colordialog(c36) #b2b2b2 set colordialog(c37) #cccccc set colordialog(c38) #e5e5e5 set colordialog(c39) #ffffff package require msgcat namespace import ::msgcat::mc } # de.msg namespace eval ::he::dialog { msgcat::mcset de "Color" "Farbe" msgcat::mcset de "Bad option %1\$s:" "Falscher Parameter: %1\$s:" msgcat::mcset de "Must be -initialcolor, -parent, or -title ." "Erlaubt: -initialcolor, -parent, oder -title ." msgcat::mcset de "Bad window path name %1\$s" "Fenster %1\$s existiert nicht." msgcat::mcset de "Ok" "OK" msgcat::mcset de "Cancel" "Abbrechen" msgcat::mcset de "Add color" "Farbe hinzufügen" msgcat::mcset de "Red" "Rot" msgcat::mcset de "Green" "Grün" msgcat::mcset de "Blue" "Blau" msgcat::mcset de "Hue" "Farbt." msgcat::mcset de "Sat." "Sätt." msgcat::mcset de "Bright." "Hell." } # en.msg namespace eval ::he::dialog { msgcat::mcset en "Color" msgcat::mcset en "Bad option %1\$s:" msgcat::mcset en "Must be -initialcolor, -parent, or -title." msgcat::mcset en "Bad window path name %1\$s" msgcat::mcset en "Ok" msgcat::mcset en "Cancel" msgcat::mcset en "Add color" msgcat::mcset en "Red" msgcat::mcset en "Green" msgcat::mcset en "Blue" msgcat::mcset en "Hue" msgcat::mcset en "Sat." msgcat::mcset en "Bright." } proc ::he::dialog::windowFit {top} { if {$::tcl_platform(os) eq {Windows CE}} { if {[info exists ::etcl::etcl]} { bind $top {::etcl::autofit %W} ::etcl::autofit $top } else { wm geometry $top 240x[expr 320 - 51]+0+0 } } else { wm geometry $top 240x[expr 320 - 51]+[expr [winfo pointerx .] - 120]+[expr [winfo pointery .] - 135] } return } proc ::he::dialog::colordialog {args} { variable colordialog set colordialog(-initialcolor) #408080 set colordialog(-parent) {.} set colordialog(-title) [mc "Color"] # First we check the parameter foreach {para value} $args { switch -exact -- $para { -initialcolor { colordialog_checkAndSetInitialcolor $value } -parent { if {![winfo exists $value]} { error [mc "Bad window path name %1\$s" $value] } set colordialog(-parent) $value } -title { set colordialog(-title) $value } default { error "[mc "Bad option %1\$s." $value] [mc "Must be -initialcolor, -parent, or -title ."]" } } } scan $colordialog(-initialcolor) "#%2x%2x%2x" colordialog(red) colordialog(green) colordialog(blue) colordialog_set_hsb # create the windowname for the dialogbox if {$colordialog(-parent) eq {.}} { set colordialog(w) ._colordialog } else { set colordialog(w) [set colordialog(-parent)]._colordialog } set w $colordialog(w) if {[winfo exists $w]} { colordialog_destroy } colordialog_create set colordialog(selected) {} vwait ::he::dialog::colordialog(selected) return $colordialog(selected) } proc ::he::dialog::colordialog_create {} { variable dir variable colordialog set w $colordialog(w) toplevel $w -class colordialog wm protocol $w WM_DELETE_WINDOW ::he::dialog::colordialog_cancel wm minsize $w 216 65 ;#220 wm maxsize $w 240 [expr 320 - 52] wm title $w $colordialog(-title) frame $w.e ;# frame with the entries frame $w.c ;# frame with HSB-chooser frame $w.c.s ;# frame with the user defined colors frame $w.b ;# frame with buttons # frame with HSB-chooser canvas $w.c.dial frame $w.c.sample -width 10 -height 101 grid $w.c.dial -row 0 -column 0 grid $w.c.sample -row 0 -column 1 grid $w.c.s -row 1 -column 0 -columnspan 2 grid rowconfigure $w.c 0 -weight 0 grid rowconfigure $w.c 1 -weight 1 grid columnconfigure $w.c 0 -weight 1 grid columnconfigure $w.c 1 -weight 0 # frame with the entries label $w.e.lr -text "[mc "Red"]:" label $w.e.lg -text "[mc "Green"]:" label $w.e.lb -text "[mc "Blue"]:" label $w.e.lh -text "[mc "Hue"]:" label $w.e.ls -text "[mc "Sat."]:" label $w.e.lv -text "[mc "Bright."]:" entry $w.e.er -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdRGB %P %V red} entry $w.e.eg -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdRGB %P %V green} entry $w.e.eb -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdRGB %P %V blue} entry $w.e.eh -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdH %P %V} entry $w.e.es -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdS %P %V} entry $w.e.ev -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdB %P %V} grid configure $w.e.lr -column 0 -row 0 grid configure $w.e.lg -column 2 -row 0 grid configure $w.e.lb -column 4 -row 0 grid configure $w.e.lh -column 0 -row 1 grid configure $w.e.ls -column 2 -row 1 grid configure $w.e.lv -column 4 -row 1 grid configure $w.e.er -column 1 -row 0 grid configure $w.e.eg -column 3 -row 0 grid configure $w.e.eb -column 5 -row 0 grid configure $w.e.eh -column 1 -row 1 grid configure $w.e.es -column 3 -row 1 grid configure $w.e.ev -column 5 -row 1 $w.c.dial create image 5 5 -anchor nw -image $colordialog(img_hs) $w.c.dial create image 190 5 -anchor nw -image $colordialog(img_v) $w.c.dial create oval 0 0 5 5 -fill black -tags hsval -width 3 -fill {} $w.c.dial create line 189 5 201 5 -fill black -tags bval -width 3 $w.c.dial configure -width 201 -height 107 $w.c.dial bind hsval "::he::dialog::colordialog_set_hs %x %y" $w.c.dial bind bval "::he::dialog::colordialog_set_b %y" # frame with the user defined colors for {set n 0} {$n <= 3} {incr n} { for {set m 0} {$m <= 9} {incr m} { radiobutton $w.c.s.c$n$m \ -indicatoron 0 \ -bg $colordialog(c$n$m) \ -selectcolor $colordialog(c$n$m) \ -value c$n$m \ -variable ::he::dialog::colordialog(c) \ -width 2 \ -command "::he::dialog::colordialog_sel $w.c.s.c$n$m" grid configure $w.c.s.c$n$m -row $n -column $m } } # frame with buttons button $w.b.ok -text [mc "Ok"] -command ::he::dialog::colordialog_ok button $w.b.cancel -text [mc "Cancel"] -command ::he::dialog::colordialog_cancel button $w.b.add -text [mc "Add color"] -command ::he::dialog::colordialog_add pack $w.b.ok $w.b.cancel -side left pack $w.b.add -side right # Frames darstellen grid configure $w.e -row 0 -sticky nsew grid configure $w.c -row 1 -sticky ew grid configure $w.b -row 2 -sticky nsew grid rowconfigure $w {0 2} -weight 0 grid rowconfigure $w 1 -weight 1 colordialog_refresh windowFit $w grab set $w return } proc ::he::dialog::colordialog_checkAndSetInitialcolor {value} { variable colordialog switch -regexp -- $value { {^#[0-9a-fA-F]{3}$} { scan $value "#%1x%1x%1x" r g b set r [ expr {$r * 255 / 15}] set g [ expr {$g * 255 / 15}] set b [ expr {$b * 255 / 15}] set colordialog(-initialcolor) [format "#%02x%02x%02x" $r $g $b] } {^#[0-9a-fA-F]{6}$} { set colordialog(-initialcolor) $value } {^#[0-9a-fA-F]{9}$} { scan $value "#%3x%3x%3x" r g b set r [ expr {$r * 255 / 4095}] set g [ expr {$g * 255 / 4095}] set b [ expr {$b * 255 / 4095}] set colordialog(-initialcolor) [format "#%02x%02x%02x" $r $g $b] } {^#[0-9a-fA-F]{12}$} { scan $value "#%4x%4x%4x" r g b set r [ expr {$r * 255 / 65535}] set g [ expr {$g * 255 / 65535}] set b [ expr {$b * 255 / 65535}] set colordialog(-initialcolor) [format "#%02x%02x%02x" $r $g $b] } {^#} { error "invalid color name \"$value\"" } default { foreach {r g b} [winfo rgb . yellowgreen] break set colordialog(-initialcolor) [format "#%02x%02x%02x" [expr {$r/256}] [expr {$g/256}] [expr {$b/256}]] } } return } proc ::he::dialog::colordialog_refresh {} { variable colordialog set w $colordialog(w) set h $colordialog(hue) set s $colordialog(saturation) if {$h eq {}} { set h 180 } set x0 [expr ($h / 2) + 5] set y0 [expr (100 - $s) + 5] $w.c.dial coords hsval [expr $x0-4] [expr $y0-4] [expr $x0+4] [expr $y0+4] set b $colordialog(brightness) set y1 [expr (100 - $b) + 5] $w.c.dial coords bval 189 $y1 201 $y1 $w.c.sample configure -background [colordialog_hsb2rgb1 $colordialog(hue) $colordialog(saturation) $colordialog(brightness)] foreach {win index} [list $w.e.er red $w.e.eg green $w.e.eb blue $w.e.eh hue $w.e.es saturation $w.e.ev brightness] { $win configure -validate none $win delete 0 end $win insert end $colordialog($index) $win configure -validate all } return } proc ::he::dialog::colordialog_vcmdRGB {value type name2} { variable colordialog set state 0 switch -exact -- $type { key { if {($value >= 0 && $value <= 255) || ($value eq {})} { set state 1 } } focusout { if {($value >= 0 && $value <= 255)} { set colordialog($name2) $value set state 1 } if {$value ne {}} { colordialog_set_hsb } colordialog_refresh } } return $state } proc ::he::dialog::colordialog_vcmdH {value type} { variable colordialog set state 0 switch -exact -- $type { key { if {($value >= 0 && $value <= 359) || ($value eq {})} { set state 1 } } focusout { if {$value >= 0 && $value <= 359} { set colordialog(hue) $value set state 1 colordialog_set_rgb } elseif {$value eq {}} { set colordialog(hue) $value set colordialog(saturation) 0 set state 1 colordialog_set_rgb } colordialog_refresh } } return $state } proc ::he::dialog::colordialog_vcmdS {value type} { variable colordialog set state 0 switch -exact -- $type { key { if {($value >= 0 && $value <= 100) || ($value eq {})} { set state 1 } } focusout { if {($value >= 0 && $value <= 100)} { set colordialog(saturation) $value set state 1 } if {$value ne {}} { if {$colordialog(hue) eq {}} { set colordialog(hue) 0 } colordialog_set_rgb } colordialog_refresh } } return $state } proc ::he::dialog::colordialog_vcmdB {value type} { variable colordialog set state 0 switch -exact -- $type { key { if {($value >= 0 && $value <= 100) || ($value eq {})} { set state 1 } } focusout { if {($value >= 0 && $value <= 100)} { set colordialog(hue) $value set state 1 } if {$value ne {}} { colordialog_set_rgb } colordialog_refresh } } return $state } proc ::he::dialog::colordialog_destroy {} { variable colordialog grab release $colordialog(w) destroy $colordialog(w) return } # command of ok button proc ::he::dialog::colordialog_ok {} { variable colordialog set colordialog(selected) [format "#%02x%02x%02x" $colordialog(red) $colordialog(green) $colordialog(blue)] colordialog_destroy return } # command of cancel button proc ::he::dialog::colordialog_cancel {} { variable colordialog set colordialog(selected) {} colordialog_destroy return } # add user defined color proc ::he::dialog::colordialog_add {} { variable colordialog if {$colordialog(c) eq {}} { tk_messageBox -icon error -type ok -message "No color button selcted!" return } set w $colordialog(w) set color [$w.c.sample cget -background] set colordialog($colordialog(c)) $color $w.c.s.$colordialog(c) configure -bg $color -selectcolor $color return } # choose user defined color proc ::he::dialog::colordialog_sel {win} { variable colordialog set color [$win cget -background] scan $color "#%2x%2x%2x" colordialog(red) colordialog(green) colordialog(blue) colordialog_set_hsb colordialog_refresh return } # calculate Brightness from y-coordinate proc ::he::dialog::colordialog_set_b {y} { variable colordialog if {$y < 5} { set y 5 } elseif {$y > 105} { set y 105 } set colordialog(brightness) [expr 100 - ($y - 5)] colordialog_set_rgb colordialog_refresh return } # calculate hue and saturation from x- and y-coordinate proc ::he::dialog::colordialog_set_hs {x y} { variable colordialog if {$y < 5} { set y 5 } elseif {$y > 105} { set y 105 } if {$x < 5} { set x 5 } elseif {$x > 184} { set x 184 } set colordialog(hue) [expr ($x - 5) * 2] set colordialog(saturation) [expr 100 - ($y - 5)] colordialog_set_rgb colordialog_refresh return } proc ::he::dialog::colordialog_set_rgb {} { variable colordialog set rgb [colordialog_hsb2rgb $colordialog(hue) $colordialog(saturation) $colordialog(brightness)] set colordialog(red) [lindex $rgb 0] set colordialog(green) [lindex $rgb 1] set colordialog(blue) [lindex $rgb 2] return } proc ::he::dialog::colordialog_set_hsb {} { variable colordialog set hsb [colordialog_rgb2hsb $colordialog(red) $colordialog(green) $colordialog(blue)] set colordialog(hue) [lindex $hsb 0] set colordialog(saturation) [lindex $hsb 1] set colordialog(brightness) [lindex $hsb 2] return } proc ::he::dialog::colordialog_hsb2rgb {h s v} { set s [expr $s / 100.0] set v [expr $v / 100.0] if {$s == 0} { set v [expr round(255*$v)] set r $v set g $v set b $v } else { set hi [expr fmod(floor($h / 60.0), 6)] set f [expr $h / 60.0 - $hi] set p [expr round(255 * $v * (1.0 - $s))] set q [expr round(255 * $v * (1.0 - $s * $f))] set t [expr round(255 * $v * (1.0 - $s * (1.0 - $f)))] set v [expr round(255 * $v)] switch [expr int($hi)] { 0 {set r $v; set g $t; set b $p} 1 {set r $q; set g $v; set b $p} 2 {set r $p; set g $v; set b $t} 3 {set r $p; set g $q; set b $v} 4 {set r $t; set g $p; set b $v} 5 {set r $v; set g $p; set b $q} } } return [list $r $g $b] } proc ::he::dialog::colordialog_hsb2rgb1 {h s v} { variable colordialog set rgb [colordialog_hsb2rgb $h $s $v] return [format "#%02x%02x%02x" [lindex $rgb 0] [lindex $rgb 1] [lindex $rgb 2]] } proc ::he::dialog::colordialog_rgb2hsb {r g b} { variable colordialog if {$r == 0 && $g == 0 && $b == 0} { set h 0 set s 0 set v 0 } else { set r [expr $r / 255.0] set g [expr $g / 255.0] set b [expr $b / 255.0] set l [list $r $g $b] set max [lindex [lsort -real $l] end] set min [lindex [lsort -real $l] 0] set maxColor [lindex [lindex [lsort -index 0 -real [list [list $r r] [list $g g] [list $b b]]] end] 1] set s [expr int(($max - $min) / $max * 100)] set v [expr int($max * 100)] if {$s == 0} { set h {} } else { switch -exact -- $maxColor { r { set h [expr int((0.0 + ($g - $b) / ($max - $min)) * 60)] } g { set h [expr int((2.0 + ($b - $r) / ($max - $min)) * 60)] } b { set h [expr int((4.0 + ($r - $g) / ($max - $min)) * 60)] } } if {$h < 0} { set h [expr $h + 360] } } } return [list $h $s $v] } set ::he::dialog::colordialog(img_hs) [image create photo -data { R0lGODlhtQBlAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/ AP//AAAA//8A/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/ AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMz mTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPM ADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/ mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lm AJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wz AMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZ mcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8A AP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M//// AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAC1AGUAAAj/ALlxEzdQnEF0 4tApROeOobuH9NzRm0hPX0V9GPVZ02itoyxrskLKcjTSkUk1jtSoVGOEpREj R2AemYnkCJKbSJLkTMJTSRIlQJUsEbqk6JIiR4so/VHkh9MfOaDmmDojx4yr M1pkbdEiStcoYOtEqUO2TiazmdL2ytSrba9wb8PJDQeOLri738B92/vNW19v gLt560a4GzfDAgUSNHgw4cKGDyFKpGgx48aOHkGKJGnyZMqVLV+KjjmTpk2c Onn2/Bl0qFGkSpc2fRp1KlWrWLVy3e0VbNixZc+mVcvWLdy5de/i1cvXL+DA gwsfTixwHOPG6R47fCdx8sR9Fy3v/8MMEuSskJxNPkK5kuWa0TLZ2Dx9s83O 1W5aE31TFLbSNEw9BdUYtlllVRdX6cbVFb79tkdwaH3CVnFtnRMXcucop5de 5ezlHGDkCFaYYeNQN1BBjS3EkEOSUVRReJdh9pFII5XkWXuhiQaTTKbhlNN9 P7EGlGv9JSWbgLXZVhVWWW3F21e/lWUWWsS59daFySmXF199/QXdiNNVx02J 1qUjTnbZvYOOmtxxVw89b74J3j760DnendZcI4ue5/XpyCyOrCeoGmsQasR7 axyRaKJsINGofZAm0UYS+eX3hhKX8qdpEW8UkYanPwA4xg+jEkggggheMYOq V7TQ6qtR7P8Rax0PflKHrRJKOEwvu+5q4TnhAJvhsOCY842xHSbrTTnehOhs N+NAO+aJ16W4ImSRReRiZRjFmBmN6HXG3mcqwVdaaTXdlJpqqwUlFFFHGdnU bE4leduSuWXVW4NjAScclRNaeZxcWS7HpYfPiRgdYYmRKU6ZZ56JTprutOlO PRfDSc+cddZpzXjX5LmnLH4C+kiggaqxXqGIHqroEfLF7CgSk07qBqWUKmEp pkts2umnAAZNag6n5tCF0TOkuqqrrkbBoKxQ03prJrlmMozVvPbya7DBgpOh OcUe+42yzJLTbLPdhBgtmdQWZKaKCqkZWXdvTsTteBx5pOdmIwH/Kq5K77HE Ukzv9TizujtN6pO7l7521KfzPkWgVLYhmC/TvX0lq5Rk2TrchLu2NXCGduFl bHN9MZswYSUaRuLDsJuJ5pprVnxxxnJuvHHHdn4ssp58kvwnyoOu7DKjMMM8 c6Q157xzpj1H3+nPoZJqvalGI600rAw+PWutU+uKta9aa821sF6HbSyyYy97 9rNqT+swxLOzabubuOveO8i/j1wy8SojlKFatqjkNepRNJOUAm9WKUzxbHqe ApXQSkW07KFqVUt7VdO89yDwVU18vSof+r6mPrGR7X1pg5a02GYd+k2MdhbD mAw1xrH95emGwCOZ8EyWspUJEFEvkxkC/5vHQOc5UFM941QEgVY9ChbtgqzK oNNi9b1bhc9qWAzh1kZYrC6ub2ztKxva1KbC+cVOYvWrnQzzV0PfhSyH/+Ph oFg2wOMZcHk0S2ARGwg9CDJRVEPD3tGgmMENTjFqHbQiCMcnwq6R8IsnFOOz 1rbCcZRpHLJLR5rS0aZ3yLAecqrHnPZhJ1J+7BpvnAWfZgGoWTziZK8U1BpY NkuYrSFmbHgUG2rWBga6wVJuyNQbNDVMTqUhaGMQ1RhM1YVBNjNpV2BVNGN1 BajtoVZ7yNUnrjaMbmptGL86h7DE6TVzgM0c5UBWOZhVDnKYzZ3OsuQKzyi7 F9ovhmzcHZ7eOP+y4LWSeCmjIxCRd0A8EhFnfHygEv/YxEBaMGkYZJUhoVZF XFHtotzM2hbTd06xsY+d70MbJeeHyTNpck2cXNM73OTJi4FyY6Kskyn3gco8 oXJPrCTZI1r5SpWtYWW1nCUudQmpNtisl5T6JaaC2bNivuGYnjpmqJZJqi4w E1VXSNU0o2lNbOLqE7raptW8eQ5wBouc5zBnscx5rHWOjRzsdGfaxqE2S44J di5MU+3wFyca6tONONTh/2AZQB8ONIjKG+ICEaqzIybxZxK8nkMHCdHtGZKD UrMoCLNGPi6eM2zJCiMKJ1lJS6YDk5rkJCdX6snWghKU+xClKElJW5r/0hSV 11AlK1m5097G8qezDK5Qb5nLXe7SqMh1Qy9/GczmDvO5w0zDU4+ZhmRadwxW zW4zu5DVaHqXq9W8ZjazCdZtmreb3SyresXJ3rSm1ZzoROc620lfeJKDrpbM bwtLmtqJpZS1F2spbGFqp2uA7Ka5XSVPTdbTR/yUUEG9Jcxy6ahd0syolOql zoK5VE1JN6pASyaplkk0qxrtmdyVZveqGatr0iqbtwKr1cSa3m8KyxxfY2t8 x7bOZcG1WXK9b11Ni0nUavIdqmWta18L29qS0sC4xa1ud8tbV/7WwQ4eLhuI m8s2GBe5vVwuc50LXelSl7rXXeYytbtd7qa4/5pwFu94P0FesA5jm+hNb3vF iWP4wjed850vXO2L3/uSib+Y9C+bOFkxAb90wLQ95YGBl1NXMhiWDw7uoWq5 5QNaGLmSQipzNyzM6UGVulMtFYm3a7SsriqarmLxHqr5Ylxlk2o09maN2VvO HK/PrfQF8jvpCi27Ejm1qUWykuuxZNjK1slPvi0qdZvb3fbWyq8ErpaL6+Vu JzfMY34DmaH71Oke07rVVTOb3dxd8Mr5mnQu73nxnF5wgnPP7vUzoOW7zkG3 E5741e9pB57sJLOW2UyOrcKjHeVpV7vKvs02loV7y4oX98vHVa7GmSvujkfX 3GhO95qxi93tdvfN7v8OL7znXN4751m99863n+MbaH8TWsj6LbIm1VHwlcLj 4J6shz1eu3B+MByV2HD4bmkB8VdCQuLBhYTFixuJ44JZEmJm7iTI/dRJnPnc jVCzug/R5mZeIRDenfU1AyHeeH+iFC3HczLQu9528Pm95mCHOQG9znX0+9/k UIc7A55fgiNb2UpuNtFna9uGJ5jKTY/lxIXb6Yt/GczgHvO4zQzyNKu75G1u d9pV3vY6xz3P9WZvn2fO95oDHuCGHoc6ZC/7dPAcHunA/c9/bo939H7oQ+dH PYRv9OLvgx/XQH7Slz8LbMyC6dB/BC0e8fTqr0Hq2GcDJNhQ9e63IRJtwLr/ +N0gCTdMwvzmf8PW158GrzciDe8Pe9gPMQb6k53sgehC/tHO/7Pvge2lsAcB CHdwlwyfYIBzN3ftMAwLaHcOeA7tYA4RqHcUWA7sUA5+l4HksA6B14GzN3sD Z2RJtlorhXBB52wL13gNN2VUFnFXFlydxmUYB2Yal3UdF0wf93XVJXKfV3bs lnJyFm+m53L0Zm/rJXP6xm+C9nqDF3sfaHtQqHvvsHu+53tCd4XEd3xaiHxc eA3M53zOF33TN33Wh33Xp31o6H3gB37jV37ld37rp37q1350GH9jIH/1V39d cH/6p39n94dsF4gCKIBvV4gIOAwJyIAMCIGMGIGO/5h3eWeBkqiBHMiBgveB tHdaIIhsuUeCrNV7TAZKwkdbUIZ8UpZbzmdtrjR9Lyh127Z9XXZc4GdUG1d+ v+RxXldu1BV2O6hmZEdy24V27DZraPdugyhvYGWAqKeIqpdWEfhn6HSBS7iB N0d7T8hzt5d7U7iNv2eFwTd8w7eFx5d8XliOYPh86DiG1LeOZrh97sh93Pd9 8tiG5Id+cCiH7Od+8Ad/d5iH9reHfbh/gPh/BDmAhViAB3iAiKiIDdiIECiB kFiBF5iBGEiNlxh41lh72NiJVMh73oiF4Fh85Lh85th86fh80seO1Hd9LPmO 26eG8xh+9fiG9jiHXqePdv84f/4IkPvnh/0niABIiASYkImogAz5kBMYkZE4 kRhYkZbogRm5kbqnjR75e1f4jcYnkl34hSYZhiipjmV4hi8Jj2sYfmbphvV4 j3F4k3W4j3iok3yIfwHpf0FpkAh5iInYkA/4iEl5gX45iU5pkRiJiVLJkVRZ hVYJfCE5jlvphV2ZjilJhuzYkmKZhmQZk/RIk/nYlm+5k3zYkz9Jl4M4gEJJ lAqZl4vIlxEpiUxZiYJ5idaoDrenDroHD7sHD79nD8Cnm8NnD8XHD7/Jhdiw fMPZfLQQhrQwhpCgnNUHCS8JCd0XCWsYCeJHneQnCW8oCXA4CevHne3XCPEH nnf/eAjzdwj3FwjnuX+BAICBMIClQIClgIDJkIDzyYDJ4IDtgJ+OyA4UyJ8W uA4TuQ6VqA4DCpvXaJgdiZhXGZLhqJXm6JjnKIYpGZbZN5YwyYYyiZZqaZOc yY94+I+f6ZMDWZeleZcLaZR6iZRK+ZetSY1PSZiyKZu5R5u0aZu+h5u4yZv8 4Ju+CZzHB5zYwA9BmnzDOZzHaZzJmaTS55xM6o5MGgnQyX3SSZ3UGX7YqZ3a aX7cuaU32QiT4KXgCX/kOab2Z57ouZ76t55qyp6l0J7veYDxGZ/12Q73eZ/5 CYH5yQ7toKcSyJ/8CaD/KaCCuoExGqMaGYUcyY2I+ZFY/8mYIwmhJgl9Xzmh k+mSZBmPGCp+GZqW6ceWONmPcKmHISqQQDmapYmARHmiR6maEgmYlPiagxmj 8ECjtmmb9oCjupmrubqjvAqcviqkQlqkRooNx1msSZqcy9mkTwqd0DmlkkCl VxqtWMql1Aqm4HmtY9oIZGqmh3Cma7qebRqu7xmnySCn83mudUqn+bmuebqn fvqn7ACg8iqoAkqghSqjsql7tJl7NnqrubmbxOejwEqkxAmGR6qktLCc1Oec C+uk3RelU/p9VXql1wmH2ql+3vml4Sl/5Fl/5rmH6Jmm6hmI7SmAJTuucCqf 9NmAd7qn+9mffgmog7oOBBp4sv9ps4U6q7W6s7iao7rJqz36q8AapEQrrMRK rMeasEqrrFDatFP6tM8atVc6CdNKrV96tdZ6rdqqrebZtWfard26puI6ruNa rmZ7rupqp+zqsnratu8ar/FKrzQ7t4Uqe/i6r7U6hbh5o7sJsMMHnESqfMV5 tEj6fMm5pGTonNfnnNoHsdIpsdUpfthpflm6pd/pfmG6tR5bpueJf+t5duv5 fyf7pu+JgPGJiPU5nyy7nxPon3AbqBgooIRqibJptzpbozvrrz67qzwqtL9K tMEqrMWKtMearAnrnE3brFALrdJKtc5rtdwJphqrtdnatV4Ltmoarm5KtmZr rmibrmv/u65t667vKq9xS6/2SrP3Sqs8q7v+qqu967vAK7xHm7RJarzKirzK 66zQSp3Nq51WK73Uu7XWa71f+63gur1lS67eq7pqy67jW75wK7eCmr73Gg/s a5vx0LO6eQ+8u6P94Lv80A/zO5zZMKzFWgvFm7C1sKxQWgtPS6W24L/RegtV y523EL1YewtaC56HEAvbap6rwK1qugrtqcCrwMDz+QzfS6fzEL7tMA8RzJ/y AK/yGg/oS7MYnLO0iru1+r7w27tBW8JGW7/Eu7THy7TM6rTLK63TesMC3MM+ TMDX663fqr1ju8Doiq5pK75s+7ZWfL50q74xisGGDA8bnMjw/3APi7zI9uDB /WAPkTzJI1zJIUzCmIwNJ7zJmkwL2UALKhzKoAwJLVzKpBwJMJzKkTDDrCwJ tuDKkmDDsjwJOVzLtNwIPJzLjRALu7zLP3wIQxzMgWDExDzMw1wKSZzMpfAM y7zMycDE85AM0TzNUVzNTyzF2MwOVbzN2rwO8rAOWBzO4KwOhtzFOtu+HAy/ vSq0ZGzGxrrCyaq/yRvD/Su10fq81Yq12ErAXGvA2JvAeEy2StzA4Lu2UxzI 85rF9iqb5azIG8zIEP3IEg3JkizJljzC2JDJJMzJn9zRngzKIG3KIn3KMMzK qwzLr/zKshzLtNzStYzLMM3LMv3LQP8MxMEMzMZczMqcxMzc08/809AszdJs zVHMDtksxdz8zUrtzeDc1A0tqzW6wbnbyGEcyUALnCQ8tCZMvx9tvy28tM7Z wvQMw9Ipta98z7EMwDssx75Mx8Dsz8YM0Mgs0OXKzHss1H1c1H+szRLM1BSM wXR7yIoM0Y3swYZd0ZR8yRet0RmtyY7t0R4tyiOtyiad0iid1rNsy5oN07os 075c07980zo91zzdzD7NxEFNzddM1Edt1Hy9zUy91OL81IKNyIXtyId92Ilt yY290Y/dyZEd0qMs0qhc3JR90pat0pjt0rfc2b0806At2jk93Ttt2s6M2kAt 1Kt9za6N1K//3c2y7dTj3NC2PdiFPdESPckWrdjs3dgcDdwfLdkhTdLGvcr2 ndywvNKa7dKc/dz+Hd1vLczETNpz3dPXnd3TPNTbbc2undTgzdSz7dTkPOEO fdsRrduIvd69/dub/NGfLN+TTcr0XdL3jdz5jdksrcs87NnQHdoBjtM6ndME buCn/dMJrtrd/d2wHd6zTeHkHA+JDOSLHA8QfQ+GbeSSfA+T3A+XzOQjzOQZ nQ2YnA2bTOWeXAsdXQuhrOWkrOWo7OW2UAusbAspTeaxbAuyfAu1rOa0rOa4 HAu5HAsyLec/vAo1vQrBjOfAjOfIzOfPsAo9/QyoLejS/AzTPA/X/4zoUYzo Ri0P2CwP2wzp3hwPSg3k4AzkPl7hhH3h6Z3h7I3RmfzekC3coSzipVzflW3i lq3fzK3i//3ZLi7do63MNH7gqa3drJ3jDr7U3xzh5A3kD03kQ17kRz7JSi7J Ts7klyzlUV7lzn7lWb7lqQzmYr7K1U7mZa7SaB7LbK7max7nKy7nu0znsWDn dZ7nyezngL7M6y7ogz7Nhi7Nio7o1+zojR7p+D7plR7OmF7h5r3p6K3eib3h vt3ho/7hpD7iqF7i+K3fKd7fLA7roG3TLz7g1V3aNI7g2q3gOe7dOx7bEC7e hgzs90DkJl/yRp7yKd8PSq7kyv7yyi7lMv/fD1Re8zafDVie8ziv5Twv5j4f 5kCP7UJ/C2iO5t5+9N4O50p/C3Le9E5f7lBv53g+9Xj+51YP6IDu7lo/D4Zu 6PT+9fTu6GI/D5Be9mYvD5Se9mgP7EIO7Igs7Ci/yEhu5Ma+5E0+5RtN5Zps 5Tif5R+u5aDs5Tz/5ax87WZO5rK87d7e5uA+7nN+55C/5+je5+ne0+1O6IIO 74ee6I+O1JCuzZKO9pXe65bO9myP8kSu8ivf8izf+jAP8zMv8zev8znf87b/ 82Iu9NhO9Lxf9Ej/+0uv9E8v9VFP9caP9Vav9e7O9czf9WD//GMv9mev9mlv +j8e5BAN93O//XX/j+x4H+V5/+x9H/jS3uXTXvhjnu2urPiK7+ZM3/hN7/h1 btN6PvXDzOdVz+6BPujvXuib3+gAMY/dPHkC5R1kd1DeOnnxFsaDuA5iPHUT 4927ePHeRo4c+937GLLfSJIls/U7mRIlymwtW9bKBlNmLZo1bdW6aUvnTp23 bPkE+vPWUKJFh8a6hVRpLKZNY616GnXVVKqrnlm1+kzr1q3znnkFO0/sWLIF zRJEq1ChQ7YNLVrEGFdjx44hQYIsOVJlSpd9X8aMWVOwTZyFeR7+mRio0aSN myZ12hTq5KqVsV7FzFUz2K9fyYo9a1bt6LZv4WbEl7EjPo93/d0t6S8v/0p/ e1tq8xtTm8zAtXbnLKwNsa1tihNvY3wLueOk2yIzrcZ08tNqVDGvqp5Za7Wu nfN1JpvvM8F8oQ/iG90wdUO3plWrplsXNt6Ve1nm5p1/8GDgOYf3NI4opZh7 TjqppLKsquu000wrzsJKK8L0DiqNvbdSwzAeDO9hrcN7XgPxww/7ka1EEk8s MZvaVswGNxdbbNE3GXejcUZbhMOROB2L41E5H5ED8sdYnCMyluiONNJI7Jas rkkmn+Euyme+o3LKKecRL0sst8xSnvK+lAc9McMMU0MzU5Mrzbnim0+kvOzj Cz/A9DOsTv/+C2oxowbks8Dp/pxqwcuyatBB8P88+yy0tCaskC2IMtzQQw9D pBRFS1NksbYXN52x0xpzzLE44XgkTrlSg0R1SFWLdA5JV5mEVUpZraySSi5v 7RLM8sbk9UxfH31vI9bie82uj4rVizbbYMxttzl1I+ym3w4TDkCfistTOT6b KzA6yagDdMkFoSz0uwetHMus8hYlM731SoNUQw7nZe21ekWs1ER9UVSxX01h 3BRgT28kGNQdD0b1R4VZVTW6VpNsUkknZ+Xuu4pppRVXjXX1kkxePS4z3kjp nddefPG91F+VA+b0U099KzhmUmc+VUiGH3YV4lh3pphcizG2VUuOwfy4V5Hl lZRkSlEG8VJ+M10ZYIH/P70RZoNp7jFhrVflGmeIJX6y54trvTLojTseGmSj fRWZ5ElPzldlFlme+mWXaYw5VIR31PZmrnOemOdYyZ2V7FqxRDvxoj1m+0x8 Onycw8j9wQfEyj/0B8TMSdw88xIzV1GbFUUP3UVtTEf9xtNVH1UbHl0nbhsg ZVeOdtlnJ7Ka3HM/sprem/QdyuB9r7gaKo2fMh8qlceSeeWzVN5LfL6cXnox Hw8Te0g5RNptuOFOGWqoWfYtRqoNvnrvrG3uOkmvAR+8ScLnNzxjoRNPu2gN Q9bw8cj9r9zkAkg5zXmucwYEnT9Et8DRKVCBqDvd6iI4QeK4zoKv24brbHe7 /9vVjoO7053vhkQ84hmJhMMjXj6Cp0IWIu95L2zeC6mXj+lVj4Y31B4AH4e0 7iXNZEsr0YhWRCK59YtuLirf3fJGMFGpj29+YxjgdDYxKGFnflL6meGwVDYv IS5/amOcmPqnwwGWkYCVQ2Aa1Si6zDHQjQ+cYBwnmEE6XvCCH8RjHnUnuxBu o48hPGEgU2g8QraQhTJEZCKnp7wa4hCHZPTfGCUHOctV8kOX8xznGhi6TUaw Raf7JI0kOEocwe50GKwgjza4uxGysoSvFCHxsIPCKLnQlsdbHvRmKL1d+i97 18MQJCn3uDMWc4BqRKbn3ujG08FRjnKsYzTvmEc87v/Rj9f8ox8FKUgV+s6Q hSxkIsX5vEaWk4aPOycAJem/SUrOkgS8ZAE5OU8HztOT9zydb0jJOtWhko6x UyWRZNdKgvquVbFEKPBquVDh4XJKt0zeLm/IS4r60qI7BKAxNZo5NCbTo210 4DJDCk07SvN2GqRmSjmYTZZq84TfhKnyjDdOmpLTkeasISR1qFEzdrSjBmRj SIXKzGcW9ZQRNOk0UbrS27X0jwbdJjfBCdOZHlKGi7xpVnWqw3/474xdNeY/ OGpAsaaxrEAtqxv/scy1HjWDa5UmXJf6jzzSFY92/eM/WKpXqPqOr+DU6zf/ IdMXDhaRhn0hPgxbzq7etKv/W/VqTzdKQJCCVKTLNGocM+jWkpZUdii1plOx 2deobpOqMbUqVnGq1XSSsauvVWxsX+uP2YrVtrTF7W11m1vaasO2vgXuWoUb XOIO17i+3QZdlZtc5i7Xuc1NbjWUK13q6tW61cXuda2bj+0O1rvcBe93xRte 7iq2vLBFr2x3Kln2eu6nyoTvZYfazGdutrNJPakem4pN/rKUtCQ87VTDadXE 2nS1OEWn/9K7YMXStsG7hTBvfzvh3h7XwsUtbnKR+1wOQ5fD2QWxdkNcXe5K l7zjRXF4zfva86o3vcRUcE/BWkawjrW38V3rUHOs1me21Y5yrSOQNQhXPspO r/09/3Jen0pdbxIvsIAVcGAJW14DN5axOH1sjBfs4Ah3WcJf1q1vK1xhDBtX wx1Gs4fVjGbpRlfEby5xiuV8YjqLd8V3ZnCeXfzgB4M5t2K+cKDLPGgzC/fM Hm6zdd084jczmtFxrvOJ8bxnPVeay372cqb/PGFCb3jDawZ1mtk8XVI72rsm nnOqI+3dSVea0pS+dG03TWZB17rTFj60cxO960b32tSmhnR3VcxqV+f5H689 Nm2TfWzbLtvZzYa2sqPNbGlXm9m+PTa2hXvs5HKb2d1WrrfFHW5yg9vczJbu sdNt3WNzt93Mdrd33z1vedc73veGd76P/Wr0xprPmqawcPBpfWuCK9fTom4u r928aF/3OtioRvWqzzvxYrv42da+OLU1nnGOTzvb1wb5uM8t8m+XnOQnLze6 9W3vleOb3i5n+cuZrdh9F9vftu1zwAG9c07b2ucHz/WnSb3whv8azt2FOIrx TPFW85vZT4d61KU+dapX3epXx3rWtb51rnc96zRHNrTBjnGPl13a2j57yLe9 dm2PPOUodzu41z13lat75euGed5bPvOVgx3sXgd84AU/eMIX3vB+33jYpT32 xKf92WhXu+PJ3Xa1g5vyKF+33E3Obs7jve719rzMa05vsMe79Hw3fOpVv3rW t57qAQEAOw== }] set ::he::dialog::colordialog(img_v) [image create photo -data { R0lGODlhCgBlAPcAAP////z8/Pr6+vf39/X19fLy8vDw8O3t7evr6+jo6Obm 5uPj4+Dg4N7e3tvb29nZ2dbW1tTU1NHR0c/Pz8zMzMnJycfHx8TExMLCwr+/ v729vbq6uri4uLW1tbOzs7CwsK2traurq6ioqKampqOjo6GhoZ6enpycnJmZ mZaWlpSUlJGRkY+Pj4yMjIqKioeHh4WFhYKCgoCAgH19fXp6enh4eHV1dXNz c3BwcG5ubmtra2lpaWZmZmNjY2FhYV5eXlxcXFlZWVdXV1RUVFJSUk9PT01N TUpKSkdHR0VFRUJCQkBAQD09PTs7Ozg4ODY2NjMzMzAwMC4uLisrKykpKSYm JiQkJCEhIR8fHxwcHBoaGhcXFxQUFBISEg8PDw0NDQoKCggICAUFBQMDAwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAACwAAAAACgBlAAAI/wABCBxIMIDBgwgFKFzIcIDD hxAJSJxIsYDFixgNaNzI8YDHjyARiBxJMoHJkygVqFzJcoHLlzAZyJxJs4HN mzgd6NzJ84HPn0AhCB1KNILRo0glKF3KdILTp1ApSJ1KtYLVq1gtaN3K9YLX r2AxiB1LNoPZs2g1qF3LdoPbt3A5yJ1Lt4Pdu3g96N3L94Pfv4BBCB5MOITh w4hFKF7MeITjx5BJSJ5MuYTly5hNaN7M+YTnz6BRiB5NOoXp06hVqF7NeoXr 17BZyJ5Nu4Xt27hd6N7N+4Xv38BhCB9OPIbx48hlKF/OfIbz59BpSJ9OvYb1 69htaN/O/Yb37+BxiN0fTz6H+fPodahfz36H+/fwecifT7+H/fv4fejfz/+H //8AAiHggAQGYeCBCAqh4IIMDuHggxASIeGEFBZh4YUYGqHhhhwe4eGHICIh 4ogkJmHiiSgqoeKKLC7h4oswMiHjjDQ2YeONODqh4448PuHjj0BCIeSQREZh 5JFISqHkkkxO4eSTUFIh5ZRUVmHllVhaoeWWXF7h5ZdgYiHmmGRmYeaZaGqh 5ppsbuHmm3ByIeecdHZh5514eqHnnnx+4eefgIIh6KCEhmHooYiKoeiijI7h 6KOQkiHppJQGBAA7 }] ---- [RS]: "There is no way"? Look at this:-) % winfo rgb . yellowgreen 39578 52685 12850 % foreach {r g b} [winfo rgb . yellowgreen] break % format #%02x%02x%02x [expr {$r/256}] [expr {$g/256}] [expr {$b/256}] #9acd32 [HE] Thank you! Have this command completely forget. Changed it above. Know the file size is more pocketPC like :-) ----