考虑这个简单的代码:
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
答案 0 :(得分:4)
执行import X
时,您将导入名为X
的模块。从现在开始,X
将被定义。
执行from X import *
时,您不导入X
,您只导入X
内 内的内容}。 X
本身将是未定义的。
因此,当您执行from tkinter.ttk import *
时,您没有导入ttk
,而只是在 ttk中导入中的内容。这将导入Label
,Button
等内容,但不 ttk
本身。
在python3中导入ttk
的正确方法是使用以下语句:
from tkinter import ttk
有了这个,您可以使用ttk.Label
引用ttk标签,将{ttk按钮引用为ttk.Button
等等。
注意:执行from tkinter.ttk import *
很危险。不幸的是,ttk
和tkinter
都导出了具有相同名称的类。如果您同时执行from tkinter import *
和from tkinter.ttk import *
,则将覆盖另一个类。导入的顺序将改变代码的行为方式。
出于这个原因 - 特别是在tkinter和ttk的情况下,每个都有几个重叠的类 - 应该避免使用通配符导入。官方python样式指南PEP8正式阻止了通配符导入:
应该避免使用通配符导入(来自import *),因为它们不清楚命名空间中存在哪些名称,这会使读者和许多自动化工具混淆。
注意:你的问题意味着你正在使用python 3,但是如果你使用的是python 2,你可以只做import ttk
而不是from tkinter import ttk
。 ttk
在python 3中移动。
答案 1 :(得分:1)
要导入ttk
,请替换以下行:
from tkinter.ttk import *
使用:
from tkinter import ttk
否则,tkinter.ttk
模块的属性将被加载到当前模块名称空间而不是ttk
本身。
答案 2 :(得分:1)
导入ttk模块时,有两种方式-
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
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
现在工作正常