Изменить шрифт по умолчанию в Python Tkinter

Я работаю над графическим интерфейсом в Python2.7 с Tkinter, и у меня есть неприятная проблема.

Я хотел бы определить шрифт по умолчанию, используемый всеми виджетами, если это возможно в одной строке. Эта строка изменяет только шрифт, используемый в Entry или ComboBox:

root.option_add("*Font", "courier 10")

но не метка флажка на примере.

Я обнаружил, что существует предопределенный шрифт "TkDefaultFont", но я не могу изменить его конфигурацию:

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()

return:

{'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}

(ошибок нет, но ничего не меняется!)

Что я делаю неправильно?

Ответы

Ответ 1

Tkinter имеет несколько встроенных шрифтов - TkDefaultFont, TkTextFont, TkFixedFont и т.д. Это все так называемые "названные шрифты". Они замечательно мощные - измените один из них, и все виджеты, которые их используют, тоже изменятся.

Чтобы изменить один из этих шрифтов, выберите его, а затем используйте метод configure для изменения. Например, чтобы изменить размер TkDefaultFont на 48, вы сделаете следующее:

default_font = tkFont.nametofont("TkDefaultFont")
default_font.configure(size=48)

Что это. Вам не нужно ничего делать - все, что использует TkDefaultFont, мгновенно заметит изменение.

В вашем вопросе вы подразумеваете, что хотите, чтобы шрифт TkDefaultFont использовался всем. Для этого вы можете использовать option_add, как вы показали:

root.option_add("*Font", default_font)

Обратите внимание, однако, что option_add влияет только на виджеты, созданные после того, как вы вызвали option_add, поэтому вам нужно сделать это до создания любых других виджетов.

Также обратите внимание, что вы можете присвоить имя шрифта option_add, если вы не хотите беспокоиться о том, чтобы сначала получить экземпляр шрифта (например: root.option_add("*Font", "TkDefaultFont")).