以下代码在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语句,但在其他地方需要它?
答案 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
,其中包含 Label
、Entry
、 Button
, ... 这就是 python 导入的工作方式。
当您使用 from tkinter import messagebox
时,它会在 messagebox
中查找 tkinter/__init__.py
但找不到它,因此它尝试导入 tkinter/messagebox.py
至于 IDLE 异常,它是 IDLE 中的一个错误,我相信它已被修补。