修改Python Tkinter中的默认字体

修改Python Tkinter中的默认字体,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我正在用Tkinter开发Python2.7中的GUI,我有一个恼人的问题 如果可能的话,我想在一行中定义所有小部件使用的默认字体。 此行仅修改条目或组合框中使用的字体: root.option_add("*Font", "courier 10") 但不是通过示例显示复选框的标签 我发现存在预定义字体“TkDefaultFont”,但无法更改其配置: print tkFont.Font(font='TkDefaultFont').configure() tkFont.Font(font='Tk

我正在用Tkinter开发Python2.7中的GUI,我有一个恼人的问题

如果可能的话,我想在一行中定义所有小部件使用的默认字体。 此行仅修改条目或组合框中使用的字体:

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','sland':'roman','overstrike':0,'underline':0,'size':-12} {'family':'DejaVu Sans','weight':'normal','sland':'roman','overstrike':0,'underline':0,'size':-12}

(没有错误,但没有更改!!)


我做错了什么?

Tkinter有几种内置字体--
TkDefaultFont
TkTextFont
TkFixedFont
,等等。这些都是所谓的“命名字体”。它们非常强大——更改其中一个,使用它们的所有小部件也将更改

要更改其中一种字体,请获取其句柄,然后使用
configure
方法进行更改。例如,要将
TkDefaultFont
的大小更改为48,可以执行以下操作:

default_font = tkFont.nametofont("TkDefaultFont")
default_font.configure(size=48)
就这样。您不必做任何其他事情——所有使用
TkDefaultFont
的操作都会立即注意到更改

在你的问题中,你暗示你希望
TkDefaultFont
font被所有人使用。为此,您可以使用
选项添加
,如图所示:

root.option_add("*Font", default_font)
但是,请注意,
option\u add
仅影响在调用
option\u add
后创建的小部件,因此您需要在创建任何其他小部件之前执行此操作


还请注意,如果您不想首先获取字体实例(即:
root.option\u add(“*font”,“TkDefaultFont”)
),可以将字体名称指定给
选项添加

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

如果要更改默认字体或任何命名字体,必须通过
nametofont()
访问字体对象:

然后配置返回的对象,如

def_font.config(size=24)
当你打电话的时候

myfont = tkinter.font.Font(font="TkDefaultFont")
实际上,您正在创建具有相同属性的新命名字体。 要帮助显示这一点,请执行以下操作:

str(def_font)
给出了“TkDefaultFont”,以及

str(myfont)
给出“font1”


哎呀。。忘了提。。。你问自己做错了什么。其中一件事是在第二行中,创建并配置一个新的命名字体,但不将其捕获到变量中。如果您捕获了它,您可以使用命名字体。但这仍然不会修改默认的命名字体。如上文所述,您必须使用
nametofont()!我已经和它斗争了30多小时了。感谢你们两位以前从未知道过
nametofont
方法-感谢你们提到它!我觉得Tkinter的主要问题与其说是图书馆的问题(尽管它肯定有它的怪癖),不如说是其中有多少似乎完全没有文档记录。顺便提到文档中存在
tkFont
,但它从来没有说明它包含什么内容或如何工作。您如何将其设置为file@TimothyLawman当前位置那个问题毫无意义。这只是普通的python代码。像任何其他python代码一样将其添加到文件中。@BryanOakley,我使用的是
root.option\u Add
方法,它在我的应用程序中运行得很好,但有一个例外:字体选项似乎不适用于我使用的一个窗口中的
Treeview
小部件。我猜这是因为它是一个
ttk
小部件,而不是
Tkinter
。另外,作为一个补充说明,在Tkinter允许你处理字体之前,你需要打开一个Tk()或Toplevel()窗口……当我运行你的代码时,我会得到``回溯(最近一次调用):File“/Users/pm286/projects/openDiagram/physchem/python/pysimpleg.py”,第434行,在test9()文件中“/Users/pm286/projects/openDiagram/physchem/python/pysimpleg.py”,第326行,在test9 def_font=tkinter.font.nametofont(“TkDefaultFont”)文件中“/opt/anaconda3/lib/python3.8/tkinter/font.py“,第22行,在nametofont]。。。如果self.name不在tk.splitlist(tk.call(“font”,“names”)):AttributeError:'NoneType'对象没有属性'splitlist'```
myfont = tkinter.font.Font(font="TkDefaultFont")