我正在使用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}
(没有错误,但没有任何改变!)
我做错了什么?
答案 0 :(得分:31)
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
仅影响调用{em> 之后创建的小部件,因此您需要在创建任何其他小部件之前执行此操作。
另请注意,如果您不想首先获取字体实例(例如:option_add
),则可以将字体名称指定给option_add
。
答案 1 :(得分:1)
注意:尽管问题涉及Py2.7,但我的答案是针对Py3。概念完全相同。但是,人们会使用tkinter.font
代替Py2等,而不是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()
来完成该操作。