Python tkinter 8.5导入消息框

时间:2014-07-14 13:51:59

标签: python tkinter messagebox nameerror

以下代码在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语句,但在其他地方需要它?

3 个答案:

答案 0 :(得分:8)

消息框是tkinter的一个独立子模块,所以只需从tkinter完全导入:

from tkinter import *

不会导入消息框

必须像这样显式导入:

from tkinter import messagebox

与必须明确导入ttk的方式相同

它在空闲状态下工作的原因是因为空闲导入消息箱用于自己的目的,并且由于空闲的工作方式,它的导入在闲置工作时可以访问

答案 1 :(得分:4)

IDLE是用Python编写的,并使用Tkinter作为GUI,所以看起来你的程序正在使用IDLE本身正在使用的import语句。但是,如果要在IDLE过程之外执行程序,则应明确包含import的{​​{1}}语句。

答案 2 :(得分:0)

messagebox.showinfo 是在 tkinter/showinfo.py 中定义的,但是当您使用 from tkinter import * 时,您只导入 tkinter/__init__.py,其中包含 LabelEntryButton, ... 这就是 python 导入的工作方式。

当您使用 from tkinter import messagebox 时,它会在 messagebox 中查找 tkinter/__init__.py 但找不到它,因此它尝试导入 tkinter/messagebox.py

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