time.sleep() and Tkinter after()?

Hendrik van Rooyen mail at microcorp.co.za
Thu Dec 4 20:05:58 CET 2008


"Davy" <zhu.. at gmail.com> wrote:

> I have used Tkinter after() to do loop update GUI in my previous post.

> And I tried to change after() to time.sleep(), but it seems doesn't
> work at all, the Queue send and receive data properly, but the GUI
> didn't even appear?
> 
> //-----code changed-----
> def draw_canvas_loop(canvas_b):
>     while (True):
>         board = data_queue.get(block = True, timeout=2)

Do you want it to block, or do you want it to time out?

>         print 'get', data_queue.qsize()
>         draw_canvas(board, canvas_b, x, y, block_width, block_height)
>         time.sleep(0.3)

this will make the gui unresponsive for the time

>     ##canvas_b.after(300, lambda:draw_canvas_loop(canvas_b))

and then the control runs off the end of the function.

> So, can I use time.sleep() in GUI application? Or Tkinter scheduler
> just ignore the sleep() function?

time.sleep(sleep_time) will effectively suspend the gui mainloop
(if it is in the mainloop) for the sleep_time, making the gui unresponsive
for that time.  Eschew it here.  Use it in other, non GUI helper threads.

> 
> And if I use after(), will the code form a recursive function call,

only if it is coded that way - yours does not look recursive to me

> and the memory usage will boost as the program goes (I have watched
> the task manager in WinXP and find the python.exe eat more and more
> memory...).

> def draw_canvas_loop(canvas_b):
>     board = data_queue.get(block = True, timeout=1)
>     print 'get', data_queue.qsize()
>     draw_canvas(board, canvas_b, x, y, block_width, block_height)

Here you draw a new canvas object - what has happened to the
previous one? Is it possibly still hanging around? Should you
do something about it?

- Hendrik




More information about the Python-list mailing list