Tk 4.0 and Tcl 7.4 are now standard
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 2e3ff89..066dfe3 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -3,19 +3,14 @@
 import tkinter
 from tkinter import TclError
 from types import *
-CallableTypes = (FunctionType, MethodType,
-		 BuiltinFunctionType, BuiltinMethodType,
-		 ClassType, InstanceType)
 
-# Older versions of tkinter don't define these variables
-try:
-	TkVersion = eval(tkinter.TK_VERSION)
-except AttributeError:
-	TkVersion = 3.6
-try:
-	TclVersion = eval(tkinter.TCL_VERSION)
-except AttributeError:
-	TclVersion = 7.3
+CallableTypes = (FunctionType, MethodType,
+		 BuiltinFunctionType, BuiltinMethodType)
+
+TkVersion = eval(tkinter.TK_VERSION)
+TclVersion = eval(tkinter.TCL_VERSION)
+if TkVersion < 4.0:
+    raise ImportError, "This version of Tkinter.py requires Tk 4.0 or higher"
 
 def _flatten(tuple):
 	res = ()
@@ -27,15 +22,45 @@
 	return res
 
 def _cnfmerge(cnfs):
-	if type(cnfs) in (NoneType, DictionaryType, StringType):
+	if type(cnfs) is DictionaryType:
+		_fixgeometry(cnfs)
+		return cnfs
+	elif type(cnfs) in (NoneType, StringType):
+		
 		return cnfs
 	else:
 		cnf = {}
 		for c in _flatten(cnfs):
+			_fixgeometry(c)
 			for k, v in c.items():
 				cnf[k] = v
 		return cnf
 
+if TkVersion >= 4.0:
+	_fixg_warning = "Warning: patched up pre-Tk-4.0 geometry option\n"
+	def _fixgeometry(c):
+		if c.has_key('geometry'):
+			wh = _parsegeometry(c['geometry'])
+			if wh:
+				# Print warning message -- once
+				global _fixg_warning
+				if _fixg_warning:
+					import sys
+					sys.stderr.write(_fixg_warning)
+					_fixg_warning = None
+				w, h = wh
+				c['width'] = w
+				c['height'] = h
+				del c['geometry']
+	def _parsegeometry(s):
+		from string import splitfields
+		fields = splitfields(s, 'x')
+		if len(fields) == 2:
+			return tuple(fields)
+		# else: return None
+else:
+	def _fixgeometry(c): pass
+
 class Event:
 	pass
 
@@ -322,23 +347,36 @@
 		self.tk.call('update')
 	def update_idletasks(self):
 		self.tk.call('update', 'idletasks')
+	def bind(self, sequence, func=None, add=''):
+		if add: add = '+'
+		if func:
+		    name = self._register(func, self._substitute)
+		    self.tk.call('bind', self._w, sequence, 
+				 (add + name,) + self._subst_format)
+		else:
+		    return self.tk.call('bind', self._w, sequence)
 	def unbind(self, sequence):
 		self.tk.call('bind', self._w, sequence, '')
-	def bind(self, sequence, func, add=''):
+	def bind_all(self, sequence, func=None, add=''):
 		if add: add = '+'
-		name = self._register(func, self._substitute)
-		self.tk.call('bind', self._w, sequence, 
-			     (add + name,) + self._subst_format)
-	def bind_all(self, sequence, func, add=''):
+		if func:
+		    name = self._register(func, self._substitute)
+		    self.tk.call('bind', 'all' , sequence, 
+				 (add + name,) + self._subst_format)
+		else:
+		    return self.tk.call('bind', 'all', sequence)
+	def unbind_all(self, sequence):
+		self.tk.call('bind', 'all' , sequence, '')
+	def bind_class(self, className, sequence, func=None, add=''):
 		if add: add = '+'
-		name = self._register(func, self._substitute)
-		self.tk.call('bind', 'all' , sequence, 
-			     (add + name,) + self._subst_format)
-	def bind_class(self, className, sequence, func, add=''):
-		if add: add = '+'
-		name = self._register(func, self._substitute)
-		self.tk.call('bind', className , sequence, 
-			     (add + name,) + self._subst_format)
+		if func:
+		    name = self._register(func, self._substitute)
+		    self.tk.call('bind', className , sequence, 
+				 (add + name,) + self._subst_format)
+		else:
+		    return self.tk.call('bind', className, sequence)
+	def unbind_class(self, className, sequence):
+		self.tk.call('bind', className , sequence, '')
 	def mainloop(self):
 		self.tk.mainloop()
 	def quit(self):
@@ -620,7 +658,9 @@
 		else:
 			name = `id(self)`
 		self._name = name
-		if master._w=='.':
+		if self.widgetName=='photo':
+			self._w=name
+		elif master._w=='.':
 			self._w = '.' + name
 		else:
 			self._w = master._w + '.' + name
@@ -630,9 +670,12 @@
 		self.master.children[self._name] = self
 	def __init__(self, master, widgetName, cnf={}, extra=()):
 		cnf = _cnfmerge(cnf)
-		Widget._setup(self, master, cnf)
 		self.widgetName = widgetName
-		apply(self.tk.call, (widgetName, self._w) + extra)
+		Widget._setup(self, master, cnf)
+		extra1=()
+		if widgetName=='photo':
+			extra1=('image', 'create')
+		apply(self.tk.call, extra1+(widgetName, self._w)+extra)
 		if cnf:
 			Widget.config(self, cnf)
 	def config(self, cnf=None):
@@ -654,6 +697,8 @@
 		apply(self.tk.call, (self._w, 'configure')
 		      + self._options(cnf))
 	def __getitem__(self, key):
+		if TkVersion >= 4.0:
+			return self.tk.call(self._w, 'cget', '-' + key)
 		v = self.tk.splitlist(self.tk.call(
 			self._w, 'configure', '-' + key))
 		return v[4]
@@ -670,7 +715,9 @@
 			del self.master.children[self._name]
 		self.tk.call('destroy', self._w)
 	def _do(self, name, args=()):
-		return apply(self.tk.call, (self._w, name) + args) 
+		return apply(self.tk.call, (self._w, name) + args)
+	def unbind_class(self, seq):
+	    Misc.unbind_class(self, self.widgetName, seq)
 
 class Toplevel(Widget, Wm):
 	def __init__(self, master=None, cnf={}):
@@ -689,14 +736,14 @@
 class Button(Widget):
 	def __init__(self, master=None, cnf={}):
 		Widget.__init__(self, master, 'button', cnf)
-	def tk_butEnter(self, *dummy):
-		self.tk.call('tk_butEnter', self._w)
-	def tk_butLeave(self, *dummy):
-		self.tk.call('tk_butLeave', self._w)
-	def tk_butDown(self, *dummy):
-		self.tk.call('tk_butDown', self._w)
-	def tk_butUp(self, *dummy):
-		self.tk.call('tk_butUp', self._w)
+	def tkButtonEnter(self, *dummy):
+		self.tk.call('tkButtonEnter', self._w)
+	def tkButtonLeave(self, *dummy):
+		self.tk.call('tkButtonLeave', self._w)
+	def tkButtonDown(self, *dummy):
+		self.tk.call('tkButtonDown', self._w)
+	def tkButtonUp(self, *dummy):
+		self.tk.call('tkButtonUp', self._w)
 	def flash(self):
 		self.tk.call(self._w, 'flash')
 	def invoke(self):
@@ -749,10 +796,10 @@
 		self.tk.call(self._w, 'bind', tagOrId, sequence, 
 			     (add + name,) + self._subst_format)
 	def canvasx(self, screenx, gridspacing=None):
-		return self.tk.getint(self.tk.call(
+		return self.tk.getdouble(self.tk.call(
 			self._w, 'canvasx', screenx, gridspacing))
 	def canvasy(self, screeny, gridspacing=None):
-		return self.tk.getint(self.tk.call(
+		return self.tk.getdouble(self.tk.call(
 			self._w, 'canvasy', screeny, gridspacing))
 	def coords(self, *args):
 		return self._do('coords', args)
@@ -771,6 +818,8 @@
 		return Canvas._create(self, 'arc', args)
 	def create_bitmap(self, *args):
 		return Canvas._create(self, 'bitmap', args)
+	def create_image(self, *args):
+		return Canvas._create(self, 'image', args)
 	def create_line(self, *args):
 		return Canvas._create(self, 'line', args)
 	def create_oval(self, *args):
@@ -845,19 +894,19 @@
 	def select_adjust(self, tagOrId, index):
 		self.tk.call(self._w, 'select', 'adjust', tagOrId, index)
 	def select_clear(self):
-		self.tk.call(self._w, 'select', 'clear')
+		self.tk.call(self._w, 'select', 'clear', 'end')
 	def select_from(self, tagOrId, index):
-		self.tk.call(self._w, 'select', 'from', tagOrId, index)
+		self.tk.call(self._w, 'select', 'set', tagOrId, index)
 	def select_item(self):
 		self.tk.call(self._w, 'select', 'item')
 	def select_to(self, tagOrId, index):
 		self.tk.call(self._w, 'select', 'to', tagOrId, index)
 	def type(self, tagOrId):
 		return self.tk.call(self._w, 'type', tagOrId) or None
-	def xview(self, index):
-		self.tk.call(self._w, 'xview', index)
-	def yview(self, index):
-		self.tk.call(self._w, 'yview', index)
+	def xview(self, *args):
+		apply(self.tk.call, (self._w, 'xview')+args)
+	def yview(self, *args):
+		apply(self.tk.call, (self._w, 'yview')+args)
 
 class Checkbutton(Widget):
 	def __init__(self, master=None, cnf={}):
@@ -900,13 +949,13 @@
 	def select_adjust(self, index):
 		self.tk.call(self._w, 'select', 'adjust', index)
 	def select_clear(self):
-		self.tk.call(self._w, 'select', 'clear')
+		self.tk.call(self._w, 'select', 'clear', 'end')
 	def select_from(self, index):
-		self.tk.call(self._w, 'select', 'from', index)
+	        self.tk.call(self._w, 'select', 'set', index)
 	def select_to(self, index):
 		self.tk.call(self._w, 'select', 'to', index)
-	def select_view(self, index):
-		self.tk.call(self._w, 'select', 'view', index)
+	def view(self, index):
+		self.tk.call(self._w, 'view', index)
 
 class Frame(Widget):
 	def __init__(self, master=None, cnf={}):
@@ -923,11 +972,18 @@
 	def __init__(self, master=None, cnf={}):
 		Widget.__init__(self, master, 'label', cnf)
 
+class Photo(Widget):
+	def __init__(self, master=None, cnf={}):
+		Widget.__init__(self, master, 'photo', cnf)
+
 class Listbox(Widget):
 	def __init__(self, master=None, cnf={}):
 		Widget.__init__(self, master, 'listbox', cnf)
 	def tk_listboxSingleSelect(self):
-		self.tk.call('tk_listboxSingleSelect', self._w) 
+		if TkVersion >= 4.0:
+			self['selectmode'] = 'single'
+		else:
+			self.tk.call('tk_listboxSingleSelect', self._w) 
 	def curselection(self):
 		return self.tk.splitlist(self.tk.call(
 			self._w, 'curselection'))
@@ -947,18 +1003,30 @@
 		self.tk.call(self._w, 'scan', 'dragto', x, y)
 	def select_adjust(self, index):
 		self.tk.call(self._w, 'select', 'adjust', index)
-	def select_clear(self):
-		self.tk.call(self._w, 'select', 'clear')
-	def select_from(self, index):
-		self.tk.call(self._w, 'select', 'from', index)
-	def select_to(self, index):
-		self.tk.call(self._w, 'select', 'to', index)
+	if TkVersion >= 4.0:
+		def select_anchor(self, index):
+			self.tk.call(self._w, 'selection', 'anchor', index)
+		def select_clear(self, first, last=None):
+			self.tk.call(self._w,
+				     'selection', 'clear', first, last)
+		def select_includes(self, index):
+			return self.tk.getboolean(self.tk.call(
+				self._w, 'selection', 'includes', index))
+		def select_set(self, first, last=None):
+			self.tk.call(self._w, 'selection', 'set', first, last)
+	else:
+		def select_clear(self):
+			self.tk.call(self._w, 'select', 'clear')
+		def select_from(self, index):
+			self.tk.call(self._w, 'select', 'from', index)
+		def select_to(self, index):
+			self.tk.call(self._w, 'select', 'to', index)
 	def size(self):
 		return self.tk.getint(self.tk.call(self._w, 'size'))
-	def xview(self, index):
-		self.tk.call(self._w, 'xview', index)
-	def yview(self, index):
-		self.tk.call(self._w, 'yview', index)
+	def xview(self, *what):
+		apply(self.tk.call, (self._w, 'xview')+what)
+	def yview(self, *what):
+		apply(self.tk.call, (self._w, 'yview')+what)
 
 class Menu(Widget):
 	def __init__(self, master=None, cnf={}):
@@ -1052,13 +1120,15 @@
 		Widget.__init__(self, master, 'scrollbar', cnf)
 	def get(self):
 		return self._getints(self.tk.call(self._w, 'get'))
-	def set(self, totalUnits, windowUnits, firstUnit, lastUnit):
-		self.tk.call(self._w, 'set', 
-			     totalUnits, windowUnits, firstUnit, lastUnit)
+	def set(self, *args):
+		apply(self.tk.call, (self._w, 'set')+args)
 
 class Text(Widget):
 	def __init__(self, master=None, cnf={}):
 		Widget.__init__(self, master, 'text', cnf)
+		self.bind('<Delete>', self.bspace)
+	def bspace(self, *args):
+	        self.delete('insert')
 	def tk_textSelectTo(self, index):
 		self.tk.call('tk_textSelectTo', self._w, index)
 	def tk_textBackspace(self):
@@ -1126,10 +1196,10 @@
 	def tag_remove(self, tagName, index1, index2=None):
 		self.tk.call(
 			self._w, 'tag', 'remove', tagName, index1, index2)
-	def yview(self, what):
-		self.tk.call(self._w, 'yview', what)
-	def yview_pickplace(self, what):
-		self.tk.call(self._w, 'yview', '-pickplace', what)
+	def yview(self, *what):
+		apply(self.tk.call, (self._w, 'yview')+what)
+	def yview_pickplace(self, *what):
+		apply(self.tk.call, (self._w, 'yview', '-pickplace')+what)
 
 ######################################################################
 # Extensions:
@@ -1137,16 +1207,17 @@
 class Studbutton(Button):
 	def __init__(self, master=None, cnf={}):
 		Widget.__init__(self, master, 'studbutton', cnf)
-		self.bind('<Any-Enter>',       self.tk_butEnter)
-		self.bind('<Any-Leave>',       self.tk_butLeave)
-		self.bind('<1>',               self.tk_butDown)
-		self.bind('<ButtonRelease-1>', self.tk_butUp)
+		self.bind('<Any-Enter>',       self.tkButtonEnter)
+		self.bind('<Any-Leave>',       self.tkButtonLeave)
+		self.bind('<1>',               self.tkButtonDown)
+		self.bind('<ButtonRelease-1>', self.tkButtonUp)
 
 class Tributton(Button):
 	def __init__(self, master=None, cnf={}):
 		Widget.__init__(self, master, 'tributton', cnf)
-		self.bind('<Any-Enter>',       self.tk_butEnter)
-		self.bind('<Any-Leave>',       self.tk_butLeave)
-		self.bind('<1>',               self.tk_butDown)
-		self.bind('<ButtonRelease-1>', self.tk_butUp)
-
+		self.bind('<Any-Enter>',       self.tkButtonEnter)
+		self.bind('<Any-Leave>',       self.tkButtonLeave)
+		self.bind('<1>',               self.tkButtonDown)
+		self.bind('<ButtonRelease-1>', self.tkButtonUp)
+		self['fg']               = self['bg']
+		self['activebackground'] = self['bg']