diff --git a/Demo/tkinter/guido/AttrDialog.py b/Demo/tkinter/guido/AttrDialog.py
index 44d9766..7acd341 100644
--- a/Demo/tkinter/guido/AttrDialog.py
+++ b/Demo/tkinter/guido/AttrDialog.py
@@ -120,7 +120,7 @@
                 cl = self.classes[c]
             except KeyError:
                 cl = 'unknown'
-            if type(cl) == tuple:
+            if type(cl) is tuple:
                 cl = self.enumoption
             elif cl == 'boolean':
                 cl = self.booleanoption
@@ -435,12 +435,11 @@
     list.app = app                  # Pass it on to handler
 
 def opendialogs(e):
-    import string
     list = e.widget
     sel = list.curselection()
     for i in sel:
         item = list.get(i)
-        widget = string.split(item)[0]
+        widget = item.split()[0]
         RemoteWidgetDialog(list, list.app, widget)
         if widget == '.': continue
         try:
diff --git a/Demo/tkinter/guido/MimeViewer.py b/Demo/tkinter/guido/MimeViewer.py
index b957c85..babed8f 100755
--- a/Demo/tkinter/guido/MimeViewer.py
+++ b/Demo/tkinter/guido/MimeViewer.py
@@ -3,11 +3,27 @@
 # View a single MIME multipart message.
 # Display each part as a box.
 
-import string
-from types import *
+import os
+import sys
+import getopt
+import mailbox
 from tkinter import *
 from tkinter.scrolledtext import ScrolledText
 
+MBOXPATH = os.environ['HOME'] + '/Mail'
+
+class Error(Exception):
+    pass
+
+def getcurrent(self):
+    """Return the current message.  Raise Error when there is none."""
+    seqs = self.get_sequences()
+    try:
+        return max(seqs['cur'])
+    except (ValueError, KeyError):
+        raise Error("no cur message")
+
+
 class MimeViewer:
     def __init__(self, parent, title, msg):
         self.title = title
@@ -18,8 +34,10 @@
                              {'text': title,
                               'command': self.toggle})
         self.button.pack({'anchor': 'w'})
-        headertext = msg.getheadertext(
-                lambda x: x != 'received' and x[:5] != 'x400-')
+        headertext = []
+        for item in msg.items():
+            headertext.append("%s: %s" % item)
+        headertext = '\n'.join(headertext)
         height = countlines(headertext, 4)
         if height:
             self.htext = ScrolledText(self.frame,
@@ -38,8 +56,8 @@
                                   'ipady': 2,
                                   'fill': 'x',
                                   'after': self.button}
-        body = msg.getbody()
-        if type(body) == StringType:
+        body = msg.get_payload()
+        if type(body) == str:
             self.pad = None
             height = countlines(body, 10)
             if height:
@@ -102,16 +120,13 @@
     i = 0
     n = 0
     while  n < limit:
-        i = string.find(str, '\n', i)
+        i = str.find('\n', i)
         if i < 0: break
         n = n+1
         i = i+1
     return n
 
 def main():
-    import sys
-    import getopt
-    import mhlib
     opts, args = getopt.getopt(sys.argv[1:], '')
     for o, a in opts:
         pass
@@ -121,13 +136,13 @@
         if arg[:1] == '+':
             folder = arg[1:]
         else:
-            message = string.atoi(arg)
+            message = int(arg)
 
-    mh = mhlib.MH()
-    f = mh.openfolder(folder)
-    if not message:
-        message = f.getcurrent()
-    m = f.openmessage(message)
+    mh = mailbox.MH(MBOXPATH)
+    f = mh.get_folder(folder)
+    if message is None:
+        message = getcurrent(f)
+    m = mailbox.MHMessage(f.get(message))
 
     root = Tk()
     tk = root.tk
@@ -140,4 +155,5 @@
 
     tk.mainloop()
 
-if __name__ == '__main__': main()
+if __name__ == '__main__':
+    main()
diff --git a/Demo/tkinter/guido/ShellWindow.py b/Demo/tkinter/guido/ShellWindow.py
index fffcbc5..c5a0401 100644
--- a/Demo/tkinter/guido/ShellWindow.py
+++ b/Demo/tkinter/guido/ShellWindow.py
@@ -1,6 +1,5 @@
 import os
 import sys
-import string
 from tkinter import *
 from tkinter.scrolledtext import ScrolledText
 from tkinter.dialog import Dialog
@@ -17,7 +16,7 @@
             except KeyError:
                 shell = '/bin/sh'
             shell = shell + ' -i'
-        args = string.split(shell)
+        args = shell.split()
         shell = args[0]
 
         ScrolledText.__init__(self, master, **cnf)
@@ -33,7 +32,7 @@
                                   self.outputhandler)
 
     def outputhandler(self, file, mask):
-        data = os.read(file, BUFSIZE)
+        data = os.read(file, BUFSIZE).decode()
         if not data:
             self.tk.deletefilehandler(file)
             pid, sts = os.waitpid(self.pid, 0)
@@ -65,7 +64,7 @@
         self.insert(END, "\n")
         line = self.get(self.pos, "end - 1 char")
         self.pos = self.index(END)
-        os.write(self.tochild, line)
+        os.write(self.tochild, line.encode())
         return "break"
 
     def sendeof(self, *args):
@@ -132,7 +131,7 @@
     return pid, c2pread, p2cwrite
 
 def test():
-    shell = string.join(sys.argv[1:])
+    shell = ' '.join(sys.argv[1: ])
     root = Tk()
     root.minsize(1, 1)
     if shell:
diff --git a/Demo/tkinter/guido/canvasevents.py b/Demo/tkinter/guido/canvasevents.py
index e5d27cc..16312b5 100644
--- a/Demo/tkinter/guido/canvasevents.py
+++ b/Demo/tkinter/guido/canvasevents.py
@@ -1,15 +1,41 @@
 #! /usr/bin/env python3
 
 from tkinter import *
-from Canvas import Oval, Group, CanvasText
 
 
-# Fix a bug in Canvas.Group as distributed in Python 1.4.  The
-# distributed bind() method is broken.  This is what should be used:
+# Since Canvas.Group is no longer present, the following class reproduces
+# a subset of the old Group class that is used by this app.
 
-class Group(Group):
-    def bind(self, sequence=None, command=None):
-        return self.canvas.tag_bind(self.id, sequence, command)
+class Group:
+    def __init__(self, canvas, tag=None):
+        if tag is None:
+            tag = 'Group%d' % id(self)
+
+        self.tag = self.id = tag
+        self.canvas = canvas
+        self.canvas.dtag(self.tag)
+
+    def __str__(self):
+        return self.tag
+
+    def _do(self, cmd, *args):
+        return self.canvas.tk.call(self.canvas._w, cmd, self.tag, *args)
+
+    def addtag_withtag(self, tagOrId):
+        self._do('addtag', 'withtag', tagOrId)
+
+    def bind(self, sequence=None, command=None, add=None):
+        return self.canvas.tag_bind(self.id, sequence, command, add)
+
+    def move(self, x_amount, y_amount):
+        self._do('move', x_amount, y_amount)
+
+    def dtag(self, tagToDelete=None):
+        self._do('dtag', tagToDelete)
+
+    def tkraise(self, aboveThis=None):
+        self._do('raise', aboveThis)
+
 
 class Object:
 
@@ -29,7 +55,6 @@
 
     All instance attributes are public since the derived class may
     need them.
-
     """
 
     def __init__(self, canvas, x=0, y=0, fill='red', text='object'):
@@ -44,12 +69,10 @@
         return str(self.group)
 
     def createitems(self, fill, text):
-        self.__oval = Oval(self.canvas,
-                           self.x-20, self.y-10, self.x+20, self.y+10,
-                           fill=fill, width=3)
+        self.__oval = self.canvas.create_oval(self.x - 20, self.y - 10,
+            self.x + 20, self.y + 20, fill=fill, width=3)
         self.group.addtag_withtag(self.__oval)
-        self.__text = CanvasText(self.canvas,
-                           self.x, self.y, text=text)
+        self.__text = self.canvas.create_text(self.x, self.y, text=text)
         self.group.addtag_withtag(self.__text)
 
     def moveby(self, dx, dy):
@@ -75,18 +98,15 @@
 
 
 class Bottom(Object):
-
     """An object to serve as the bottom of a pile."""
 
     def createitems(self, *args):
-        self.__oval = Oval(self.canvas,
-                           self.x-20, self.y-10, self.x+20, self.y+10,
-                           fill='gray', outline='')
+        self.__oval = self.canvas.create_oval(self.x - 20, self.y - 10,
+            self.x + 20, self.y + 10, fill='gray', outline='')
         self.group.addtag_withtag(self.__oval)
 
 
 class Pile:
-
     """A group of graphical objects."""
 
     def __init__(self, canvas, x, y, tag=None):
diff --git a/Demo/tkinter/guido/dialog.py b/Demo/tkinter/guido/dialog.py
index f16029c..eae9c7e 100755
--- a/Demo/tkinter/guido/dialog.py
+++ b/Demo/tkinter/guido/dialog.py
@@ -24,8 +24,7 @@
 
     # 2. Fill the top part with the bitmap and message.
 
-    msg = Message(top, width='3i', text=text,
-                  font='-Adobe-Times-Medium-R-Normal-*-180-*')
+    msg = Message(top, width='3i', text=text)
     msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m')
     if bitmap:
         bm = Label(top, bitmap=bitmap)
diff --git a/Demo/tkinter/guido/electrons.py b/Demo/tkinter/guido/electrons.py
index 6079c04..896e079 100755
--- a/Demo/tkinter/guido/electrons.py
+++ b/Demo/tkinter/guido/electrons.py
@@ -62,11 +62,11 @@
 
 # Main program
 def main():
-    import sys, string
+    import sys
 
     # First argument is number of electrons, default 30
     if sys.argv[1:]:
-        n = string.atoi(sys.argv[1])
+        n = int(sys.argv[1])
     else:
         n = 30
 
diff --git a/Demo/tkinter/guido/hanoi.py b/Demo/tkinter/guido/hanoi.py
index a29b1d7..34a0bba 100644
--- a/Demo/tkinter/guido/hanoi.py
+++ b/Demo/tkinter/guido/hanoi.py
@@ -125,11 +125,11 @@
 
 # Main program
 def main():
-    import sys, string
+    import sys
 
     # First argument is number of pegs, default 4
     if sys.argv[1:]:
-        n = string.atoi(sys.argv[1])
+        n = int(sys.argv[1])
     else:
         n = 4
 
diff --git a/Demo/tkinter/guido/listtree.py b/Demo/tkinter/guido/listtree.py
index 625d20e..8db5b60 100644
--- a/Demo/tkinter/guido/listtree.py
+++ b/Demo/tkinter/guido/listtree.py
@@ -1,7 +1,6 @@
 # List a remote app's widget tree (names and classes only)
 
 import sys
-import string
 
 from tkinter import *
 
@@ -13,8 +12,6 @@
 
 def listnodes(list, app, widget, level):
     klass = list.send(app, 'winfo', 'class', widget)
-##      i = string.rindex(widget, '.')
-##      list.insert(END, '%s%s (%s)' % ((level-1)*'.   ', widget[i:], klass))
     list.insert(END, '%s (%s)' % (widget, klass))
     children = list.tk.splitlist(
             list.send(app, 'winfo', 'children', widget))
diff --git a/Demo/tkinter/guido/mbox.py b/Demo/tkinter/guido/mbox.py
index 299999c..ccd6581 100755
--- a/Demo/tkinter/guido/mbox.py
+++ b/Demo/tkinter/guido/mbox.py
@@ -3,17 +3,15 @@
 # Scan MH folder, display results in window
 
 import os
-import sys
 import re
+import sys
 import getopt
-import string
-import mhlib
-
+import mailbox
 from tkinter import *
 
 from dialog import dialog
 
-mailbox = os.environ['HOME'] + '/Mail'
+MBOXPATH = os.environ['HOME'] + '/Mail'
 
 def main():
     global root, tk, top, mid, bot
@@ -38,8 +36,8 @@
 
     # Initialize MH
 
-    mh = mhlib.MH()
-    mhf = mh.openfolder(folder)
+    mh = mailbox.MH(MBOXPATH)
+    mhf = mh.get_folder(folder)
 
     # Build widget hierarchy
 
@@ -171,7 +169,7 @@
         return
     i = sel[0]
     folder = folderbox.get(i)
-    mhf = mh.openfolder(folder)
+    mhf = mh.get_folder(folder)
     rescan()
 
 def open_message(e=None):
@@ -189,9 +187,10 @@
     tk.call('update', 'idletasks')
     i = sel[0]
     line = scanbox.get(i)
-    if scanparser.match(line) >= 0:
-        num = string.atoi(scanparser.group(1))
-        m = mhf.openmessage(num)
+    m = scanparser.match(line)
+    if m:
+        num = int(m.group(1))
+        m = mhf.get_message(num)
         if viewer: viewer.destroy()
         from MimeViewer import MimeViewer
         viewer = MimeViewer(bot, '+%s/%d' % (folder, num), m)
@@ -212,9 +211,11 @@
     todo = []
     for i in sel:
         line = scanbox.get(i)
-        if scanparser.match(line) >= 0:
-            todo.append(string.atoi(scanparser.group(1)))
-    mhf.removemessages(todo)
+        m = scanparser.match(line)
+        if m:
+            toremove = int(m.group(1))
+            todo.append(toremove)
+            mhf.remove(toremove)
     rescan()
     fixfocus(min(todo), itop)
 
@@ -240,12 +241,13 @@
     todo = []
     for i in sel:
         line = scanbox.get(i)
-        if scanparser.match(line) >= 0:
-            todo.append(string.atoi(scanparser.group(1)))
+        m = scanparser.match(line)
+        if m:
+            todo.append(int(m.group(1)))
     if lastrefile != refileto or not tofolder:
         lastrefile = refileto
         tofolder = None
-        tofolder = mh.openfolder(lastrefile)
+        tofolder = mh.get_folder(lastrefile)
     mhf.refilemessages(todo, tofolder)
     rescan()
     fixfocus(min(todo), itop)
@@ -254,18 +256,18 @@
     n = scanbox.size()
     for i in range(n):
         line = scanbox.get(repr(i))
-        if scanparser.match(line) >= 0:
-            num = string.atoi(scanparser.group(1))
+        m = scanparser.match(line)
+        if m:
+            num = int(m.group(1))
             if num >= near:
                 break
     else:
         i = 'end'
-    scanbox.select_from(i)
     scanbox.yview(itop)
 
 def setfolders():
     folderbox.delete(0, 'end')
-    for fn in mh.listallfolders():
+    for fn in mh.list_folders():
         folderbox.insert('end', fn)
 
 def rescan():
@@ -278,6 +280,7 @@
         scanbox.insert('end', line)
 
 def scanfolder(folder = 'inbox', sequence = 'all'):
-    return [line[:-1] for line in os.popen('scan +%s %s' % (folder, sequence), 'r').readlines()]
+    return [line[:-1] for line in
+            os.popen('scan +%s %s' % (folder, sequence), 'r').readlines()]
 
 main()
diff --git a/Demo/tkinter/guido/rmt.py b/Demo/tkinter/guido/rmt.py
index a3f430e..d11edb0 100755
--- a/Demo/tkinter/guido/rmt.py
+++ b/Demo/tkinter/guido/rmt.py
@@ -28,7 +28,7 @@
 s.pack(side=RIGHT, fill=Y)
 t = Text(f, relief=RAISED, borderwidth=2, yscrollcommand=s.set, setgrid=1)
 t.pack(side=LEFT, fill=BOTH, expand=1)
-t.tag_config('bold', font='-Adobe-Courier-Bold-R-Normal-*-120-*')
+t.tag_config('bold')
 s['command'] = t.yview
 
 root.title('Tk Remote Controller')
diff --git a/Demo/tkinter/guido/solitaire.py b/Demo/tkinter/guido/solitaire.py
index 375bd03..d0f5dee 100755
--- a/Demo/tkinter/guido/solitaire.py
+++ b/Demo/tkinter/guido/solitaire.py
@@ -22,20 +22,10 @@
 
 # Imports
 
-import math
 import random
 
 from tkinter import *
-from Canvas import Rectangle, CanvasText, Group, Window
-
-
-# Fix a bug in Canvas.Group as distributed in Python 1.4.  The
-# distributed bind() method is broken.  Rather than asking you to fix
-# the source, we fix it here by deriving a subclass:
-
-class Group(Group):
-    def bind(self, sequence=None, command=None):
-        return self.canvas.tag_bind(self.id, sequence, command)
+from canvasevents import Group
 
 
 # Constants determining the size and lay-out of cards and stacks.  We
@@ -165,20 +155,22 @@
         self.face_shown = 0
 
         self.x = self.y = 0
+        self.canvas = canvas
         self.group = Group(canvas)
 
         text = "%s  %s" % (VALNAMES[value], suit)
-        self.__text = CanvasText(canvas, CARDWIDTH//2, 0,
-                               anchor=N, fill=self.color, text=text)
+        self.__text = canvas.create_text(CARDWIDTH // 2, 0, anchor=N,
+                                         fill=self.color, text=text)
         self.group.addtag_withtag(self.__text)
 
-        self.__rect = Rectangle(canvas, 0, 0, CARDWIDTH, CARDHEIGHT,
-                              outline='black', fill='white')
+        self.__rect = canvas.create_rectangle(0, 0, CARDWIDTH, CARDHEIGHT,
+                                              outline='black', fill='white')
         self.group.addtag_withtag(self.__rect)
 
-        self.__back = Rectangle(canvas, MARGIN, MARGIN,
-                              CARDWIDTH-MARGIN, CARDHEIGHT-MARGIN,
-                              outline='black', fill='blue')
+        self.__back = canvas.create_rectangle(MARGIN, MARGIN,
+                                              CARDWIDTH - MARGIN,
+                                              CARDHEIGHT - MARGIN,
+                                              outline='black', fill='blue')
         self.group.addtag_withtag(self.__back)
 
     def __repr__(self):
@@ -202,15 +194,15 @@
     def showface(self):
         """Turn the card's face up."""
         self.tkraise()
-        self.__rect.tkraise()
-        self.__text.tkraise()
+        self.canvas.tag_raise(self.__rect)
+        self.canvas.tag_raise(self.__text)
         self.face_shown = 1
 
     def showback(self):
         """Turn the card's face down."""
         self.tkraise()
-        self.__rect.tkraise()
-        self.__back.tkraise()
+        self.canvas.tag_raise(self.__rect)
+        self.canvas.tag_raise(self.__back)
         self.face_shown = 0
 
 
@@ -400,10 +392,9 @@
     """
 
     def makebottom(self):
-        bottom = Rectangle(self.game.canvas,
-                           self.x, self.y,
-                           self.x+CARDWIDTH, self.y+CARDHEIGHT,
-                           outline='black', fill=BACKGROUND)
+        bottom = self.game.canvas.create_rectangle(self.x, self.y,
+            self.x + CARDWIDTH, self.y + CARDHEIGHT, outline='black',
+            fill=BACKGROUND)
         self.group.addtag_withtag(bottom)
 
     def fill(self):
@@ -435,7 +426,7 @@
 
 def randperm(n):
     """Function returning a random permutation of range(n)."""
-    r = range(n)
+    r = list(range(n))
     x = []
     while r:
         i = random.choice(r)
@@ -478,10 +469,8 @@
 class SuitStack(OpenStack):
 
     def makebottom(self):
-        bottom = Rectangle(self.game.canvas,
-                           self.x, self.y,
-                           self.x+CARDWIDTH, self.y+CARDHEIGHT,
-                           outline='black', fill='')
+        bottom = self.game.canvas.create_rectangle(self.x, self.y,
+            self.x + CARDWIDTH, self.y + CARDHEIGHT, outline='black', fill='')
 
     def userclickhandler(self):
         pass
@@ -540,8 +529,8 @@
                                  background=BACKGROUND,
                                  activebackground="green",
                                  command=self.deal)
-        Window(self.canvas, MARGIN, 3*YSPACING + 20,
-               window=self.dealbutton, anchor=SW)
+        self.canvas.create_window(MARGIN, 3 * YSPACING + 20,
+            window=self.dealbutton, anchor=SW)
 
         x = MARGIN
         y = MARGIN
diff --git a/Demo/tkinter/guido/sortvisu.py b/Demo/tkinter/guido/sortvisu.py
index 1e4165d..cbc911d 100644
--- a/Demo/tkinter/guido/sortvisu.py
+++ b/Demo/tkinter/guido/sortvisu.py
@@ -20,7 +20,6 @@
 
 
 from tkinter import *
-from Canvas import Line, Rectangle
 import random
 
 
@@ -31,6 +30,9 @@
 
 class Array:
 
+    class Cancelled(BaseException):
+        pass
+
     def __init__(self, master, data=None):
         self.master = master
         self.frame = Frame(self.master)
@@ -41,9 +43,9 @@
         self.canvas.pack()
         self.report = Label(self.frame)
         self.report.pack()
-        self.left = Line(self.canvas, 0, 0, 0, 0)
-        self.right = Line(self.canvas, 0, 0, 0, 0)
-        self.pivot = Line(self.canvas, 0, 0, 0, 0)
+        self.left = self.canvas.create_line(0, 0, 0, 0)
+        self.right = self.canvas.create_line(0, 0, 0, 0)
+        self.pivot = self.canvas.create_line(0, 0, 0, 0)
         self.items = []
         self.size = self.maxvalue = 0
         if data:
@@ -82,8 +84,6 @@
         if self.in_mainloop:
             self.master.quit()
 
-    Cancelled = "Array.Cancelled"       # Exception
-
     def wait(self, msecs):
         if self.speed == "fastest":
             msecs = 0
@@ -110,15 +110,15 @@
         for i in range(self.size):
             item = self.items[i]
             if first <= i < last:
-                item.item.config(fill='red')
+                self.canvas.itemconfig(item, fill='red')
             else:
-                item.item.config(fill='orange')
+                self.canvas.itemconfig(item, fill='orange')
         self.hide_left_right_pivot()
 
     def hide_partition(self):
         for i in range(self.size):
             item = self.items[i]
-            item.item.config(fill='red')
+            self.canvas.itemconfig(item, fill='red')
         self.hide_left_right_pivot()
 
     def show_left(self, left):
@@ -127,7 +127,7 @@
             return
         x1, y1, x2, y2 = self.items[left].position()
 ##      top, bot = HIRO
-        self.left.coords([(x1-2, 0), (x1-2, 9999)])
+        self.canvas.coords(self.left, (x1 - 2, 0, x1 - 2, 9999))
         self.master.update()
 
     def show_right(self, right):
@@ -135,7 +135,7 @@
             self.hide_right()
             return
         x1, y1, x2, y2 = self.items[right].position()
-        self.right.coords(((x2+2, 0), (x2+2, 9999)))
+        self.canvas.coords(self.right, (x2 + 2, 0, x2 + 2, 9999))
         self.master.update()
 
     def hide_left_right_pivot(self):
@@ -144,17 +144,17 @@
         self.hide_pivot()
 
     def hide_left(self):
-        self.left.coords(((0, 0), (0, 0)))
+        self.canvas.coords(self.left, (0, 0, 0, 0))
 
     def hide_right(self):
-        self.right.coords(((0, 0), (0, 0)))
+        self.canvas.coords(self.right, (0, 0, 0, 0))
 
     def show_pivot(self, pivot):
         x1, y1, x2, y2 = self.items[pivot].position()
-        self.pivot.coords(((0, y1-2), (9999, y1-2)))
+        self.canvas.coords(self.pivot, (0, y1 - 2, 9999, y1 - 2))
 
     def hide_pivot(self):
-        self.pivot.coords(((0, 0), (0, 0)))
+        self.canvas.coords(self.pivot, (0, 0, 0, 0))
 
     def swap(self, i, j):
         if i == j: return
@@ -199,12 +199,13 @@
         self.array = array
         self.index = index
         self.value = value
+        self.canvas = array.canvas
         x1, y1, x2, y2 = self.position()
-        self.item = Rectangle(array.canvas, x1, y1, x2, y2,
-                              fill='red', outline='black', width=1)
-        self.item.bind('<Button-1>', self.mouse_down)
-        self.item.bind('<Button1-Motion>', self.mouse_move)
-        self.item.bind('<ButtonRelease-1>', self.mouse_up)
+        self.item = array.canvas.create_rectangle(x1, y1, x2, y2,
+            fill='red', outline='black', width=1)
+        array.canvas.tag_bind(self.item, '<Button-1>', self.mouse_down)
+        array.canvas.tag_bind(self.item, '<Button1-Motion>', self.mouse_move)
+        array.canvas.tag_bind(self.item, '<ButtonRelease-1>', self.mouse_up)
 
     def delete(self):
         item = self.item
@@ -235,7 +236,7 @@
         self.array.items[here], self.array.items[i] = other, self
         self.index = i
         x1, y1, x2, y2 = self.position()
-        self.item.coords(((x1, y1), (x2, y2)))
+        self.canvas.coords(self.item, (x1, y1, x2, y2))
         other.setindex(here)
 
     def setindex(self, index):
@@ -249,7 +250,7 @@
         trajectory = interpolate(oldpts, newpts, nsteps)
         self.item.tkraise()
         for pts in trajectory:
-            self.item.coords((pts[:2], pts[2:]))
+            self.canvas.coords(self.item, pts)
             self.array.wait(50)
 
     def swapwith(self, other):
@@ -262,61 +263,63 @@
         self.index, other.index = other.index, self.index
         mynewpts = self.position()
         othernewpts = other.position()
-        myfill = self.item['fill']
-        otherfill = other.item['fill']
-        self.item.config(fill='green')
-        other.item.config(fill='yellow')
+        myfill = self.canvas.itemcget(self.item, 'fill')
+        otherfill = self.canvas.itemcget(other.item, 'fill')
+        self.canvas.itemconfig(self.item, fill='green')
+        self.canvas.itemconfig(other.item, fill='yellow')
         self.array.master.update()
         if self.array.speed == "single-step":
-            self.item.coords((mynewpts[:2], mynewpts[2:]))
-            other.item.coords((othernewpts[:2], othernewpts[2:]))
+            self.canvas.coords(self.item, mynewpts)
+            self.canvas.coords(other.item, othernewpts)
             self.array.master.update()
-            self.item.config(fill=myfill)
-            other.item.config(fill=otherfill)
+            self.canvas.itemconfig(self.item, fill=myfill)
+            self.canvas.itemconfig(other.item, fill=otherfill)
             self.array.wait(0)
             return
         mytrajectory = interpolate(myoldpts, mynewpts, nsteps)
         othertrajectory = interpolate(otheroldpts, othernewpts, nsteps)
         if self.value > other.value:
-            self.item.tkraise()
-            other.item.tkraise()
+            self.canvas.tag_raise(self.item)
+            self.canvas.tag_raise(other.item)
         else:
-            other.item.tkraise()
-            self.item.tkraise()
+            self.canvas.tag_raise(other.item)
+            self.canvas.tag_raise(self.item)
         try:
             for i in range(len(mytrajectory)):
                 mypts = mytrajectory[i]
                 otherpts = othertrajectory[i]
-                self.item.coords((mypts[:2], mypts[2:]))
-                other.item.coords((otherpts[:2], otherpts[2:]))
+                self.canvas.coords(self.item, mypts)
+                self.canvas.coords(other.item, otherpts)
                 self.array.wait(50)
         finally:
             mypts = mytrajectory[-1]
             otherpts = othertrajectory[-1]
-            self.item.coords((mypts[:2], mypts[2:]))
-            other.item.coords((otherpts[:2], otherpts[2:]))
-            self.item.config(fill=myfill)
-            other.item.config(fill=otherfill)
+            self.canvas.coords(self.item, mypts)
+            self.canvas.coords(other.item, otherpts)
+            self.canvas.itemconfig(self.item, fill=myfill)
+            self.canvas.itemconfig(other.item, fill=otherfill)
 
     def compareto(self, other):
-        myfill = self.item['fill']
-        otherfill = other.item['fill']
-        outcome = cmp(self.value, other.value)
-        if outcome < 0:
+        myfill = self.canvas.itemcget(self.item, 'fill')
+        otherfill = self.canvas.itemcget(other.item, 'fill')
+        if self.value < other.value:
             myflash = 'white'
             otherflash = 'black'
-        elif outcome > 0:
+            outcome = -1
+        elif self.value > other.value:
             myflash = 'black'
             otherflash = 'white'
+            outcome = 1
         else:
             myflash = otherflash = 'grey'
+            outcome = 0
         try:
-            self.item.config(fill=myflash)
-            other.item.config(fill=otherflash)
+            self.canvas.itemconfig(self.item, fill=myflash)
+            self.canvas.itemconfig(other.item, fill=otherflash)
             self.array.wait(500)
         finally:
-            self.item.config(fill=myfill)
-            other.item.config(fill=otherfill)
+            self.canvas.itemconfig(self.item, fill=myfill)
+            self.canvas.itemconfig(other.item, fill=otherfill)
         return outcome
 
     def position(self):
@@ -429,7 +432,7 @@
                         j = j-1
                 continue
             array.message("Choosing pivot")
-            j, i, k = first, (first+last)//2, last-1
+            j, i, k = first, (first+last) // 2, last-1
             if array.compare(k, i) < 0:
                 array.swap(k, i)
             if array.compare(k, j) < 0:
@@ -519,7 +522,7 @@
 
         self.v_size = MyIntVar(self.master, self)
         self.v_size.set(size)
-        sizes = [1, 2, 3, 4] + range(5, 55, 5)
+        sizes = [1, 2, 3, 4] + list(range(5, 55, 5))
         if self.size not in sizes:
             sizes.append(self.size)
             sizes.sort()
diff --git a/Demo/tkinter/guido/svkill.py b/Demo/tkinter/guido/svkill.py
index 4ed88ad..5ed8f0f 100755
--- a/Demo/tkinter/guido/svkill.py
+++ b/Demo/tkinter/guido/svkill.py
@@ -7,8 +7,6 @@
 if TkVersion < 4.0:
     raise ImportError("This version of svkill requires Tk 4.0 or later")
 
-from string import splitfields
-from string import split
 import subprocess
 import os
 
@@ -40,14 +38,14 @@
             ]
     def kill(self, selected):
         c = self.format_list[self.format.get()][2]
-        pid = split(selected)[c]
+        pid = selected.split()[c]
         os.system('kill -9 ' + pid)
         self.do_update()
     def do_update(self):
         format = self.format_list[self.format.get()][1]
         view = self.view_list[self.view.get()][1]
         s = subprocess.getoutput('ps %s %s' % (view, format))
-        list = splitfields(s, '\n')
+        list = s.split('\n')
         self.header.set(list[0] + '          ')
         del list[0]
         self.frame.list.delete(0, AtEnd())
@@ -97,14 +95,12 @@
         self.header = StringVar(self)
         self.frame.label = Label(
                 self.frame, relief=FLAT, anchor=NW, borderwidth=0,
-                font='*-Courier-Bold-R-Normal-*-120-*',
                 textvariable=self.header)
         self.frame.label.pack(fill=Y, anchor=W)
         self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
         self.frame.list = Listbox(
                 self.frame,
                 relief=SUNKEN,
-                font='*-Courier-Medium-R-Normal-*-120-*',
                 width=40, height=10,
                 selectbackground='#eed5b7',
                 selectborderwidth=0,
diff --git a/Demo/tkinter/guido/tkman.py b/Demo/tkinter/guido/tkman.py
index 4fc0488..c50258e 100755
--- a/Demo/tkinter/guido/tkman.py
+++ b/Demo/tkinter/guido/tkman.py
@@ -2,11 +2,11 @@
 
 # Tk man page browser -- currently only shows the Tcl/Tk man pages
 
-import sys
 import os
-import string
 import re
+import sys
 from tkinter import *
+
 from ManPage import ManPage
 
 MANNDIRLIST = ['/depot/sundry/man/mann','/usr/local/man/mann']
@@ -221,9 +221,9 @@
             print('Regex error:', msg)
             return
         here = self.text.index(AtInsert())
-        lineno = string.atoi(here[:string.find(here, '.')])
+        lineno = int(here[:here.find('.')])
         end = self.text.index(AtEnd())
-        endlineno = string.atoi(end[:string.find(end, '.')])
+        endlineno = int(end[:end.find('.')])
         wraplineno = lineno
         found = 0
         while 1:
@@ -237,9 +237,9 @@
             line = self.text.get('%d.0 linestart' % lineno,
                                  '%d.0 lineend' % lineno)
             i = prog.search(line)
-            if i >= 0:
+            if i:
                 found = 1
-                n = max(1, len(prog.group(0)))
+                n = max(1, len(i.group(0)))
                 try:
                     self.text.tag_remove('sel',
                                          AtSelFirst(),
@@ -247,10 +247,10 @@
                 except TclError:
                     pass
                 self.text.tag_add('sel',
-                                  '%d.%d' % (lineno, i),
-                                  '%d.%d' % (lineno, i+n))
+                                  '%d.%d' % (lineno, i.start()),
+                                  '%d.%d' % (lineno, i.start()+n))
                 self.text.mark_set(AtInsert(),
-                                   '%d.%d' % (lineno, i))
+                                   '%d.%d' % (lineno, i.start()))
                 self.text.yview_pickplace(AtInsert())
                 break
         if not found:
diff --git a/Demo/tkinter/matt/bind-w-mult-calls-p-type.py b/Demo/tkinter/matt/bind-w-mult-calls-p-type.py
index af0ec81..0da7c37 100644
--- a/Demo/tkinter/matt/bind-w-mult-calls-p-type.py
+++ b/Demo/tkinter/matt/bind-w-mult-calls-p-type.py
@@ -1,5 +1,4 @@
 from tkinter import *
-import string
 
 # This program  shows how to use a simple type-in box
 
diff --git a/Demo/tkinter/matt/entry-with-shared-variable.py b/Demo/tkinter/matt/entry-with-shared-variable.py
index 473a596..7d93da7 100644
--- a/Demo/tkinter/matt/entry-with-shared-variable.py
+++ b/Demo/tkinter/matt/entry-with-shared-variable.py
@@ -1,5 +1,4 @@
 from tkinter import *
-import string
 
 # This program  shows how to make a typein box shadow a program variable.
 
@@ -35,7 +34,7 @@
         # because it's being looked at by the entry widget, changing
         # the variable changes the entry widget display automatically.
         # the strange get/set operators are clunky, true...
-        str = string.upper(self.contents.get())
+        str = self.contents.get().upper()
         self.contents.set(str)
 
     def print_contents(self, event):
diff --git a/Demo/tkinter/matt/pong-demo-1.py b/Demo/tkinter/matt/pong-demo-1.py
index 09f9f2e..82a5dc0 100644
--- a/Demo/tkinter/matt/pong-demo-1.py
+++ b/Demo/tkinter/matt/pong-demo-1.py
@@ -1,7 +1,5 @@
 from tkinter import *
 
-import string
-
 
 class Pong(Frame):
     def createWidgets(self):
diff --git a/Demo/tkinter/matt/printing-coords-of-items.py b/Demo/tkinter/matt/printing-coords-of-items.py
index 26a4649..771a60d 100644
--- a/Demo/tkinter/matt/printing-coords-of-items.py
+++ b/Demo/tkinter/matt/printing-coords-of-items.py
@@ -35,7 +35,7 @@
         # the "current" tag is applied to the object the cursor is over.
         # this happens automatically.
         self.draw.itemconfig(CURRENT, fill="red")
-        print(self.draw.coords(CURRENT))
+        print(list(self.draw.coords(CURRENT)))
 
     def mouseLeave(self, event):
         # the "current" tag is applied to the object the cursor is over.
