Search code examples
python-3.xtkinterpython-idle

I want to embed python console in my tkinter window.. How can i do it?


I am making a text editor and want to add a feature of IDLE in my app. So i want an frame with python IDLE embedded in it with all menus and features which original python IDLE gives.

I looked in source of idle lib but cannot find a solution.

    try:
    import idlelib.pyshell
except ImportError:
    # IDLE is not installed, but maybe pyshell is on sys.path:
    from . import pyshell
    import os
    idledir = os.path.dirname(os.path.abspath(pyshell.__file__))
    if idledir != os.getcwd():
        # We're not in the IDLE directory, help the subprocess find run.py
        pypath = os.environ.get('PYTHONPATH', '')
        if pypath:
            os.environ['PYTHONPATH'] = pypath + ':' + idledir
        else:
            os.environ['PYTHONPATH'] = idledir
    pyshell.main()
else:
    idlelib.pyshell.main()

This code is of pyshell.pyw found under idlelib folder in all python install

I searched the idle.pyw and found that it uses a program pyshell which is real shell. So how can i embed it.

I want a Tkinter frame with python IDLE shell embedded in it.Please give the code. Thanks in advance.


Solution

  • idlelib implements IDLE. While you are free to use it otherwise, it is private in the sense that code and interfaces can change in any release without the usual back-compatibility constraints. Import and use idlelib modules at your own rish.

    Currently, a Shell window is a Toplevel with a Menu and a Frame. The latter has a Text and vertical Scrollbar. It is not possible to visually embed a Toplevel within a frame (or within another Toplevel or root = Tk()). top = Toplevel(myframe) works, but top cannot be placed, packed, or gridded within myframe.

    I hope in the future to refactor editor.py and pyshell.py so as to separate the window with menu from the frame with scrollable text. The result should include embeddable EditorFrame and ShellFrame classes that have parent as an arguments. But that is in the future.

    Currently, one can run IDLE from within python with import idlelib.idle. However, because this runs mainloop() (on its own root), it blocks and does not finish until all IDLE windows are closed. This may not be what one wants.

    If having Shell run in a separate window is acceptable, one could extract from python.main the 10-20 lines needed to just run Shell. Some experimentation would be needed. If the main app uses tkinter, this function should take the app's root as an argument and not call mainloop().