tkinter + interrupts

Eric Brunel eric_brunel at despammed.com
Wed Sep 15 11:41:05 CEST 2004


Ajay wrote:
> hi!
> 
> on my gui, i have a "start server" button and a "stop server" button.
> the problem is "start server" will loop infinitely and respond to requests.
> i'd like to be able to click on "stop server" and get the server to stop.
> 
> how would i go about doing it? i can think of a soln involving threads,
> where i have "start server" in a separate thread and have it continously
> poll a shared variable. but is there another solution not involving
> threads.

It's possible, but it may be a bit weird. All you have to do is return the 
control back to the Tkinter mainloop at regular intervals via the update method 
so that the GUI remains active. Here is an example:

--------------------------------------------------------
import time
from Tkinter import *

root = Tk()

lbl = Label(root, text='Blink')
lbl.pack(side=TOP)

doLoop = 1

def start():
   x = 0
   while doLoop:
     if x:
       lbl.configure(fg='red')
     else:
       lbl.configure(fg='black')
     x = not x
     time.sleep(1)
     root.update()

def stop():
   global doLoop
   doLoop = 0

Button(root, text='Start', command=start).pack(side=LEFT)
Button(root, text='Stop', command=stop).pack(side=LEFT)

root.mainloop()
--------------------------------------------------------

This is a bit weird, since the GUI is not *always* active; it is only once every 
second. So clicking the 'Stop' button may have a one second delay before being 
taken into account.

Also remember that the example above is very simple: in real life, you may not 
have the occasion to call the update method regularly enough. So a solution 
involving threads is sometimes hard to avoid...

HTH
-- 
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com




More information about the Python-list mailing list