为什么导入tkinter之后,我需要导入tkinter.messagebox但不需要导入tkinter.Tk()?

时间:2019-05-23 05:19:39

标签: python import

出现一个错误:“ AttributeError:模块'tkinter'没有属性'messagebox'”,即使开头已经给出了import tkinter,为什么tkinter.Tk()语句也没有错误?

我发现import语句不像C语言中的#include语句,因此我可以理解,即使我们想使用{{{ 1}}已经给出了,但是令我困惑的是即使我们没有编写类似tkinter.messagebox的东西,import tkinter仍然可以正常工作吗?

tkinter.Tk

2 个答案:

答案 0 :(得分:2)

TL; DR:因为tkinter.messagebox是一个模块,但是tkinter.Tk是一个类。


执行import some_module时,python查找要导入的名为some_module的文件或目录。如果some_module是文件,则执行该文件。如果some_module是目录(即 package ,例如tkinter),则执行some_module/__init__.py。然后,模块包含__init__.py中定义的所有那些变量(类,函数等),没有其他。如果此包中有任何子模块(例如tkinter.messagebox),则python不会自动导入它们。这就是为什么tkinter.messagebox在导入之前不存在的原因。

出于说明目的,tkinter模块的结构如下所示:

tkinter/
    __init__.py
    messagebox.py
    tk.py

__init__.py

from .tk import Tk

tk.py

class Tk:
    ...

使用这样的设置,执行import tkinter将自动导入Tk类并将其用作tkinter.Tk。但是messagebox.py不会自动导入-您必须手动执行。

(PS:如果__init__.py包含代码from . import messagebox,那么就不需要import tkinter.messagebox。)

答案 1 :(得分:1)

tkinter.Tk()函数是tkinter的一部分。但是,messagebox函数是tkinter.messagebox的一部分,而tkintertkinter.Tk()中的另一个模块。这就是为什么tkinter在仅导入tkinter.messagebox的情况下仍可以正常工作,但是from tkinter import messagebox 需要导入消息框模块的原因。

可以在official documentation上找到有关Tkinter模块的更多信息。

您可以通过以下任何一种方式使它工作:

messagebox.showwarning()

然后调用如下函数:

import tkinter.messagebox

或者通过导入类似您在代码中注释掉的内容:

tkinter.messagebox.showwarning()

然后像您一样打电话:

setStatus

我希望这会有所帮助。