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

Python 2.7 无法从模块导入Tkinter字体对象,python-2.7,tkinter,python-import,Python 2.7,Tkinter,Python Import,我有一种感觉,这将在facepalm中结束,但我就是不明白为什么这个从y导入x场景对我不起作用。以以下模块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.SUN

我有一种感觉,这将在facepalm中结束,但我就是不明白为什么这个
从y导入x
场景对我不起作用。以以下模块
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()
import Tkinter as tk
import tkFont
__metaclass__ = type
fntPlainText = tkFont.Font(family='Courier New',size=10)
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()
fntPlainText = ('Courier New',10)
这将正常运行,并显示一个包含预期内容的小标签:

现在我想将这个
Font
对象的定义移动到一个单独的模块,这样我就可以在多个应用程序中共享它。我更新的代码模块是
fonts1.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()
import Tkinter as tk
import tkFont
__metaclass__ = type
fntPlainText = tkFont.Font(family='Courier New',size=10)
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()
fntPlainText = ('Courier New',10)
…和
main1.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()
import Tkinter as tk
import tkFont
__metaclass__ = type
fntPlainText = tkFont.Font(family='Courier New',size=10)
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()
fntPlainText = ('Courier New',10)
但是当我运行
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'
运行
main1.py
现在正常完成,并绘制与
main.py
相同的窗口


如果有必要,环境是运行在Windows 7上的Python 2.7.x。

在创建字体之前,您需要创建一个根窗口(tk.tk())。如果你移动你的

from fonts1 import fntPlainText

在tk.tk()调用下面,它应该可以正常工作。

听起来好像是在创建根窗口之前创建字体。是的,就是这样。下面对马特的评论解释了什么让我感到厌烦。是的,这很有效。现在我想我明白了为什么我要对这个场景进行回溯,而我没有对其他类似场景进行回溯。在我的“真实”应用程序中,我有几个外部模块来定义各种定制的Tkinter小部件,但在所有情况下,这些小部件都包装为类定义。。。因此,它们导入得很好,因为小部件在实例化之前实际上并不存在(在我的“真实”应用程序中,在我创建根窗口之后很久才会出现)。如果
fonts1
包含
def make_plain_font(root):返回tkFont.font(root,family='Courier New',size=10)
,然后导入将不会创建字体,您可以将导入放回它所属的顶部。。