我正在 Python2.7 中使用 Tkinter 开发 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}
(没有错误,但没有任何改变!)
我做错了什么?
Tkinter 有几种内置字体 --
TkDefaultFont
、TkTextFont
、TkFixedFont
等。这些都是所谓的“命名字体”。它们非常强大——改变其中之一,所有使用它们的小部件也会改变。
要更改其中一种字体,请获取它的句柄,然后使用
configure
方法进行更改。例如,要将 TkDefaultFont
的大小更改为 48,您可以这样做:
import tkinter.font as tkFont
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")
)。
tkinter.font
,而不是
tkFont
。如果您想更改默认字体或任何命名字体,您必须通过
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()
来完成此操作。