Tkinter font.families() 函数如何获取可用字体列表?

How Tkinter font.families() function gets a list of available font?

我正在使用 Tkinter 制作 GUI 应用程序,我正在使用 tkinter.font.families() 来制作选择字体的下拉列表。

现在,我想知道这个功能是如何工作的
我尝试阅读代码但由于缺乏足够的知识而无法理解...

def families(root=None, displayof=None):
    "Get font families (as a tuple)"
    if not root:
        root = tkinter._default_root
    args = ()
    if displayof:
        args = ('-displayof', displayof)
    return root.tk.splitlist(root.tk.call("font", "families", *args))

这是函数的代码(https://github.com/python/cpython/blob/c4928fc1a853f3f84e2b4ec1253d0349137745e5/Lib/tkinter/font.py#L180)。

我的问题是

感谢您阅读我的问题。

What is the meaning of args = ('-displayof', displayof)?

Tkinter 是一个小型 python 包装器,它围绕着安装了 tk 包的 tcl 解释器。创建小部件、查询字体等的所有实际工作都由 tcl/tk 库完成。

Tcl/tk 命令使用前导破折号表示选项名称,选项通常后跟一个值。此代码准备调用 tcl 函数,因此它正在构建 tcl 所需的参数列表。

在这种特定情况下,如果将 displayof 参数传递给函数,它会添加 -displayof 选项。

Where does tk.call() function came from?

它来自一个基于 C 的库。它在名为 _tkinter.c 的文件中定义。更具体地说,它是函数 Tkapp_Call。它是一个小型包装器,允许 python 在嵌入式 tcl 解释器中执行命令。

How does tk.call("font", "families", *args) function works?

tk 库有一个名为 font 的命令。在 tcl 解释器中,您可以这样调用它:

font families

代码 tk.call("font", "families", *args) 只是将该命令发送到 tcl 解释器。

底层 tcl/tk 库具有处理字体的特定于平台的函数。参见 tkMacOSXFont.c, tkUnixFont.c, and tkWinFont.c