See Also edit
Description edit
OPTIONS- -keys range: list of (decimal or hex Unicodes of) characters to display. Consecutive sequences may be written as range, e.g. {0x21-0x7E} gives the printable lower ASCII chars.
- -keysperline n: number of keys per line, default: 16.
- -title string: If not "", text of a title label displayed above the keys. Default: "".
- -dir direction: if "r2l", moves cursor one to the left after each keypress. Useful for Arab/Hebrew. Default: l2r.
- -receiver widgetpath: Name of a text widget to receive the keystrokes at its insert cursor.
pack [text .t -width 80 -height 24] pack [keyboard .kbd -title Cyrillic -keys {0x410-0x44f} -receiver .t]
proc keyboard {w args} { frame $w array set opts { -keys {0x21-0x7E} -title "" -keysperline 16 -dir l2r -receiver "" } array set opts $args ;# no errors checked set klist {}; set n 0 if {$opts(-title)!=""} { grid [label $w.title -text $opts(-title) ] \ -sticky news -columnspan $opts(-keysperline) } foreach i [clist2list $opts(-keys)] { set c [format %c $i] set cmd "$opts(-receiver) insert insert [list $c]" if {$opts(-dir)=="r2l"} { append cmd ";$opts(-receiver) mark set insert {insert - 1 chars}" } ;# crude approach to right-to-left (Arabic, Hebrew) button $w.k$i -text $c -command $cmd -padx 5 -pady 0 lappend klist $w.k$i if {[incr n]==$opts(-keysperline)} { eval grid $klist -sticky news set n 0; set klist {} } } if [llength $klist] {eval grid $klist -sticky news} set w ;# return widget pathname, as the others do } proc clist2list {clist} { #-- clist: compact integer list w.ranges, e.g. {1-5 7 9-11} set res {} foreach i $clist { if [regexp {([^-]+)-([^-]+)} $i -> from to] { for {set j [expr $from]} {$j<=[expr $to]} {incr j} { lappend res $j } } else {lappend res [expr $i]} } set res }And here's some useful ranges if you happen to have the Cyberbit font:
Arabic (context glyphs) {0xFE80-0xFEFC} r2l Cyrillic {0x410-0x44f} Greek {0x386-0x38a 0x38c 0x38e-0x3a1 0x3a3-0x3ce} Hebrew {0x5d0-0x5ea 0x5f0-0x5f4} r2l Hiragana {0x3041-0x3094} Katakana {0x30A1-0xU30FE} Thai {0xE01-0xE3A 0xE3F-0xE5B}BUGSIt would be more straightforward to specify characters in the -keys argument literally, or in \uxxxx notation. But at home I still have 8.1a1 (blush) where Unicode scan don't work.
RS Update: I'm on 8.4 now for a while, and the latest evolution of the above code is at iKey: a tiny multilingual keyboard, which instead of buttons, has the characters directly clickable on a canvas, so it fits the small iPAQ screen.
George Petasis: Another virtual keyboard that has a slightly different orientation (it tries to mimic the operation of a usual keyboard) can be found here