为什么在Python 3.5.1中使用tkinter ttk时会显示“name ttk is not defined”?

5

考虑以下简单代码:

from tkinter import *
from tkinter.ttk import *
root= Tk()
ttk.Label(root, text='Heading Here').grid(row=1, column=1)
ttk.Separator(root,orient=HORIZONTAL).grid(row=2, columnspan=5)
root.mainloop()

当我运行这段代码时,它显示错误。
ttk.Label(root, text='Heading Here').grid(row=1, column=1)
NameError: name 'ttk' is not defined
4个回答

9
当你执行import X时,你导入了一个名为X的模块。从这一点开始,X将被定义。
当你执行from X import *时,你并没有导入X,你只是导入了X内部的东西。 X本身将未定义。
因此,当你执行from tkinter.ttk import *时,你并没有导入ttk,你只是导入ttk中的东西。这将导入像LabelButton等东西,但不会导入ttk本身。
在Python3中导入ttk的正确方式如下所示:
from tkinter import ttk  

使用这种方式,您可以使用ttk.Label引用ttk标签,使用ttk.Button引用ttk按钮等等。
注意:使用from tkinter.ttk import *是有风险的。不幸的是,ttktkinter都导出了具有相同名称的类。如果同时使用from tkinter import *from tkinter.ttk import *,则会覆盖一个类。导入的顺序会影响您的代码行为。
因此,特别是在tkinter和ttk中有多个重叠类的情况下,应避免使用通配符导入。PEP8, 官方python样式指南,正式不鼓励通配符导入:

应避免使用通配符导入( from import * ),因为它们使命名空间中存在哪些名称变得不清楚,使读者和许多自动化工具感到困惑。


注意:你的问题暗示你正在使用Python 3,但如果你使用的是Python 2,你可以直接使用import ttk而不是from tkinter import ttk。在Python 3中,ttk已经移动了。

我同意你的答案,但是当我使用"from tkinter import ttk"这一行时,我遇到了相同的错误:“NameError: name 'Separator' is not defined”。你能给我提供一些建议来解决这个错误吗?@BryanOakley - sujit
@sujit:使用 ttk.Separator - Bryan Oakley
如果你执行from tkinter import ttk,那么不可能出现name ttk is not defined的错误。 - Bryan Oakley
但是我得到了关于行“from tkinter import ttk”的错误,而不是关于“ttk.Separator”的错误。 - sujit
也许你正在运行Python 2.7。你的第一条评论暗示你能够执行“from tkinter import ttk”,现在你又说你不能?这让我们很难帮助你。 - Bryan Oakley
显示剩余3条评论

1

要导入ttk,请替换以下行:

from tkinter.ttk import *

使用:

from tkinter import ttk

否则,tkinter.ttk 模块的属性将加载到当前模块命名空间中,而不是 ttk 本身。

1
当你导入ttk模块时,有两种方式可以做到 -
  1. from tkinter import ttk 当你这样做时,ttk被导入类似于一个变量,因此你可以使用 ttk.Label

  2. from tkinter import * 这被称为通配符导入。你不能使用ttk.Label,你必须直接写Label(options)


0
ttk.Label(root, text='HeadingHere').grid(row=1, column=1) 
NameError: name 'ttk' is not defined
In this remove ttk as follows.    
Label(root, text='HeadingHere').grid(row=1, column=1

现在它运行良好


这并没有真正回答所提出的问题,只是提供了一个解决方法。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接