Mercurial > repos > rhope
view editgraph.py @ 121:1af91ceaaf49
Fixed memory leak when an output is only attached to a single null input
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 28 Oct 2010 21:04:12 -0400 |
parents | 0534bb8ee7ad |
children |
line wrap: on
line source
import Tkinter from tkFont import Font class Call(object): def __init__(self, canvas, center, text = None, chars=None, padw = 20, padh = 4, fill="gray", outline="black",selectoutline="red"): x,y = center self.x = x self.y = y self.text = Tkinter.StringVar() self.textlen = 0 if text != None: self.text.set(text) self.textlen = len(text) if chars == None: chars = len(text)+3 elif chars == None: chars = 3 self.textwidget = Tkinter.Entry(canvas, width=chars, textvariable=self.text, font=Font(family="Courier New", size=10)) self.textwidget.bind('<Key>', self.textchanged, '+') self.canvastext = canvas.create_window(x, y, window=self.textwidget) box = canvas.bbox(self.canvastext) self.width = box[2]-box[0]+padw self.height = box[3]-box[1]+padh hw = self.width / 2 hh = self.height / 2 ow = hw+10 self.poly = canvas.create_polygon(x-hw,y-hh, x+hw,y-hh, x+ow,y, x+hw,y+hh, x-hw,y+hh, x-ow,y, fill=fill, outline=outline) self.outline = outline self.selectoutline = selectoutline self.mousex = self.mousey = 0 def hittest(self, x, y): ow = self.width / 2 + 10 hh = self.height / 2 return abs(x-self.x) <= ow and abs(y-self.y) <= hh def onclick(self, x, y): canvas.itemconfig(self.poly, outline=self.selectoutline) self.mousex = x self.mousey = y def lostfocus(self): canvas.itemconfig(self.poly, outline=self.outline) def ondrag(self, x, y): self.x += x-self.mousex self.y += y-self.mousey self.mousex = x self.mousey = y hw = self.width / 2 hh = self.height / 2 ow = hw+10 canvas.coords(self.poly, self.x-hw,self.y-hh, self.x+hw,self.y-hh, self.x+ow,self.y, self.x+hw,self.y+hh, self.x-hw,self.y+hh, self.x-ow,self.y) canvas.coords(self.canvastext, self.x, self.y) def textchanged(self,event): text = self.text.get() newlen = len(text) print text if newlen != self.textlen: print 'length changed' self.textlen = newlen grabbed = None def onclick(event): global grabbed if grabbed != None: grabbed.lostfocus() grabbed = None print "Click" #TODO: Consider using quadtrees for performance for i in range(len(nodes)-1,-1,-1): node = nodes[i] if node.hittest(event.x, event.y): grabbed = node print "Found hit!" node.onclick(event.x, event.y) break def ondrag(event): global grabbed if grabbed != None: grabbed.ondrag(event.x, event.y) def ondoubleclick(event): global nodes nodes.append(Call(canvas, (event.x, event.y))) root = Tkinter.Tk() canvas = Tkinter.Canvas(root, width=302,height=302) nodes = [] nodes.append(Call(canvas, (50,40), "Foo")) canvas.bind('<Button-1>', onclick) canvas.bind('<B1-Motion>', ondrag) canvas.bind('<Double-Button-1>', ondoubleclick) canvas.pack() root.mainloop()