6

I have a GUI application written with python+tkinter. In my workflow, I generally start the gui from the commandline, do some things in the gui and then I find myself navigating to other terminal windows to do some work. Inevitably, I want to shut down the GUI at some point, and out of habit I often just navigate to the terminal that started the GUI and send a KeyboardInterrupt (Ctrl-c). However, This interrupt is not recieved until I raise the GUI window in the Window manager. Does anyone know why this happens? If the gui is started in a single function, is there a simple workaround -- multiprocessing maybe?

mgilson
  • 300,191
  • 65
  • 633
  • 696
  • see http://groups.google.com/group/comp.lang.python/browse_frm/thread/714cbada9a364d7e/ebf5db79b469661f?lnk=gst&q=tkinter+signal#ebf5db79b469661f – noob oddy Apr 07 '12 at 06:57
  • @nooboddy -- great find. If you post the link as an answer, we can accept it which might make it easier for someone else looking for the same thing to find. – mgilson Apr 08 '12 at 00:10
  • "Duplicate": https://stackoverflow.com/questions/13784232/tkinter-keyboardinterrupt-taking-a-while – Udi Mar 22 '22 at 15:33

1 Answers1

5

from the newsgroups:

I'm using Python 1.5 under Redhat Linux 5.0. I'm trying to figure out the best way to trap a SIGINT (or Ctrl-C) when using tkinter. To illustrate the problem I have, do the following ...

-- Build Python-1.5 with tkinter enabled.

-- Go into the Demo/tkinter/guido directory under the Python-1.5 build tree.

-- Type "python imageview.py image-file", where "image-file" is the full pathname of a displayable image.

-- Once the image pops up, make sure that the window focus is held by the xterm window from which the "python ..." command was just now invoked.

-- Hit Ctrl-C.

At this point, nothing happens. The Ctrl-C seems to be ignored. But now ...

-- Without hitting any more keys on the keyboard, set the window focus to the displayed image window.

As soon as that window gets the focus, the Ctrl-C takes effect.

My question is this: is there any way to restructure the "imageview.py" program so that it will respond to SIGINT (Ctrl-C) immediately, without having to set the window focus to the displayed image first?

Thanks in advance for any help you folks can give me.
---- What you're seeing is caused by the way signal handlers are handled. You're stuck in the Tcl/Tk main loop, and signal handlers are only handled by the Python interpreter. A quick workaround is to use after() to schedule a dummy function to be called once a second or so -- this will make it appear that your signal is handled in a timely manner.

--Guido van Rossum

Udi
  • 29,222
  • 9
  • 96
  • 129
noob oddy
  • 1,314
  • 8
  • 11