Tcl/Tk 8.6.11 fontchooser has still issues. 1st The dialog shows a lot of duplicated font families. Reason is that the code in fontchooser.tcl uses "set S(fonts) [lsort -dictionary [font families]]" two times instead of "set S(fonts) [lsort -dictionary -unique [font families]]" 2nd Locale change doesn't change all text in dialog correctly. Font style in the listbox stays with the old locale. In case of not en, this leads to wrong results. # I'm using de normally. To have the default behaviour I set it first to en ::msgcat::mclocale en # Configure command proc font_cb {args} { puts "args: $args" return } tk fontchooser configure -command font_cb tk fontchooser show # Press Apply button provided on my computer "{{DejaVu Sans} 9}" # Change font style to italic and press Apply provides "{{DejaVu Sans} 9 italic}" # Change font size to 14 and press Apply provides "{{DejaVu Sans} 14 italic}" # Select Strikeout and press Apply provides "{{DejaVu Sans} 14 italic overstrike}" # Select Underline and press Apply provides "{{DejaVu Sans} 14 italic overstrike underline}" # Change Font and press Apply provides "{Georgia 14 italic overstrike underline}" # Now we change locale to de ::msgcat::mclocale de # Dialog has still the old language and the output is the same # Press Cancel to destroy the dialog tk fontchooser show # Now the dialog is in German beside font style in listbox which is still in english. # The selected style is displayed in the entry in German. # We select the same font as with our last try: "{Georgia 14 italic overstrike underline}". # Press Apply (now Anwenden) provides "{Georgia 14 overstrike underline}". # The font style selection is ignored. That means it is 'regular'. Reason is that "set S(styles) ..." is defined during namespace definition and not in ::tk::fontchooser::Show. Doing this in show would change the locale at least after the dialog is shown after using Ok or Cancel button. 3rd The title of the dialog is not changing in case the locale is changed. Reason is that "set S(-title) [::msgcat::mc "Font"]" is defined during namespace definition and not in ::tk::fontchooser::Show. Doing this in show would change the locale at least after the dialog is shown after using Ok or Cancel button. This still has an issue. "Font" is english for Font. In German "Schriftart" would be expected. Missing is an mechanism which detects that -title is not defined. That means we should not set -title with a default string. Instead we should keep it empty and test if empty if we set the title of the window. This could be done regularly during executing ::tk::fontchooser::Show. 4th The sample text is also defined inside the namespace definition. This should also moved to ::tk::fontchooser::Show. 5th Confguration of -title does not take effect directly. The dialog has to be destroyed by using button Ok or Cancel. Expected behaviour would be that title is changed directly when tk fontchooser configure -title newValue is done. Needed changes: Add the following to ::tk::fontchooser::Configure before the last return: if {[string trim $S(-title)] eq {}} { wm title $S(W) [::msgcat::mc Font] } else { wm title $S(W) $S(-title) } 6th If font entry or size entry is cleared Ok button becomes disabled. The Apply button is still usable (state = normal). Needed changes: Add the following to ::tk::fontchooser::Tracer as the last line: $S(W).apply configure -state $nstate 7th a wrong behaviour of the dialog: The dialog shows only the buttons Ok and Cancel if -command is not configured (is empty). In case configured we have three buttons: Ok, Cancel and Apply. That makes no sense, button Ok and Cancel do the same in case no command (callback) is configured. That means Cancel would be enough. On the other side button Apply raise event <> which is needed to use the dialog with empty -command. In case the command is configured later, we will still have Ok and Cancel only. We still miss the function of Apply. If we start with configured command all three buttons are shown. If the command is then set to {} we have again not correct working button. In both cases the dialog should be able to show that state. That could be done by display allways all three buttons and activate/deactivate them (state normal and disabled) depending on the situation. tk fontchooser show ;# Only Ok and Cancel # Configure command proc font_cb {args} { puts "args: $args" return } tk fontchooser configure -command font_cb tk fontchooser hide tk fontchooser show ;# Still only Ok and Cancel # Press Ok then call tk fontchooser show ;# Ok, Cancel and Apply tk fontchooser configure -command {} tk fontchooser hide tk fontchooser show ;# Still Ok, Cancel and Apply # Press Ok then call tk fontchooser show ;# Ok and Cancel only Changes needed: In procedure ::tk::fontchooser::Tracer move nstate into array S to be able to access the value in ::tk::fontchooser::Configure. Replace in ::tk::fontchooser::Create if {$S(-command) ne ""} { grid $S(W).apply -in $bbox -sticky new -pady 2 } with grid $S(W).apply -in $bbox -sticky new -pady 2 Also we need to change ::tk::fontchooser::Configure to handle the state of the buttons Ok and Apply. To check the behaviour of <> use bind . <> {puts "Font Changed"}