在 Tkinter 中获取默认字体

Posted

技术标签:

【中文标题】在 Tkinter 中获取默认字体【英文标题】:Getting the default font in Tkinter 【发布时间】:2017-11-12 17:05:24 【问题描述】:

我正在运行 Python 3.6,想知道是否有办法获取 Tkinter 使用的默认字体,更具体地说,是调用 canvas.create_textCanvas 对象使用的默认字体。

【问题讨论】:

【参考方案1】:

来自文档here:

Tk 8.0 自动将 Courier、Helvetica 和 Times 映射到其在所有平台上对应的原生姓氏。

我找不到说明 canvas.create_text 的默认字体是什么的文档,但它应该是上面引用中列出的 3 种字体之一。

【讨论】:

【参考方案2】:

idlelib/help.py 有这一行:

    normalfont = self.findfont(['TkDefaultFont', 'arial', 'helvetica'])

findfont 是这样定义的:

def findfont(self, names):
    "Return name of first font family derived from names."
    for name in names:
        if name.lower() in (x.lower() for x in tkfont.names(root=self)):
            font = tkfont.Font(name=name, exists=True, root=self)
            return font.actual()['family']
        elif name.lower() in (x.lower()
                              for x in tkfont.families(root=self)):
            return name

(这不是我写的。)

https://www.tcl.tk/man/tcl8.6/TkCmd/font.htm 是关于字体功能的终极文档。

【讨论】:

【参考方案3】:

我相信这会解决你的问题。

from tkinter import *


janela = Tk()
label = Label(janela)
print(label["font"])

【讨论】:

【参考方案4】:

是的。用于在画布上创建文本对象的默认字体是“TkDefaultFont”

from tkinter import *
r = Tk()
c = Canvas(r)
c.pack()
id = c.create_text(10, 10, text='c')
def_font = c.itemconfig(id, 'font')[-2] # [-2] is default, [-1] is current
print(def_font, c.itemconfig(id)) # to see all the config info

如果您想修改该默认字体,您可以使用nametofont() 来访问底层字体对象,然后对其进行操作:

from tkinter import font
def_font_obj = font.nametofont(def_font)
def_font_obj.config(...)

如果您不想自定义默认字体,可以根据当前字体创建一个新的命名字体,然后使用修改它

current_font = c.itemconfig(id, 'font')[-1] # or just c.itemcget(id, 'font')
new_named_font = font.Font(font=current_font).config(...)

然后将 new_named_font 作为字体选项传递给任何小部件配置。

【讨论】:

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

无法更改像素本上的 tkinter 字体

Qt 中如何获取系统默认字体大小?

python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体自定义设置图像标题使用的字体类型

QML 以像素为单位获取默认字体高度值

inputselect默认字体颜色

C#winform 如何获取当前系统所使用的默认字体