出现一个错误:“ AttributeError:模块'tkinter'没有属性'messagebox'”,即使开头已经给出了import tkinter
,为什么tkinter.Tk()
语句也没有错误?
我发现import
语句不像C语言中的#include
语句,因此我可以理解,即使我们想使用{{{ 1}}已经给出了,但是令我困惑的是即使我们没有编写类似tkinter.messagebox
的东西,import tkinter
仍然可以正常工作吗?
tkinter.Tk
答案 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
的一部分,而tkinter
是tkinter.Tk()
中的另一个模块。这就是为什么tkinter
在仅导入tkinter.messagebox
的情况下仍可以正常工作,但是from tkinter import messagebox
需要导入消息框模块的原因。
可以在official documentation上找到有关Tkinter模块的更多信息。
您可以通过以下任何一种方式使它工作:
messagebox.showwarning()
然后调用如下函数:
import tkinter.messagebox
或者通过导入类似您在代码中注释掉的内容:
tkinter.messagebox.showwarning()
然后像您一样打电话:
setStatus
我希望这会有所帮助。