此import
声明:
from tkinter import *
不会导入tkinter.filedialog
。为什么不呢?
答案 0 :(得分:4)
tkinter
是一个包,在执行from tkinter import *
时,它会导入__init__.py
中为tkinter
包定义的所有名称,以及仅导出模块和子包在__all__
__init__.py
包中的tkinter
中定义。
在我的Python 3.4中,__all__
中没有定义tkinter/__init__.py
,因此它不会从其中导入任何模块(如filedialog
)。
唯一的解决方案是让包作者提供包的显式索引。 import语句使用以下约定:如果包的
__init__.py
代码定义了名为__all__
的列表,则它将被视为遇到包import *时应导入的模块名称列表。< / p>如果未定义
__all__
,则sound.effects import *中的语句不会将包sound.effects中的所有子模块导入当前名称空间;它只确保已导入包sound.effects(可能在__init__.py
中运行任何初始化代码),然后导入包中定义的任何名称。这包括__init__.py
定义的任何名称(以及显式加载的子模块)。
答案 1 :(得分:1)
通常,从from <package> import *
导入的值取决于该程序包的__all__
文件的__init__
列表中指定的值。
无法导入filedialog
表示它未包含在__all__
tkinter
文件的__init__
列表中。
评估包“导出”某些子模块的快速方法是在__all__
之后评估它是否具有import
属性。如果是,它将返回可用的子模块,否则将引发Attribute Error
。
例如,对于像scipy
这样的包:
import scipy
print(scipy.__all__) # prints all contents.