How to modify the default font in Tkinter?
python, python-2.7, tkinter
Solution
Tkinter has several built-in fonts -- `TkDefaultFont`, `TkTextFont`, `TkFixedFont`, etc. These are all what are called "named fonts". They are remarkably powerful -- change one of these and all widgets that use them will change as well.
To change one of these fonts, get a handle to it and then use the `configure` method to change. For example, to change the size of `TkDefaultFont` to 48 you would do this:
default_font = tkFont.nametofont("TkDefaultFont")
default_font.configure(size=48)
That's it. You don't have to do anything else -- everything that uses `TkDefaultFont` will instantly notice the change.
In your question you imply you want `TkDefaultFont` font to be used by everything. To do that you can use `option_add` as you've shown:
root.option_add("*Font", default_font)
Note, however, that `option_add` only affects widgets created after you've called `option_add`, so you need to do it before creating any other widgets.
Also note that you can give the font name to `option_add` if you don't want to bother with getting the font instance first (ie: `root.option_add("*Font", "TkDefaultFont")`).
Problem
I'm working on a GUI in Python2.7, with Tkinter, and I have an annoying problem. I would like to define the default font used by all the widgets, if possible in one line. This line modify only the font used in Entry, or ComboBox: ``` root.option_add("*Font", "courier 10") ``` but not the label of checkbox by example. I found that a predefined font exist "TkDefaultFont" but I'm unable to change its configuration: ``` print tkFont.Font(font='TkDefaultFont').configure() tkFont.Font(font='TkDefaultFont').config(family='Helvetica', size=20) tk.TkDefaultFont = tkFont.Font(family="Helvetica",size=36,weight="bold") print tkFont.Font(font='TkDefaultFont').configure() ``` prints: `{'family': 'DejaVu Sans', 'weight': 'normal', 'slant': 'roman', 'overstrike': 0, 'underline': 0, 'size': -12}` `{'family': 'DejaVu Sans', 'weight': 'normal', 'slant': 'roman', 'overstrike': 0, 'underline': 0, 'size': -12}` (no errors, but nothing changed!) What I'm doing wrong?