14

I have a python script that uses plt.show() as it's last instruction. When it runs, IDLE just hangs after the last instruction. I get the image but I don't get the prompt back.

On other scripts I typically use ctrl-c to break the program (sometimes doesn't work immediately) but how do I get the prompt back with the plt.show()? Ctrl-c doesn't work...

Are there other ways to stop the program?

This is IDLE on Windows, if it makes any difference.

greye
  • 8,921
  • 12
  • 41
  • 46

4 Answers4

7

Ctrl+F6 (Restart shell)

or Shell->Restart Shell

hexicle
  • 2,121
  • 2
  • 24
  • 31
7

I have seen this problem with IDLE and matplotlib when using them on Windows. I don't know the exact cause, but Ctrl-c a couple times has typically worked for me. If that doesn't work for you, you can use the normal interpreter instead of write your plot directly to a file instead of the screen.

This is one of those (plentiful) times when IDLE doesn't behave like a normal Python script or interpreter session. Because of this, I usually avoid IDLE.

Mike Graham
  • 73,987
  • 14
  • 101
  • 130
  • Unfortunately, the options on Windows aren't great. I use the interactive interpreter directly (despite cmd.exe not being all that nice) and call Python from gvim to run scripts. Any number of editors and IDEs can call Python directly, and many of them are listed on http://wiki.python.org/moin/IntegratedDevelopmentEnvironments . iPython can suffer from some of the same problems of IDLE, but I suspect it goes out of its way to make matplotlib work (I never use it myself, so I can't promise so). – Mike Graham Mar 17 '10 at 07:39
  • When one presses ^C in IDLE's Shell, the Shell sends a message to the execution process to raise interrupt there. Most of the time when that fails, it it would have failed if one had hit ^C while running directly under Python. There are reasons completely independent of IDLE why Python cannot always gracefully stop and emit a >>> prompt upon a ^C interrupt signal. – Terry Jan Reedy Jul 18 '18 at 23:07
2

I had same issue in Canopy Python Editor, and I was able to interrupt python session with CTRL+. ("dot" button). Hope that helps, or they probably do things in a similar ways

Stas Prihod'co
  • 864
  • 9
  • 13
2

When you use plt.show(), the python subprocess enters the GUI toolkit's event loop and blocks until the event loop exits. When it exits, you get the prompt back.

If you are using the TkAgg backend, you'll need to move your mouse over a figure after you press Ctrl+C. That will cause the event loop to stop. (Tkinter has its quirks)

Alternatively, IdleX offers Matplotlib support with IDLE using the EventLoop.py extension. You can display and interact with figures without using plt.show(). Just be sure to set plt.interactive(True) before generating figures.

Roger
  • 951
  • 8
  • 6