move constants to Tkconstants; added some; overridable error reporting; fix typo in propagate
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 914c603..abe8f82 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -3,6 +3,7 @@
 import tkinter
 from tkinter import TclError
 from types import *
+from Tkconstants import *
 
 CallableTypes = (FunctionType, MethodType,
 		 BuiltinFunctionType, BuiltinMethodType)
@@ -12,64 +13,6 @@
 if TkVersion < 4.0:
     raise ImportError, "This version of Tkinter.py requires Tk 4.0 or higher"
 
-# Symbolic constants
-
-# Booleans
-NO=FALSE=OFF=0
-YES=TRUE=ON=1
-
-# -anchor
-N='n'
-S='s'
-W='w'
-E='e'
-NW='nw'
-SW='sw'
-NE='ne'
-SE='se'
-CENTER='center'
-
-# -fill
-NONE='none'
-X='x'
-Y='y'
-BOTH='both'
-
-# -side
-LEFT='left'
-TOP='top'
-RIGHT='right'
-BOTTOM='bottom'
-
-# -relief
-RAISED='raised'
-SUNKEN='sunken'
-FLAT='flat'
-RIDGE='ridge'
-GROOVE='groove'
-
-# -orient
-HORIZONTAL='horizontal'
-VERTICAL='vertical'
-
-# -tabs
-NUMERIC='numeric'
-
-# -wrap
-CHAR='char'
-WORD='word'
-
-# -align
-BASELINE='baseline'
-
-# Special tags, marks and insert positions
-SEL='sel'
-SEL_FIRST='sel.first'
-SEL_LAST='sel.last'
-END='end'
-INSERT='insert'
-CURRENT='current'
-ANCHOR='anchor'
 
 def _flatten(tuple):
 	res = ()
@@ -461,6 +404,7 @@
 			cnf = _cnfmerge(cnf)
 		res = ()
 		for k, v in cnf.items():
+			if k[-1] == '_': k = k[:-1]
 			if type(v) in CallableTypes:
 				v = self._register(v)
 			res = res + ('-'+k, v)
@@ -481,13 +425,13 @@
 			name = tail
 		return w
 	def _register(self, func, subst=None):
-		f = _CallSafely(func, subst).__call__
+		f = CallWrapper(func, subst, self).__call__
 		name = `id(f)`
 		if hasattr(func, 'im_func'):
 			func = func.im_func
-		if hasattr(func, 'func_name') and \
-		   type(func.func_name) == type(''):
-			name = name + func.func_name
+		if hasattr(func, '__name__') and \
+		   type(func.__name__) == type(''):
+			name = name + func.__name__
 		self.tk.createcommand(name, f)
 		return name
 	register = _register
@@ -525,25 +469,26 @@
 		e.x_root = tk.getint(X)
 		e.y_root = tk.getint(Y)
 		return (e,)
+	def _report_exception(self):
+		import sys
+		exc, val, tb = sys.exc_type, sys.exc_value, sys.exc_traceback
+		root = self._root()
+		root.report_callback_exception(exc, val, tb)
 
-class _CallSafely:
-	def __init__(self, func, subst=None):
+class CallWrapper:
+	def __init__(self, func, subst, widget):
 		self.func = func
 		self.subst = subst
+		self.widget = widget
 	def __call__(self, *args):
-		if self.subst:
-			args = self.apply_func(self.subst, args)
-		args = self.apply_func(self.func, args)
-	def apply_func(self, func, args):
-		import sys
 		try:
-			return apply(func, args)
+			if self.subst:
+				args = apply(self.subst, args)
+			return apply(self.func, args)
 		except SystemExit, msg:
 			raise SystemExit, msg
 		except:
-			import traceback
-			print "Exception in Tkinter callback"
-			traceback.print_exc()
+			self.widget._report_exception()
 
 class Wm:
 	def aspect(self, 
@@ -618,6 +563,7 @@
 class Tk(Misc, Wm):
 	_w = '.'
 	def __init__(self, screenName=None, baseName=None, className='Tk'):
+		global _default_root
 		self.master = None
 		self.children = {}
 		if baseName is None:
@@ -628,6 +574,8 @@
 		self.tk.createcommand('tkerror', _tkerror)
 		self.tk.createcommand('exit', _exit)
 		self.readprofile(baseName, className)
+		if not _default_root:
+			_default_root = self
 	def destroy(self):
 		for c in self.children.values(): c.destroy()
 		self.tk.call('destroy', self._w)
@@ -657,6 +605,10 @@
 		if os.path.isfile(base_py):
 			print 'execfile', `base_py`
 			execfile(base_py, dir)
+	def report_callback_exception(self, exc, val, tb):
+		import traceback
+		print "Exception in Tkinter callback"
+		traceback.print_exception(exc, val, tb)
 
 class Pack:
 	def config(self, cnf={}, **kw):
@@ -682,7 +634,7 @@
 	info = newinfo
 	_noarg_ = ['_noarg_']
 	def propagate(self, flag=_noarg_):
-		if boolean is Pack._noarg_:
+		if flag is Pack._noarg_:
 			return self._getboolean(self.tk.call(
 				'pack', 'propagate', self._w))
 		else: