Python tkinter 8.5 导入 messagebox
下面的代码在IDLE里运行得很好,但在其他地方我会遇到“NameError: global name 'messagebox' is not defined”的错误。不过,如果我明确写上 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里不需要明确的导入语句,而在其他地方却需要呢?
3 个回答
messagebox.showinfo
是在 tkinter/showinfo.py
文件里定义的,但当你使用 from tkinter import *
时,你只会导入 tkinter/__init__.py
这个文件,而这个文件里包含了 Label
、Entry
、Button
等的定义。这就是 Python 导入的工作原理。
当你使用 from tkinter import messagebox
时,Python 会在 tkinter/__init__.py
文件里查找 messagebox
,但找不到,所以它会尝试去导入 tkinter/messagebox.py
。
至于 IDLE 的异常情况,那是 IDLE 的一个 bug,我相信这个问题已经修复了。
IDLE是用Python写的,它的界面是用Tkinter做的。所以看起来你的程序在使用IDLE本身用的那些import
语句。不过,如果你想在IDLE以外的地方运行你的程序,记得要明确地加上import
语句来引入messagebox
。
消息框是tkinter的一个独立小模块,所以如果你直接从tkinter完整导入:
from tkinter import *
是不会导入消息框的。
你需要像这样明确地导入它:
from tkinter import messagebox
就像ttk也需要明确导入一样。
在IDLE中之所以能用消息框,是因为IDLE为了自己的需要已经导入了消息框,而且由于IDLE的工作方式,它的导入内容在使用IDLE时是可以访问的。