以下代码在IDLE中运行良好,但否则我得到"NameError:全局名称'messagebox'未定义"。然而,如果我显式地声明from tkinter import messagebox
,它在任何地方都可以正常运行。
from tkinter import *
from tkinter import ttk
root = Tk()
mainFrame = ttk.Frame(root)
messagebox.showinfo("My title", "My message", icon="warning", parent=mainFrame)
为什么IDLE不需要显式的import语句,而在其他地方需要?
消息框是tkinter的一个单独的子模块,所以简单地从tkinter进行完整的导入:
from tkinter import *
不导入messagebox
必须像这样显式导入:
from tkinter import messagebox
就像TTK必须显式导入
一样它在空闲状态下工作的原因是因为idle为自己的目的导入消息框,并且由于idle的工作方式,它的导入在空闲
IDLE是用Python编写的,并使用Tkinter作为GUI,因此看起来您的程序正在使用IDLE本身正在使用的import
语句。但是,如果您希望在IDLE进程之外执行程序,则应该显式地为messagebox
包含import
语句。
messagebox.showinfo
在tkinter/showinfo.py
内定义,但当您使用from tkinter import *
时,您只导入tkinter/__init__.py
,其中包含Label
, Entry
, Button
,…这就是python导入的工作原理。
当你使用from tkinter import messagebox
时,它会在tkinter/__init__.py
中查找messagebox
但是找不到,所以它会尝试导入tkinter/messagebox.py
关于IDLE异常,这是IDLE的一个bug,我相信它已经被修补了