修改 Python Tkinter 中的默认字体

Posted

技术标签:

【中文标题】修改 Python Tkinter 中的默认字体【英文标题】:How to modify the default font in Tkinter? 【发布时间】:2013-03-05 22:51:48 【问题描述】:

我正在使用 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

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

我做错了什么?

【问题讨论】:

【参考方案1】:

Tkinter 有几种内置字体——TkDefaultFontTkTextFontTkFixedFont 等。这些都是所谓的“命名字体”。它们非常强大——改变其中之一,所有使用它们的小部件也会改变。

要更改其中一种字体,请获取它的句柄,然后使用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")),则可以将字体名称指定为 option_add

【讨论】:

完美运行......!三个多小时以来,我一直在与此作斗争。谢谢你们俩 以前从不知道nametofont 方法 - 感谢您提及!我觉得 Tkinter 的主要问题与其说是库的问题(尽管它肯定有它的怪癖),不如说是它有多少似乎完全没有记录。顺便提一下 tkFont 存在于文档中,但它从未说明它包含什么或它是如何工作的。 如何将其设置为文件 @TimothyLawman:这个问题没有任何意义。这只是普通的python代码。像任何其他 python 代码一样将其添加到文件中。 @BryanOakley,我正在使用 root.option_add 方法,它在我的应用程序中运行良好,但有一个例外:字体选项似乎没有传递到 Treeview 小部件我' m 使用其中一个窗口。我的猜测是这是因为它是 ttk 小部件而不是 Tkinter【参考方案2】:

警告:虽然问题涉及 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() 来完成此操作。

【讨论】:

另外,附带说明一下,在 Tkinter 允许您对字体进行大量操作之前,您需要打开 Tk() 或 Toplevel() 窗口... 当我运行你的代码时,我得到``` Traceback(最近一次调用最后):文件“/Users/pm286/projects/openDiagram/physchem/python/pysimpleg.py”,第 434 行,在 test9() File "/Users/pm286/projects/openDiagram/physchem/python/pysimpleg.py", line 326, in test9 def_font = tkinter.font.nametofont("TkDefaultFont") File "/opt/anaconda3/ lib/python3.8/tkinter/font.py",第 22 行,在 nametofont] ...如果 self.name 不在 tk.splitlist(tk.call("font", "names")): AttributeError: 'NoneType ' 对象没有属性 'splitlist' ```

以上是关于修改 Python Tkinter 中的默认字体的主要内容,如果未能解决你的问题,请参考以下文章

在 Tkinter 中获取默认字体

tkinter中的字体(CSDN自搬运)

python3 tkinter中如何设置根窗口标题文字字体及大小和根菜单文字字体及大小?

R 的 plot() 中的默认字体是啥?

python Tkinter之Button

python tkinter 如何将tk界面中标题栏中的tk红色字样去掉,或者换成其他的字