Python tkinter 8.5 导入 messagebox

2 投票
3 回答
4600 浏览
提问于 2025-04-18 13:14

下面的代码在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 个回答

1

messagebox.showinfo 是在 tkinter/showinfo.py 文件里定义的,但当你使用 from tkinter import * 时,你只会导入 tkinter/__init__.py 这个文件,而这个文件里包含了 LabelEntryButton 等的定义。这就是 Python 导入的工作原理。

当你使用 from tkinter import messagebox 时,Python 会在 tkinter/__init__.py 文件里查找 messagebox,但找不到,所以它会尝试去导入 tkinter/messagebox.py

至于 IDLE 的异常情况,那是 IDLE 的一个 bug,我相信这个问题已经修复了。

5

IDLE是用Python写的,它的界面是用Tkinter做的。所以看起来你的程序在使用IDLE本身用的那些import语句。不过,如果你想在IDLE以外的地方运行你的程序,记得要明确地加上import语句来引入messagebox

10

消息框是tkinter的一个独立小模块,所以如果你直接从tkinter完整导入:

from tkinter import *

是不会导入消息框的。

你需要像这样明确地导入它:

from tkinter import messagebox

就像ttk也需要明确导入一样。

在IDLE中之所以能用消息框,是因为IDLE为了自己的需要已经导入了消息框,而且由于IDLE的工作方式,它的导入内容在使用IDLE时是可以访问的。

撰写回答