我正在学习Python,当我尝试使用tkinter编写一些代码时,我遇到了这个问题:
我用以下行导入 tkinter 的所有定义:
from tkinter import *
然后我尝试打开一个消息框:
messagebox.showinfo(message='My message')
但是当我运行程序时,如果必须执行这一行,我会收到以下消息:
Traceback (most recent call last):
File ...
...
NameError: name 'messagebox' is not defined
如果我在导入行中添加消息框的显式导入:
from tkinter import *
from tkinter import messagebox
它有效,但我不明白为什么我必须添加此导入。
messagebox
是一个模块,例如messagebox.py
.当您from tkinter import *
时,这不会自动导入到命名空间中。自动导入的内容是tkinter.__init__
定义为__all__
:
__all__ = [name for name, obj in globals().items()
if not name.startswith('_') and not isinstance(obj, types.ModuleType)
and name not in {'wantobjects'}]
请注意,tkinter 甚至明确排除了任何types.ModuleType
,messagebox
属于该内容。
当对这类事情有疑问时,您可以随时查看CPython tkinter Python lib本身。
Python 文档的 从包导入 * 包含更多详细信息。