用Python列出windows系统全部字体,通过 tkinter.font 的 families() 函数实现。具体代码非常简单:
import tkinter
import tkinter.font
tkGUI = tkinter.Tk()
print(tkinter.font.families())
先解释一下为什么需要 tkGUI = tkinter.Tk() 这段代码。tkinter是Python内置的图形界面模块(库),源自 TCL/TK 语言。该模块里的各种函数(大部分是图形界面组件,比如按钮、文字框、输入框等)都依托于Tk(),正常的开发流程是这样的:先创建一个Tk()变量(创建Tk类的实例变量,又称实例化Tk类),然后创建各种图形组件(都要指明从属于Tk实例变量),等整个图形界面都设置的差不多了,调用Tk变量的.mainloop()函数,显示整个界面。
在上面的四行代码里,起关键作用的tkinter.font也从属于Tk(但不需要指明)。也就是说,tkinter.font需要程序里有Tk实例变量的存在,然后才能显示出字体列表。所以实际上只是调用Tk()类的一部分功能,并没有走完整个图形界面的流程,让tkGUI这段代码显得很突兀。
为什么 import 两次?
这个要从Python的模块(库)机制说起,模块是可以包含模块的,这种情况下叫主模块和子模块,tkinter.font就是tkinter的子模块。在import主模块时,是否连带引入了子模块是由开发作者控制的,如果模块配置文件里没有包含子模块,则子模块不会被自动引入。tkinter.font就是需要独立引用的子模块,所以需要improt两次,第一次引入的tkinter是为了引入tkinter.Tk。
注意:Python的import是个隐藏坑,如果自己用Python做点小工作,把py源码都放到一个目录里,能规避许多问题。如果子目录里放py源码,则子目录的py文件需要考虑绝对引用和相对引用的问题。这方面建议搜索import的研究文章,官方的文档并不深入。
简单写法
一次同时引入两个模块
from tkinter import Tk, font
可以同时引入Tk和font,但如果你需要引入的子模块比较多的时候,这种写法不易读,所以关键还是要弄懂原理。另外前面提到的相对引用也是使用 from . import xxx 这种语句引入的,所以在源码目录结构比较复杂的项目里,以避坑的角度来说 from 才是推荐的引用方式。
我个人更建议小项目的py源码应该避免使用子目录结构(没明白import机制之前)。
其它
Python提示没有tkinter模块?
安装的时候没有安装IDLE导致的,我当初就觉得用不上没有装,今天才发现TK库也没有安装。