为什么 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,你只是导入里面的东西XX 本身将是未定义的。

因此,当您执行 from tkinter.ttk import * 时,您并没有导入 ttk,您只是导入了 in ttk 中的内容。这将导入 LabelButton 等内容,但 而不是 ttk 本身。

在 python3 中导入 ttk 的正确方法是使用以下语句:

from tkinter import ttk  

有了它,您可以用 ttk.Label 引用 ttk 标签,用 ttk.Button 引用 ttk 按钮,等等

注意:做from tkinter.ttk import *是危险的。不幸的是,ttktkinter 都以相同的名称导出 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模块时,有两种方式-

  1. from tkinter import ttk 当你这样做时,ttk 几乎像一个变量一样被导入,所以你可以使用 ttk.Label

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