Detect events positively

Gustavo Cordova gcordova at hebmex.com
Fri Jun 7 18:52:53 CEST 2002


> 
> Hello,
> 
> The following code display two button:
> 
> from Tkinter import *
> def Calculate(event = None):
>         while 1:
>                 pass

This loop will never exit, hence, will never
return control to Tkinter (and your GUI).

> def Exit(event = None):
>         import sys
>         sys.exit(0)
> root = Tk()
> btn_cal = Button(root, text="calculate", command = Calculate)
> btn_cal.pack()
> btn_exit = Button(root, text="exit", command = Exit)
> btn_exit.pack()
> root.mainloop()
> 
> if clicked the "calculate" button, the program will fall in a 
> loop that will never end. So program will not response to clicking
> to the "exit" button, so it cannot be terminated normally. If we
> don't use multithread, can we add some code in the loop of the
> function Calculate to let it exit the loop after the user clicks
> the "exit" button or press a "Esc" key?
> 

Well, you're little program is doing what you asked
it to do, :-)

You can use some multithreading, like:

# This function does all the hard work.
def Do_Calculations():
   do_lotsa_calculations()
   save_results_somewhere()
   set_finished_flag()
   raise SystemExit()

def Calculate(event=None):
   if calculation_thread_not_set():
      import thread
      set_calculation_thread_flag()
      thread.start_new_thread(Do_Calculations, (,))

Now the calculations are done independantly from the GUI
management thread; this is good. But, you should NOT DO ANY
GUI MANIPULATION from the thread doing the calculations,
because Tkinter WILL CRASH AND BURN. Hence, the set_finished_flag()
thing, where you inform the main thread by any means you
like that the calculations are done; that flag can be
picked up by your main thread, which can update the GUI.

Good luck :-)

> Many thanks from, 
> Xiao-Qin Xia
> 

-gustavo





More information about the Python-list mailing list