如何修改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()
打印出来的结果是:
{'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 个回答
注意:虽然这个问题是关于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()
来实现这个目的。
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
(比如:root.option_add("*Font", "TkDefaultFont")
)。