The two widgets that would make this easiest would be the canvas and the text. With the canvas, you'd either make the number string a single text item and do the conversion of click-position to character index yourself, or (more likely) make each character be its own text item. (Like that you'd be able to make each character be individually styleable and clickable with minimal effort, but you'd need to pay a bit of attention to the layout side of things.)
However, I think the text widget is probably a better fit. That lets you set tags on character ranges, and those tags are both bindable and styleable.
pack [text .t -takefocus 0]
set binstring "01011010"
set counter 0
foreach char [split $binstring ""] {
set tag ch$counter
.t insert end $char $tag
.t tag bind $tag <Enter> ".t tag configure $tag -foreground red"
.t tag bind $tag <Leave> ".t tag configure $tag -foreground black"
.t tag bind $tag <1> [list clicked .t $tag $counter]
incr counter
}
proc clicked {w tag counter} {
global binstring
# Update the display
set idx [$w index $tag.first]
set ch [expr {![$w get $idx]}]
$w delete $idx
$w insert $idx $ch $tag
# Update the variable
set binstring [string replace $binstring $counter $counter $ch]
# Print the current state
puts "binstring is now $binstring"
}