python-3.xtkinterpycharmmessagebox

Python 3 tkinter Pycharm - error on messagebox


I'm writing a GUI and I say:

from tkinter import *

Further in the program there's a function which is:

def nameFunc():
    messagebox.showinfo(........)

The problem is that by running the code in the latest Pycharm, it tells me that messagebox is not defined even if I already imported everything from tkinter, it only works if I explicitly say:

from tkinter import messagebox

This only occurs when I run the code on Pycharm, in the standard python IDLE it's fine.

Why?


Solution

  • PyCharm is behaving exactly as it should, if you take a look at the documentation on packages:

    what happens when the user writes from sound.effects import *? Ideally, one would hope that this somehow goes out to the filesystem, finds which submodules are present in the package, and imports them all. This could take a long time and importing sub-modules might have unwanted side-effects that should only happen when the sub-module is explicitly imported.

    The only solution is for the package author to provide an explicit index of the package. The import statement uses the following convention: if a package’s __init__.py code defines a list named __all__, it is taken to be the list of module names that should be imported when from package import * is encountered.

    tkinter does not define a __all__ to automatically import submodules and you should be glad it doesn't import them all automatically:

    import tkinter.__main__
    
    print("this will only print after you close the test window")
    

    the program only continues to run after a window pops up with the current tcl/Tk version and some other content is closed, to import submodules of the package you must explicitly import them with:

    from tkinter import messagebox
    

    however as I describe in my other answer here, because of how IDLE is built it has already loaded some of the submodules when your code is being executed in the idle Shell.