为什么 from tkinter import * 不导入 Tkinter 的消息框?

Pas*_*cal 4 python tkinter python-import python-3.x

我正在学习 Python,当我使用 tkinter 尝试一些代码时,我遇到了这个问题:

我使用以下行导入 tkinter 的所有定义:

from tkinter import *
Run Code Online (Sandbox Code Playgroud)

然后我尝试打开一个消息框:

messagebox.showinfo(message='My message')
Run Code Online (Sandbox Code Playgroud)

但是当我运行程序时,如果必须执行这一行,我会收到消息:

Traceback (most recent call last):
  File ...
  ...
NameError: name 'messagebox' is not defined
Run Code Online (Sandbox Code Playgroud)

如果我添加到导入行显式导入消息框:

from tkinter import *
from tkinter import messagebox
Run Code Online (Sandbox Code Playgroud)

它有效,但我不明白我必须添加此导入的原因。

Bra*_*mon 7

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'}]
Run Code Online (Sandbox Code Playgroud)

请注意,tkinter 甚至明确排除了属于types.ModuleType, 的任何内容messagebox。

如果对此类事情有疑问,您可以随时查看 CPython tkinter Python 库本身。

Python 文档的Importing * From a Package包含更多详细信息。