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