如何修改Tkinter中的默认字体?

39 投票
2 回答
57847 浏览
提问于 2025-04-17 19:24

我正在用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()

打印出来的结果是:

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

(没有错误,但也没有任何变化!)

我到底哪里做错了呢?

2 个回答

1

注意:虽然这个问题是关于Py2.7的,但我的回答是针对Py3的。概念是完全一样的。不过在Py2中,你需要用tkFont代替tkinter.font

如果你想改变一个默认字体或者任何命名的字体,你需要通过nametofont()来访问字体对象:

def_font = tkinter.font.nametofont("TkDefaultFont")

然后你可以配置返回的对象,比如

def_font.config(size=24)

当你调用

myfont = tkinter.font.Font(font="TkDefaultFont")

时,实际上你是在创建一个新的命名字体,它有相同的属性。为了更好地说明这一点:

str(def_font) 会返回 "TkDefaultFont",而

str(myfont) 会返回 "font1"

哦,差点忘了提... 你问你哪里做错了。其中一个问题是在你的第二行,你创建了一个新的命名字体并进行了配置,但你没有把它存储到一个变量里。如果你把它存储了,你就可以使用这个命名字体了。不过,这样做还是不会修改默认的命名字体。你需要像上面解释的那样使用nametofont()来实现这个目的。

58

Tkinter有几种内置字体,比如 TkDefaultFontTkTextFontTkFixedFont 等等。这些字体被称为“命名字体”。它们非常强大——只要你改变其中一种,所有使用这款字体的组件都会跟着改变。

要改变某种字体,你需要先获取它的句柄,然后用 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(比如:root.option_add("*Font", "TkDefaultFont"))。

撰写回答