Python tkinter 8.5导入messagebox

Python tkinter 8.5导入messagebox,python,tkinter,messagebox,nameerror,Python,Tkinter,Messagebox,Nameerror,以下代码在IDLE中运行良好,但在其他情况下,我得到“NameError:未定义全局名称'messagebox'。但是,如果我从tkinter import messagebox显式声明,它在任何地方都可以正常运行 from tkinter import * from tkinter import ttk root = Tk() mainFrame = ttk.Frame(root) messagebox.showinfo("My title", "My message", icon="wa

以下代码在IDLE中运行良好,但在其他情况下,我得到“NameError:未定义全局名称'messagebox'。但是,如果我从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不需要显式导入语句,但在其他地方需要它?

IDLE是用Python编写的,并且在GUI中使用Tkinter,因此看起来您的程序正在使用IDLE本身使用的
import
语句。但是,如果要在空闲进程之外执行程序,则应明确包含
import
语句,用于
messagebox

messagebox是tkinter的一个单独子模块,因此只需从tkinter执行完整的导入:

from tkinter import *
不导入messagebox

它必须像这样显式导入:

from tkinter import messagebox
与ttk必须显式导入的方式相同


它在idle中工作的原因是因为idle为自己的目的导入messagebox,并且因为idle的工作方式,当在空闲状态下工作时,其导入是可访问的。showinfo
tkinter/showinfo.py
中定义,但是当您使用来自tkinter import*的
时,您只导入
tkinter/uuu init_uuu.py
,其中包含
标签
条目
按钮
。。。这就是python导入的工作方式

当您从tkinter导入messagebox使用
时,它会在
tkinter/\uuu init\uuuuuuuuuuuuuuuupy
中查找
messagebox
,但找不到它,因此它会尝试导入
tkinter/messagebox.py


至于IDLE异常,它是IDLE中的一个bug,我相信它已经被修补。

IDLE是一个tkinter程序,因此它有自己的导入和根。用空闲的tkinter编程是个坏主意。为了避免越轨行为,最好在控制台中进行。这是有道理的。回答得好。