执行from tkinter import *
后,为什么ttk
未定义? *
是什么意思?
>>> from tkinter import *
>>> root = Tk()
>>> asd = ttk.Treeview(root)
Traceback (most recent call last):
File <"pyshell#4">, line 1, in <module>
asd = ttk.Treeview(root)
NameError: name 'ttk' is not defined
如果我from tkinter import ttk
,那就没问题了。使用*
时,必须已获取ttk
。那为什么会有错误?
答案 0 :(得分:1)
下面的内容只是详细阐述jonrsharpe我认为可以回答这个问题的好评。
Python from package import *
看起来确实看起来像是从所述包中导入所有,但情况并非如此。 The docs说:
import语句使用以下约定:如果是包
__init__.py
代码定义了一个名为__all__
的列表,它被视为从包导入时应导入的模块名称列表 *遇到了。
因此,如果包目录中有__init__.py
文件(必须这样,否则它不会被导入),并且它包含一个名为__all__
的列表而不是此列表&# 39; s内容被视为模块名称,以便导入调用模块的命名空间。
如果__all__
中未定义__init__.py
变量会怎样?从文档中解释另一段:
如果未定义
__all__
,则语句from package import *
不会将包中的所有子模块导入到 当前命名空间它只能确保包装 已导入(可能正在运行任何初始化代码)__init__.py
)然后导入包中定义的任何名称。这包括定义的任何名称(和子模块 由__init__.py
加载)。它还包括包的任何子模块 由先前的import语句显式加载的。
如果你想要一个很好的例子来理解这一点至关重要,请转到video #20在Derek Banas's excellent Python YT series.中使用TkInter介绍GUI编程
答案 1 :(得分:0)
官方python documentation揭示答案
你可以做
from tkinter import *
from tkinter.ttk import *
或者
from tkinter import *
第二种方法用ttk版本覆盖'原始'tkinter小部件。因此,只需执行self.indicatorStyle
即表示您要使用“原始”小部件。