Tkinter weirdness item count

Martin Franklin mfranklin1 at gatwick.westerngeco.slb.com
Tue May 3 05:45:27 EDT 2005


phil wrote:
> Using Tkinter Canvas to teach High School Geometry
> with A LOT of success.
> 
> My drawing gets very slow after a lot of actions.
> 
> For instance I have created code to rotate a set of objects
> about a rotation point.
> rotate 360 degrees starts to get slow
> after 720 degrees its crawling.
> 
> I checked the item list with with find_all: IT GROWS!
> 
> OK, I create 3 lines using a line Class I created.
> When I rotate these 3 lines thru 360 degrees it creates
> 360 lines times 3. But each new instance of line REPLACES
> the old instance.  The line class has a destructor to delete
> the drawn object.
> 
> class line:
>     count = 0
>     def __init__(s,glob,argl,color=''):
>         line.count = line.count + 1
>             ##
>             ## buncha code here
>             ##
>         s.obj = glob.can.create_line(x0,y0,x1,y1,
>                     width=glob.width,fill=s.color)
>     def __del__(s):
>         line.count = line.count - 1
>     
>             ## delete the line object if the
>         ## class instance is deleted
>             s.glob.can.delete(s.obj)
> 
> 
> After the rotation I check line.count and it is 3
> But find_all returns a tuple ofover 1000 items.
> The drawn objects are not being deleted.
> Which is kinda weird because the rotation works.
> That is they appear to be deleted.
> 
> Is find_all() fooling me?
> Is this the reason drawing slows down? Is it refreshing
> invisible objects?
> 
> This slowing down also occurs when I draw a lot of objects.
> Lets say I draw a sine wave, say 1000 individual points.
> If I draw 4 or 5 sine waves it gets really slow.
> 
> I should mention I call update() after each drawing action.
> This is necessary for the students to watch the progress.
> I might be drawing objects in a lengthy loop and without
> update() they only appear at the end of the loop.
> 
> Thanks for any help.
> 
> -- Confused
> 
> 


Phil,

I seem to remember a thread a while ago about a 'bug' with the Tk Canvas
widget keeping a reference to objects that had been deleted...

Have you thought about using the 'move' method to move your lines?  I 
think this will result in less supprises...


pydoc Tkinter.Canvas

<snip>

  |  move(self, *args)
  |      Move an item TAGORID given in ARGS.
  |

<snip>

You could even make it a method of your line class

Martin














More information about the Python-list mailing list