view editgraph.py @ 189:d0e3a13c1bd9 default tip

Remove old calculator example
author Mike Pavone <pavone@retrodev.com>
date Fri, 07 Oct 2011 00:24:04 -0700
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()