* Tkinter.py
	(Widget): generalized config(); added keys().
	(Canvas): added addtag_xxx and find_xxx functions; generalized
	itemconfig().
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 70e70cd..d21c6f8 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -510,7 +510,17 @@
 		if master.children.has_key(name):
 			 master.children[name].destroy()
 		master.children[name] = self
-	def config(self, cnf={}):
+	def config(self, cnf=None):
+		if cnf is None:
+			cnf = {}
+			for x in self.tk.split(
+				self.tk.call(self._w, 'configure')):
+				cnf[x[0][1:]] = (x[0][1:],) + x[1:]
+			return cnf
+		if type(cnf) == StringType:
+			x = self.tk.split(self.tk.call(
+				self._w, 'configure', '-'+cnf))
+			return (x[0][1:],) + x[1:]
 		for k in cnf.keys():
 			if type(k) == ClassType:
 				k.config(self, cnf[k])
@@ -523,6 +533,9 @@
 		return v[4]
 	def __setitem__(self, key, value):
 		Widget.config(self, {key: value})
+	def keys(self):
+		return map(lambda x: x[0][1:],
+			   self.tk.split(self.tk.call(self._w, 'configure')))
 	def __str__(self):
 		return self._w
 	def destroy(self):
@@ -585,8 +598,22 @@
 		Widget.__init__(self, master, 'canvas', cnf)
 	def addtag(self, *args):
 		self._do('addtag', args)
+	def addtag_above(self, tagOrId):
+		self.addtag('above', tagOrId)
+	def addtag_all(self):
+		self.addtag('all')
+	def addtag_below(self, tagOrId):
+		self.addtag('below', tagOrId)
+	def addtag_closest(self, x, y, halo=None, start=None):
+		self.addtag('closest', x, y, halo, start)
+	def addtag_enclosed(self, x1, y1, x2, y2):
+		self.addtag('enclosed', x1, y1, x2, y2)
+	def addtag_overlapping(self, x1, y1, x2, y2):
+		self.addtag('overlapping', x1, y1, x2, y2)
+	def addtag_withtag(self, tagOrId):
+		self.addtag('withtag', tagOrId)
 	def bbox(self, *args):
-		return self._getints(self._do('bbox', args))
+		return self._getints(self._do('bbox', args)) or None
 	def bind(self, tagOrId, sequence, func, add=''):
 		if add: add='+'
 		name = self._register(func, self._substitute)
@@ -635,6 +662,20 @@
 		self._do('dtag', args)
 	def find(self, *args):
 		return self._getints(self._do('find', args))
+	def find_above(self, tagOrId):
+		return self.find('above', tagOrId)
+	def find_all(self):
+		return self.find('all')
+	def find_below(self, tagOrId):
+		return self.find('below', tagOrId)
+	def find_closest(self, x, y, halo=None, start=None):
+		return self.find('closest', x, y, halo, start)
+	def find_enclosed(self, x1, y1, x2, y2):
+		return self.find('enclosed', x1, y1, x2, y2)
+	def find_overlapping(self, x1, y1, x2, y2):
+		return self.find('overlapping', x1, y1, x2, y2)
+	def find_withtag(self, tagOrId):
+		return self.find('withtag', tagOrId)
 	def focus(self, *args):
 		return self._do('focus', args)
 	def gettags(self, *args):
@@ -647,11 +688,15 @@
 		self._do('insert', args)
 	def itemconfig(self, tagOrId, cnf=None):
 		if cnf is None:
-			return self.tk.split(self._do('itemconfigure',
-						      (tagOrId)))
+			cnf = {}
+			for x in self.tk.split(
+				self._do('itemconfigure', (tagOrId))):
+				cnf[x[0][1:]] = (x[0][1:],) + x[1:]
+			return cnf
 		if type(cnf) == StringType:
-			return self.tk.split(self._do('itemconfigure',
-						      (tagOrId, '-'+cnf,)))
+			x = self.tk.split(self._do('itemconfigure',
+						   (tagOrId, '-'+cnf,)))
+			return (x[0][1:],) + x[1:]
 		self._do('itemconfigure', (tagOrId,) + self._options(cnf))
 	def lower(self, *args):
 		self._do('lower', args)
diff --git a/Lib/tkinter/Tkinter.py b/Lib/tkinter/Tkinter.py
index 70e70cd..d21c6f8 100755
--- a/Lib/tkinter/Tkinter.py
+++ b/Lib/tkinter/Tkinter.py
@@ -510,7 +510,17 @@
 		if master.children.has_key(name):
 			 master.children[name].destroy()
 		master.children[name] = self
-	def config(self, cnf={}):
+	def config(self, cnf=None):
+		if cnf is None:
+			cnf = {}
+			for x in self.tk.split(
+				self.tk.call(self._w, 'configure')):
+				cnf[x[0][1:]] = (x[0][1:],) + x[1:]
+			return cnf
+		if type(cnf) == StringType:
+			x = self.tk.split(self.tk.call(
+				self._w, 'configure', '-'+cnf))
+			return (x[0][1:],) + x[1:]
 		for k in cnf.keys():
 			if type(k) == ClassType:
 				k.config(self, cnf[k])
@@ -523,6 +533,9 @@
 		return v[4]
 	def __setitem__(self, key, value):
 		Widget.config(self, {key: value})
+	def keys(self):
+		return map(lambda x: x[0][1:],
+			   self.tk.split(self.tk.call(self._w, 'configure')))
 	def __str__(self):
 		return self._w
 	def destroy(self):
@@ -585,8 +598,22 @@
 		Widget.__init__(self, master, 'canvas', cnf)
 	def addtag(self, *args):
 		self._do('addtag', args)
+	def addtag_above(self, tagOrId):
+		self.addtag('above', tagOrId)
+	def addtag_all(self):
+		self.addtag('all')
+	def addtag_below(self, tagOrId):
+		self.addtag('below', tagOrId)
+	def addtag_closest(self, x, y, halo=None, start=None):
+		self.addtag('closest', x, y, halo, start)
+	def addtag_enclosed(self, x1, y1, x2, y2):
+		self.addtag('enclosed', x1, y1, x2, y2)
+	def addtag_overlapping(self, x1, y1, x2, y2):
+		self.addtag('overlapping', x1, y1, x2, y2)
+	def addtag_withtag(self, tagOrId):
+		self.addtag('withtag', tagOrId)
 	def bbox(self, *args):
-		return self._getints(self._do('bbox', args))
+		return self._getints(self._do('bbox', args)) or None
 	def bind(self, tagOrId, sequence, func, add=''):
 		if add: add='+'
 		name = self._register(func, self._substitute)
@@ -635,6 +662,20 @@
 		self._do('dtag', args)
 	def find(self, *args):
 		return self._getints(self._do('find', args))
+	def find_above(self, tagOrId):
+		return self.find('above', tagOrId)
+	def find_all(self):
+		return self.find('all')
+	def find_below(self, tagOrId):
+		return self.find('below', tagOrId)
+	def find_closest(self, x, y, halo=None, start=None):
+		return self.find('closest', x, y, halo, start)
+	def find_enclosed(self, x1, y1, x2, y2):
+		return self.find('enclosed', x1, y1, x2, y2)
+	def find_overlapping(self, x1, y1, x2, y2):
+		return self.find('overlapping', x1, y1, x2, y2)
+	def find_withtag(self, tagOrId):
+		return self.find('withtag', tagOrId)
 	def focus(self, *args):
 		return self._do('focus', args)
 	def gettags(self, *args):
@@ -647,11 +688,15 @@
 		self._do('insert', args)
 	def itemconfig(self, tagOrId, cnf=None):
 		if cnf is None:
-			return self.tk.split(self._do('itemconfigure',
-						      (tagOrId)))
+			cnf = {}
+			for x in self.tk.split(
+				self._do('itemconfigure', (tagOrId))):
+				cnf[x[0][1:]] = (x[0][1:],) + x[1:]
+			return cnf
 		if type(cnf) == StringType:
-			return self.tk.split(self._do('itemconfigure',
-						      (tagOrId, '-'+cnf,)))
+			x = self.tk.split(self._do('itemconfigure',
+						   (tagOrId, '-'+cnf,)))
+			return (x[0][1:],) + x[1:]
 		self._do('itemconfigure', (tagOrId,) + self._options(cnf))
 	def lower(self, *args):
 		self._do('lower', args)