为什么 from tkinter import * 不导入 Tkinter 的消息框?
Why does from tkinter import * not import Tkinter's messagebox?
我正在学习 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
是一个 module, e.g. messagebox.py
. This is not automatically imported into the namespace when you from tkinter import *
. What is automatically imported is what tkinter.__init__
defines as __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
的任何内容。
当对这类事情有疑问时,您可以随时check out the CPython tkinter Python lib itself。
Python 文档的 Importing * From a Package 包含更多详细信息。
我正在学习 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
是一个 module, e.g. messagebox.py
. This is not automatically imported into the namespace when you from tkinter import *
. What is automatically imported is what tkinter.__init__
defines as __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
的任何内容。
当对这类事情有疑问时,您可以随时check out the CPython tkinter Python lib itself。
Python 文档的 Importing * From a Package 包含更多详细信息。