为什么从 tkinter 导入 * 不导入 tkinter 的消息框?



我正在学习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.ModuleTypemessagebox属于该内容。

当对这类事情有疑问时,您可以随时查看CPython tkinter Python lib本身。

Python 文档的 从包导入 * 包含更多详细信息。

最新更新