无法从模块导入 Tkinter 字体对象

Cannot import Tkinter font object from module

我觉得这会以打脸告终,但我就是想不通为什么 import x from y 这种情况对我不起作用。作为起点,采用以下模块 main.py:

import Tkinter as tk
import tkFont
__metaclass__ = type
#Create widgets
root = tk.Tk()
fntPlainText = tkFont.Font(family='Courier New',size=10)
lblDisplay = tk.Label(root, relief=tk.SUNKEN,
                      font=fntPlainText,
                      width=30,height=5,
                      text='This is a test!')
#Do layout
lblDisplay.grid(padx=5,pady=5)
#Begin app
tk.mainloop()

这 运行 正常并张贴一个带有预期内容的小标签:

所以现在我想将这个 Font 对象的定义移动到一个单独的模块中,这样我就可以在多个应用程序之间共享它。我更新的代码模块是 fonts1.py:

import Tkinter as tk
import tkFont
__metaclass__ = type
fntPlainText = tkFont.Font(family='Courier New',size=10)

...和main1.py:

import Tkinter as tk
from fonts1 import fntPlainText
__metaclass__ = type

#Create widgets
root = tk.Tk()
lblDisplay = tk.Label(root, relief=tk.SUNKEN,
                      font=fntPlainText,
                      width=30,height=5,
                      text='This is a test!')
#Do layout
lblDisplay.grid(padx=5,pady=5)
#Begin app
tk.mainloop()

但是当我 运行 main1.py 时,我得到一个回溯:

Traceback (most recent call last):
  File "G:\Python\experiments\investigations\tk\main1.py", line 2, in <module>
    from fonts1 import fntPlainText
  File "G:\Python\experiments\investigations\tk\fonts1.py", line 5, in <module>
    fntPlainText = tkFont.Font(family='Courier New',size=10)
  File "C:\Python27\lib\lib-tk\tkFont.py", line 89, in __init__
    tk.call("font", "create", self.name, *font)
AttributeError: 'NoneType' object has no attribute 'call'

从谷歌搜索和实验中,我发现足以知道 fntPlainText 的分配出了问题,但(再次)我无法弄清楚它是什么。整个情况中最大的困惑是,当我减少 fonts1.py 以简单地将 fntPlainText 定义为元组时——

已修改 fonts1.py

fntPlainText = ('Courier New',10)

运行 main1.py 现在正常完成并绘制与 main.py 相同的 window。

如果重要的话,环境是 Python 2.7.x 运行ning on Windows 7.

您需要在创建字体之前创建根 window (tk.Tk())。如果你移动你的

from fonts1 import fntPlainText

在 tk.Tk() 调用下方,它应该可以按预期工作。