为什么 tkinter ttk 在 python 3.5.1 中显示 "name ttk is not defined"
why does tkinter ttk showing "name ttk is not defined" in python 3.5.1
考虑这个简单的代码:
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
要导入 ttk
,请替换以下行:
from tkinter.ttk import *
与:
from tkinter import ttk
否则,tkinter.ttk
模块的属性将被加载到当前模块命名空间而不是 ttk
本身。
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
现在可以正常使用了
当您执行 import X
时,您正在导入一个名为 X
的模块。从这一点开始,将定义X
。
当你from X import *
时,你不是导入X
,你只是导入里面的东西 共 X
。 X
本身将是未定义的。
因此,当您执行 from tkinter.ttk import *
时,您并没有导入 ttk
,您只是导入了 in ttk 中的内容。这将导入 Label
、Button
等内容,但 而不是 ttk
本身。
在 python3 中导入 ttk
的正确方法是使用以下语句:
from tkinter import ttk
有了它,您可以用 ttk.Label
引用 ttk 标签,用 ttk.Button
引用 ttk 按钮,等等
注意:做from tkinter.ttk import *
是危险的。不幸的是,ttk
和 tkinter
都以相同的名称导出 classes。如果您同时执行 from tkinter import *
和 from tkinter.ttk import *
,您将用另一个覆盖一个 class。导入的顺序将改变您的代码的行为方式。
出于这个原因——特别是在 tkinter 和 ttk 的情况下,每个都有几个 classes 重叠——应该避免通配符导入。 PEP8,官方 python 风格指南,正式不鼓励通配符导入:
Wildcard imports ( from import * ) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools.
注意:您的问题暗示您使用的是 python 3,但如果您使用的是 python 2,则可以只执行 import ttk
而不是 from tkinter import ttk
. ttk
搬进 python 3.
导入ttk模块时,有两种方式-
from tkinter import ttk
当你这样做时,ttk 几乎像一个变量一样被导入,所以你可以使用 ttk.Label
from tkinter import *
这称为通配符导入。你不能使用 ttk.Label
你必须直接写 Label(options)
考虑这个简单的代码:
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
要导入 ttk
,请替换以下行:
from tkinter.ttk import *
与:
from tkinter import ttk
否则,tkinter.ttk
模块的属性将被加载到当前模块命名空间而不是 ttk
本身。
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
现在可以正常使用了
当您执行 import X
时,您正在导入一个名为 X
的模块。从这一点开始,将定义X
。
当你from X import *
时,你不是导入X
,你只是导入里面的东西 共 X
。 X
本身将是未定义的。
因此,当您执行 from tkinter.ttk import *
时,您并没有导入 ttk
,您只是导入了 in ttk 中的内容。这将导入 Label
、Button
等内容,但 而不是 ttk
本身。
在 python3 中导入 ttk
的正确方法是使用以下语句:
from tkinter import ttk
有了它,您可以用 ttk.Label
引用 ttk 标签,用 ttk.Button
引用 ttk 按钮,等等
注意:做from tkinter.ttk import *
是危险的。不幸的是,ttk
和 tkinter
都以相同的名称导出 classes。如果您同时执行 from tkinter import *
和 from tkinter.ttk import *
,您将用另一个覆盖一个 class。导入的顺序将改变您的代码的行为方式。
出于这个原因——特别是在 tkinter 和 ttk 的情况下,每个都有几个 classes 重叠——应该避免通配符导入。 PEP8,官方 python 风格指南,正式不鼓励通配符导入:
Wildcard imports ( from import * ) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools.
注意:您的问题暗示您使用的是 python 3,但如果您使用的是 python 2,则可以只执行 import ttk
而不是 from tkinter import ttk
. ttk
搬进 python 3.
导入ttk模块时,有两种方式-
from tkinter import ttk
当你这样做时,ttk 几乎像一个变量一样被导入,所以你可以使用ttk.Label
from tkinter import *
这称为通配符导入。你不能使用ttk.Label
你必须直接写Label(options)