【问题标题】:Cannot import Tkinter font object from module无法从模块导入 Tkinter 字体对象
【发布时间】:2016-05-04 14:35:12
【问题描述】:

我有一种感觉,这将在一个掌上结束,但我就是不明白为什么这个 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 相同的窗口。

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

【问题讨论】:

  • 听起来你是在创建根窗口之前尝试创建字体。
  • 是的,就是这样。下面对马特的评论解释了让我失望的原因。

标签: python-2.7 tkinter python-import


【解决方案1】:

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

from fonts1 import fntPlainText

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

【讨论】:

  • 是的,这行得通。现在我想我明白了为什么我会得到这个场景的回溯,而我没有得到其他类似场景的回溯。在我的“真实”应用程序中,我有几个外部模块定义了各种自定义的 Tkinter 小部件,但在所有情况下,这些小部件都被包装为类定义......因此,它们导入得很好,因为小部件实际上并不存在,直到它被实例化(在我的“真实”应用程序中,直到我创建根窗口之后才会发生)。
  • 如果fonts1 包含def make_plain_font(root): return tkFont.Font(root, family='Courier New',size=10),则导入不会创建字体,您可以将导入放回它所属的顶部..
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2021-01-22
  • 1970-01-01
  • 2013-06-23
  • 2019-02-06
相关资源
最近更新 更多