diff --git a/Lib/lib-tk/ScrolledText.py b/Lib/lib-tk/ScrolledText.py
index 367aa89..8076bc4 100644
--- a/Lib/lib-tk/ScrolledText.py
+++ b/Lib/lib-tk/ScrolledText.py
@@ -1,43 +1,52 @@
-# A ScrolledText widget feels like a text widget but also has a
-# vertical scroll bar on its right.  (Later, options may be added to
-# add a horizontal bar as well, to make the bars disappear
-# automatically when not needed, to move them to the other side of the
-# window, etc.)
-#
-# Configuration options are passed to the Text widget.
-# A Frame widget is inserted between the master and the text, to hold
-# the Scrollbar widget.
-# Most methods calls are inherited from the Text widget; Pack methods
-# are redirected to the Frame widget however.
+"""A ScrolledText widget feels like a text widget but also has a
+vertical scroll bar on its right.  (Later, options may be added to
+add a horizontal bar as well, to make the bars disappear
+automatically when not needed, to move them to the other side of the
+window, etc.)
 
-from Tkinter import *
-from Tkinter import _cnfmerge
+Configuration options are passed to the Text widget.
+A Frame widget is inserted between the master and the text, to hold
+the Scrollbar widget.
+Most methods calls are inherited from the Text widget; Pack, Grid and
+Place methods are redirected to the Frame widget however.
+"""
+
+__all__ = ['ScrolledText']
+
+from Tkinter import Frame, Text, Scrollbar, Pack, Grid, Place
+from Tkconstants import RIGHT, LEFT, Y, BOTH
 
 class ScrolledText(Text):
-    def __init__(self, master=None, cnf=None, **kw):
-        if cnf is None:
-            cnf = {}
-        if kw:
-            cnf = _cnfmerge((cnf, kw))
-        fcnf = {}
-        for k in cnf.keys():
-            if type(k) == ClassType or k == 'name':
-                fcnf[k] = cnf[k]
-                del cnf[k]
-        self.frame = Frame(master, **fcnf)
-        self.vbar = Scrollbar(self.frame, name='vbar')
+    def __init__(self, master=None, **kw):
+        self.frame = Frame(master)
+        self.vbar = Scrollbar(self.frame)
         self.vbar.pack(side=RIGHT, fill=Y)
-        cnf['name'] = 'text'
-        Text.__init__(self, self.frame, **cnf)
-        self.pack(side=LEFT, fill=BOTH, expand=1)
-        self['yscrollcommand'] = self.vbar.set
+
+        kw.update({'yscrollcommand': self.vbar.set})
+        Text.__init__(self, self.frame, **kw)
+        self.pack(side=LEFT, fill=BOTH, expand=True)
         self.vbar['command'] = self.yview
 
         # Copy geometry methods of self.frame -- hack!
-        methods = Pack.__dict__.keys()
-        methods = methods + Grid.__dict__.keys()
-        methods = methods + Place.__dict__.keys()
+        methods = vars(Pack).keys() + vars(Grid).keys() + vars(Place).keys()
 
         for m in methods:
             if m[0] != '_' and m != 'config' and m != 'configure':
                 setattr(self, m, getattr(self.frame, m))
+
+    def __str__(self):
+        return str(self.frame)
+
+
+def example():
+    import __main__
+    from Tkconstants import END
+
+    stext = ScrolledText(bg='white', height=10)
+    stext.insert(END, __main__.__doc__)
+    stext.pack(fill=BOTH, side=LEFT, expand=True)
+    stext.focus_set()
+    stext.mainloop()
+
+if __name__ == "__main__":
+    example()
