Python tkinter 8.5导入消息框



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

消息框是tkinter的一个单独的子模块,所以简单地从tkinter进行完整的导入:

from tkinter import *

不导入messagebox

必须像这样显式导入:

from tkinter import messagebox

就像TTK必须显式导入

一样

它在空闲状态下工作的原因是因为idle为自己的目的导入消息框,并且由于idle的工作方式,它的导入在空闲

中工作时是可访问的

IDLE是用Python编写的,并使用Tkinter作为GUI,因此看起来您的程序正在使用IDLE本身正在使用的import语句。但是,如果您希望在IDLE进程之外执行程序,则应该显式地为messagebox包含import语句。

messagebox.showinfotkinter/showinfo.py内定义,但当您使用from tkinter import *时,您只导入tkinter/__init__.py,其中包含Label, Entry, Button,…这就是python导入的工作原理。

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

关于IDLE异常,这是IDLE的一个bug,我相信它已经被修补了

最新更新