为什么tkinter ttk在python 3.5.1中显示“name ttk未定义”

时间:2016-04-13 08:41:01

标签: python python-3.x tkinter ttk

考虑这个简单的代码:

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 个答案:

答案 0 :(得分:4)

执行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按钮引用为ttk.Button等等。

注意:执行from tkinter.ttk import *很危险。不幸的是,ttktkinter都导出了具有相同名称的类。如果您同时执行from tkinter import *from tkinter.ttk import *,则将覆盖另一个类。导入的顺序将改变代码的行为方式。

出于这个原因 - 特别是在tkinter和ttk的情况下,每个都有几个重叠的类 - 应该避免使用通配符导入。官方python样式指南PEP8正式阻止了通配符导入:

  

应该避免使用通配符导入(来自import *),因为它们不清楚命名空间中存在哪些名称,这会使读者和许多自动化工具混淆。

注意:你的问题意味着你正在使用python 3,但是如果你使用的是python 2,你可以只做import ttk而不是from tkinter import ttkttk在python 3中移动。

答案 1 :(得分:1)

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

from tkinter.ttk import *

使用:

from tkinter import ttk

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

答案 2 :(得分:1)

导入ttk模块时,有两种方式-

  1. dt1 <- data.frame(yr=c(2010,2010,2011,2011), val=c(1500,3000,2000,1100), x=c("a","b","a","b")) dt1$alphayr <- as.factor(ifelse(dt1$yr == "2011", 0.5, 1)) ggplot() + geom_bar(data=dt1, aes(x=yr, y=val, fill=x, alpha=factor(alphayr)), stat="identity") + scale_x_continuous(breaks=dt1$yr) + scale_alpha_manual(values = c("0.5"=0.2, "1"=1), guide='none') 执行此操作时,ttk 几乎像变量一样导入,因此您可以使用 from tkinter import ttk

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

答案 3 :(得分: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

现在工作正常