Search code examples
pythontkintermessageboxnameerror

Python tkinter 8.5 import messagebox


The following code runs fine within IDLE, but otherwise I get "NameError: global name 'messagebox' is not defined". However, if I explicitly state from tkinter import messagebox, it runs fine from where ever.

from tkinter import *
from tkinter import ttk 

root = Tk()
mainFrame = ttk.Frame(root)
messagebox.showinfo("My title", "My message", icon="warning", parent=mainFrame)

Why does IDLE not need the explicit import statement but elsewhere it is required?


Solution

  • the messagebox is a separate submodule of tkinter, so simply doing a complete import from tkinter:

    from tkinter import *
    

    doesn't import messagebox

    it has to be explicitly imported like so:

    from tkinter import messagebox
    

    in the same way that ttk has to be imported explicitly

    the reason it works in idle is because idle imports messagebox for its own purposes, and because of the way idle works, its imports are accessible while working in idle