Python通過(guò)tkinter列出全部字體名稱,及import模塊的一些知識(shí)
用Python列出windows系統(tǒng)全部字體,通過(guò) tkinter.font 的 families() 函數(shù)實(shí)現(xiàn)。具體代碼非常簡(jiǎn)單:
import tkinter
import tkinter.font
tkGUI = tkinter.Tk()
print(tkinter.font.families())
先解釋一下為什么需要 tkGUI = tkinter.Tk() 這段代碼。tkinter是Python內(nèi)置的圖形界面模塊(庫(kù)),源自 TCL/TK 語(yǔ)言。該模塊里的各種函數(shù)(大部分是圖形界面組件,比如按鈕、文字框、輸入框等)都依托于Tk(),正常的開(kāi)發(fā)流程是這樣的:先創(chuàng)建一個(gè)Tk()變量(創(chuàng)建Tk類(lèi)的實(shí)例變量,又稱實(shí)例化Tk類(lèi)),然后創(chuàng)建各種圖形組件(都要指明從屬于Tk實(shí)例變量),等整個(gè)圖形界面都設(shè)置的差不多了,調(diào)用Tk變量的.mainloop()函數(shù),顯示整個(gè)界面。
在上面的四行代碼里,起關(guān)鍵作用的tkinter.font也從屬于Tk(但不需要指明)。也就是說(shuō),tkinter.font需要程序里有Tk實(shí)例變量的存在,然后才能顯示出字體列表。所以實(shí)際上只是調(diào)用Tk()類(lèi)的一部分功能,并沒(méi)有走完整個(gè)圖形界面的流程,讓tkGUI這段代碼顯得很突兀。
為什么 import 兩次?
這個(gè)要從Python的模塊(庫(kù))機(jī)制說(shuō)起,模塊是可以包含模塊的,這種情況下叫主模塊和子模塊,tkinter.font就是tkinter的子模塊。在import主模塊時(shí),是否連帶引入了子模塊是由開(kāi)發(fā)作者控制的,如果模塊配置文件里沒(méi)有包含子模塊,則子模塊不會(huì)被自動(dòng)引入。tkinter.font就是需要獨(dú)立引用的子模塊,所以需要improt兩次,第一次引入的tkinter是為了引入tkinter.Tk。
注意:Python的import是個(gè)隱藏坑,如果自己用Python做點(diǎn)小工作,把py源碼都放到一個(gè)目錄里,能規(guī)避許多問(wèn)題。如果子目錄里放py源碼,則子目錄的py文件需要考慮絕對(duì)引用和相對(duì)引用的問(wèn)題。這方面建議搜索import的研究文章,官方的文檔并不深入。
簡(jiǎn)單寫(xiě)法
一次同時(shí)引入兩個(gè)模塊
from tkinter import Tk, font
可以同時(shí)引入Tk和font,但如果你需要引入的子模塊比較多的時(shí)候,這種寫(xiě)法不易讀,所以關(guān)鍵還是要弄懂原理。另外前面提到的相對(duì)引用也是使用 from . import xxx 這種語(yǔ)句引入的,所以在源碼目錄結(jié)構(gòu)比較復(fù)雜的項(xiàng)目里,以避坑的角度來(lái)說(shuō) from 才是推薦的引用方式。
我個(gè)人更建議小項(xiàng)目的py源碼應(yīng)該避免使用子目錄結(jié)構(gòu)(沒(méi)明白import機(jī)制之前)。
其它
Python提示沒(méi)有tkinter模塊?
安裝的時(shí)候沒(méi)有安裝IDLE導(dǎo)致的,我當(dāng)初就覺(jué)得用不上沒(méi)有裝,今天才發(fā)現(xiàn)TK庫(kù)也沒(méi)有安裝。
