簡體   English   中英

為什么我需要從 tkinter 模塊顯式導入字體模塊,即使使用“*”導入了完整模塊?

[英]Why do I need to explicitly import the font module from the tkinter module even if have imported the full module using “*”?

我試圖運行給 python 片段:

from tkinter import *
from tkinter import font
root = Tk()
list_fonts = list(font.families())
for i in list_fonts:
    print(i)
root.mainloop()

我得到的輸出為:

Sitka Display
Sitka Banner
Nirmala UI Semilight
Leelawadee UI
Gadugi
Microsoft New Tai Lue
DokChampa
Segoe UI
Calibri
Miriam
Angsana New
Iskoola Pota
Kartika
Segoe UI Semilight
Vijaya
Nirmala UI
Mongolian Baiti
Microsoft YaHei
@Microsoft YaHei
Microsoft YaHei UI
@Microsoft YaHei UI
Vani
Arial Black
IrisUPC
Batang
@Batang
BatangChe
@BatangChe
Gungsuh
@Gungsuh
GungsuhChe
@GungsuhChe
Gautami
Segoe UI Black
Calibri Light
Cambria
Rod
Georgia
Verdana
Symbol
Euphemia
Raavi
Corbel
Shruti
Consolas
Segoe UI Semibold
Simplified Arabic
Cambria Math
DaunPenh
Nyala
Constantia
Yu Gothic
@Yu Gothic
CordiaUPC
Khmer UI
Aharoni
Microsoft Uighur
Times New Roman
Times New Roman CYR
Times New Roman TUR
Times New Roman CE
Times New Roman Baltic
Times New Roman Greek
Segoe Script
Candara
Ebrima
DilleniaUPC
MS Mincho
@MS Mincho
MS PMincho
@MS PMincho
Browallia New
Segoe UI Light
Segoe UI Emoji
Aldhabi
DFKai-SB
@DFKai-SB
SimHei
@SimHei
Lao UI
Courier New
Courier New CYR
Courier New TUR
Courier New CE
Courier New Greek
Courier New Baltic
Kalinga
Microsoft PhagsPa
Tahoma
EucrosiaUPC
KaiTi
@KaiTi
SimSun
@SimSun
NSimSun
@NSimSun
Meiryo
@Meiryo
Meiryo UI
@Meiryo UI
Sylfaen
Tunga
Urdu Typesetting
Microsoft YaHei Light
@Microsoft YaHei Light
Microsoft YaHei UI Light
@Microsoft YaHei UI Light
Webdings
Plantagenet Cherokee
Gabriola
MS Gothic
@MS Gothic
MS UI Gothic
@MS UI Gothic
MS PGothic
@MS PGothic
Gulim
@Gulim
GulimChe
@GulimChe
Dotum
@Dotum
DotumChe
@DotumChe
Lucida Sans Unicode
Andalus
Leelawadee
FangSong
@FangSong
Yu Mincho Demibold
@Yu Mincho Demibold
David
Miriam Fixed
Impact
Levenim MT
Segoe Print
Estrangelo Edessa
Leelawadee UI Semilight
Microsoft JhengHei
@Microsoft JhengHei
Microsoft JhengHei UI
@Microsoft JhengHei UI
Narkisim
MingLiU-ExtB
@MingLiU-ExtB
PMingLiU-ExtB
@PMingLiU-ExtB
MingLiU_HKSCS-ExtB
@MingLiU_HKSCS-ExtB
Yu Mincho Light
@Yu Mincho Light
Latha
Microsoft Sans Serif
FrankRuehl
MingLiU
@MingLiU
PMingLiU
@PMingLiU
MingLiU_HKSCS
@MingLiU_HKSCS
Myanmar Text
Yu Gothic Light
@Yu Gothic Light
Javanese Text
Microsoft Himalaya
Yu Mincho
@Yu Mincho
Lucida Console
Arabic Typesetting
Microsoft Yi Baiti
MV Boli
Wingdings
MT Extra
Arial Unicode MS
@Arial Unicode MS
Century
Wingdings 2
Wingdings 3
Book Antiqua
Century Gothic
Haettenschweiler
MS Outlook
Tempus Sans ITC
Pristina
Papyrus
Mistral
Lucida Handwriting
Kristen ITC
Juice ITC
French Script MT
Freestyle Script
Bradley Hand ITC
Arial Narrow
Garamond
Monotype Corsiva
Algerian
Baskerville Old Face
Bauhaus 93
Bell MT
Berlin Sans FB
Bernard MT Condensed
Bodoni MT Poster Compressed
Britannic Bold
Broadway
Brush Script MT
Californian FB
Centaur
Chiller
Colonna MT
Cooper Black
Footlight MT Light
Harlow Solid Italic
Harrington
High Tower Text
Jokerman
Kunstler Script
Lucida Bright
Lucida Calligraphy
Lucida Fax
Magneto
Matura MT Script Capitals
Modern No. 20
Niagara Engraved
Niagara Solid
Old English Text MT
Onyx
Parchment
Playbill
Poor Richard
Ravie
Informal Roman
Showcard Gothic
Snap ITC
Stencil
Viner Hand ITC
Vivaldi
Vladimir Script
Wide Latin
Tw Cen MT
Tw Cen MT Condensed
Script MT Bold
Rockwell Extra Bold
Rockwell Condensed
Rockwell
Rage Italic
Perpetua Titling MT
Perpetua
Palace Script MT
OCR A Extended
Maiandra GD
Lucida Sans Typewriter
Lucida Sans
Imprint MT Shadow
Goudy Stout
Goudy Old Style
Gloucester MT Extra Condensed
Gill Sans Ultra Bold Condensed
Gill Sans Ultra Bold
Gill Sans MT Condensed
Gill Sans MT
Gill Sans MT Ext Condensed Bold
Gigi
Franklin Gothic Medium Cond
Franklin Gothic Heavy
Franklin Gothic Demi Cond
Franklin Gothic Demi
Franklin Gothic Book
Forte
Felix Titling
Eras Medium ITC
Eras Light ITC
Eras Demi ITC
Eras Bold ITC
Engravers MT
Elephant
Edwardian Script ITC
Curlz MT
Copperplate Gothic Light
Copperplate Gothic Bold
Century Schoolbook
Castellar
Calisto MT
Bookman Old Style
Bodoni MT Condensed
Bodoni MT Black
Bodoni MT
Blackadder ITC
Arial Rounded MT Bold
Agency FB
Bookshelf Symbol 7
MS Reference Sans Serif
MS Reference Specialty
Berlin Sans FB Demi
Tw Cen MT Condensed Extra Bold

以及 tkinter 窗口

但是當我嘗試執行下面給出的代碼段時:

from tkinter import *
root = Tk()
list_fonts = list(font.families())
for i in list_fonts:
    print(i)
root.mainloop()

我收到一個錯誤:

Traceback (most recent call last):
  File "fonts.py", line 4, in <module>
    list_fonts = list(font.families())
NameError: name 'font' is not defined

我的疑問是為什么我明確需要從 tkinter 導入字體。 如您所見,我已經使用第 1 行中的“*”符號導入了字體模塊。請舉例說明,以便我了解這是如何發生的。

import *不會導入所有內容。 它不導入所有內容的一種方式是它不會自動搜索 package 的子模塊 fonttkinter包的子模塊,如果它還沒有被其他導入加載, from tkinter import * tkinter.font from tkinter import *將找不到tkinter.font

答案很簡單:Python 不會自動導入所有模塊層次結構,僅僅因為您導入了頂級層次結構。 那些這樣做的人(例如 os,這將使 os.path 可用)必須明確地為此編寫代碼。

只需添加import tkinter.font ,它就可以工作

但是,由於 IDLE 使用 tkinter 本身,它已經導入了 tkinter.font,因此您認為沒有導入就可以逃脫,我希望這會有所幫助:)

模塊可以有子模塊和/或函數、變量等。 from <module> import *取決於模塊的實現方式。 大多數模塊不會自動導入子模塊。
在這種情況下, tkinter是主模塊, font是一個子模塊, tkinter 沒有被設計為自動導入所有子模塊。 因此,當您執行from tkinter import * ,您將獲取所有函數和變量,而不是子模塊。 子模塊必須顯式導入才能使用。 您可以輸入:

from tkinter import *
from tkinter import font

或者你也可以輸入:

import tkinter  # actually not needed since the below "does both"
import tkinter.font

區別在於您是否要使用font.Font(...tkinter.font.Font(...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM