35

我正在使用 Tkinter 在 Python2.7 中开发 GUI,但我遇到了一个烦人的问题。

如果可能的话,我想定义所有小部件使用的默认字体。此行仅修改 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}

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

我做错了什么?

4

2 回答 2

51

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

于 2013-03-17T16:58:02.660 回答
1

警告:虽然问题涉及 Py2.7,但我的答案是针对 Py3。概念完全相同。但不是tkinter.font,而是tkFont用于 Py2 等。

如果要更改默认字体或任何命名字体,则必须通过以下方式访问字体对象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()按照上述说明使用才能完成此操作。

于 2020-02-09T21:07:35.630 回答