diff --git a/Lib/tkinter/Dialog.py b/Lib/tkinter/Dialog.py
index 022bd96..db8f5da 100755
--- a/Lib/tkinter/Dialog.py
+++ b/Lib/tkinter/Dialog.py
@@ -1,8 +1,16 @@
 # Dialog.py -- Tkinter interface to the tk_dialog script.
+
 from Tkinter import *
 
+if TkVersion == 3.6:
+	DIALOG_ICON = 'warning'
+else:
+	DIALOG_ICON = 'questhead'
+
+
 class Dialog(Widget):
 	def __init__(self, master=None, cnf={}):
+		self.widgetName = '__dialog__'
 		Widget._setup(self, master, cnf)
 		self.num = self.tk.getint(
 			apply(self.tk.call,
@@ -21,7 +29,7 @@
 			  ' since the last time it was saved.'
 			  ' Do you want to save it before'
 			  ' exiting the application.',
-			  'bitmap': 'warning',
+			  'bitmap': DIALOG_ICON,
 			  'default': 0,
 			  'strings': ('Save File', 
 				      'Discard Changes', 
diff --git a/Lib/tkinter/Tkinter.py b/Lib/tkinter/Tkinter.py
index 2e3ff89..066dfe3 100755
--- a/Lib/tkinter/Tkinter.py
+++ b/Lib/tkinter/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']
