diff --git a/Lib/idlelib/aboutDialog.py b/Lib/idlelib/aboutDialog.py
index 85cbe46..3a76b0b 100644
--- a/Lib/idlelib/aboutDialog.py
+++ b/Lib/idlelib/aboutDialog.py
@@ -8,126 +8,131 @@
 about box for idle
 """
 from Tkinter import *
-import string
+import string, os
 import textView
 import idlever
 class AboutDialog(Toplevel):
-  """
-  modal about dialog for idle
-  """ 
-  def __init__(self,parent,title):
-    Toplevel.__init__(self, parent)
-    self.configure(borderwidth=5)
-    self.geometry("+%d+%d" % (parent.winfo_rootx()+30,
-        parent.winfo_rooty()+30))
-    #elguavas - config placeholders til config stuff completed
-    self.bg="#555555"
-    self.fg="#ffffff"
-    #no ugly bold default text font on *nix
-    self.textFont=tuple(Label().cget('font').split())[0:2]+('normal',) 
+    """
+    modal about dialog for idle
+    """ 
+    def __init__(self,parent,title):
+        Toplevel.__init__(self, parent)
+        self.configure(borderwidth=5)
+        self.geometry("+%d+%d" % (parent.winfo_rootx()+30,
+                parent.winfo_rooty()+30))
+        #elguavas - config placeholders til config stuff completed
+        self.bg="#555555"
+        self.fg="#ffffff"
+        #no ugly bold default text font on *nix
+        self.textFont=tuple(Label().cget('font').split())[0:2]+('normal',) 
 
-    self.CreateWidgets()
-    self.resizable(height=FALSE,width=FALSE)
-    self.title(title)
-    self.transient(parent)
-    self.grab_set()
-    self.protocol("WM_DELETE_WINDOW", self.Ok)
-    self.parent = parent
-    self.buttonOk.focus_set()
-    #key bindings for this dialog
-    self.bind('<Alt-c>',self.CreditsButtonBinding) #credits button
-    #self.bind('<Alt-l>',self.LicenseButtonBinding) #license button
-    self.bind('<Alt-r>',self.LicenseButtonBinding) #readme button
-    self.bind('<Return>',self.Ok) #dismiss dialog
-    self.bind('<Escape>',self.Ok) #dismiss dialog
-    self.wait_window()
+        self.CreateWidgets()
+        self.resizable(height=FALSE,width=FALSE)
+        self.title(title)
+        self.transient(parent)
+        self.grab_set()
+        self.protocol("WM_DELETE_WINDOW", self.Ok)
+        self.parent = parent
+        self.buttonOk.focus_set()
+        #key bindings for this dialog
+        self.bind('<Alt-c>',self.CreditsButtonBinding) #credits button
+        #self.bind('<Alt-l>',self.LicenseButtonBinding) #license button
+        self.bind('<Alt-r>',self.LicenseButtonBinding) #readme button
+        self.bind('<Return>',self.Ok) #dismiss dialog
+        self.bind('<Escape>',self.Ok) #dismiss dialog
+        self.wait_window()
+        
+    def CreateWidgets(self):
+        frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
+        frameButtons = Frame(self)
+        frameButtons.pack(side=BOTTOM,fill=X)
+        frameMain.pack(side=TOP,expand=TRUE,fill=BOTH)
+        self.buttonOk = Button(frameButtons,text='Ok',
+                command=self.Ok)#,default=ACTIVE
+        self.buttonOk.pack(padx=5,pady=5)
+        #self.picture = Image('photo',data=self.pictureData)
+        frameBg = Frame(frameMain,bg=self.bg)
+        frameBg.pack(expand=TRUE,fill=BOTH)
+        labelTitle = Label(frameBg,text='IDLEfork',fg=self.fg,bg=self.bg,
+                font=('courier', 24, 'bold'))
+        labelTitle.grid(row=0,column=0,sticky=W,padx=10,pady=10)
+        #labelPicture = Label(frameBg,text='[picture]')
+        #image=self.picture,bg=self.bg)
+        #labelPicture.grid(row=0,column=1,sticky=W,rowspan=2,padx=0,pady=3)
+        labelVersion = Label(frameBg,text='version  '+idlever.IDLE_VERSION,
+                fg=self.fg,bg=self.bg,font=self.textFont)
+        labelVersion.grid(row=1,column=0,sticky=W,padx=10,pady=5)
+        labelCopyright = Label(frameBg,
+                text="A development version of Python's lightweight\n"+
+                'Integrated DeveLopment Environment, IDLE.',
+                justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+        labelCopyright.grid(row=2,column=0,sticky=W,columnspan=3,padx=10,pady=5)
+        labelLicense = Label(frameBg,
+                text='Licenced under the Python 2.1.1 PSF Licence\n'+
+                '(a GPL compatible licence with extra freedoms)',
+                justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+        labelLicense.grid(row=3,column=0,sticky=W,columnspan=3,padx=10,pady=5)
+        framePad = Frame(frameBg,height=5,bg=self.bg).grid(row=4,column=0)
+        labelEmail = Label(frameBg,text='email:  idle-dev@python.org',
+                justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+        labelEmail.grid(row=5,column=0,columnspan=2,sticky=W,padx=10,pady=0)
+        labelWWW = Label(frameBg,text='www:  http://idlefork.sourceforge.net',
+                justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+        labelWWW.grid(row=6,column=0,columnspan=2,sticky=W,padx=10,pady=0)
+        frameDivider = Frame(frameBg,borderwidth=1,relief=SUNKEN,
+                height=2,bg=self.bg).grid(row=7,column=0,sticky=(E,W),columnspan=3,
+                padx=5,pady=5)
+        labelPythonVer = Label(frameBg,text='Python version:  '+
+                sys.version.split()[0],fg=self.fg,bg=self.bg,font=self.textFont)
+        labelPythonVer.grid(row=8,column=0,sticky=W,padx=10,pady=0)
+        #handle weird tk version num in windoze python >= 1.6 (?!?)
+        tkVer = `TkVersion`.split('.')
+        tkVer[len(tkVer)-1] = str('%.3g' % (float('.'+tkVer[len(tkVer)-1])))[2:]
+        if tkVer[len(tkVer)-1] == '': 
+            tkVer[len(tkVer)-1] = '0'
+        tkVer = string.join(tkVer,'.')
+        labelTkVer = Label(frameBg,text='Tk version:  '+tkVer,fg=self.fg,bg=self.bg,
+                font=self.textFont)
+        labelTkVer.grid(row=8,column=1,sticky=W,padx=2,pady=0)
+        #labelOs = Label(frameBg,text='python os name: '+pyching.os,
+        #       font=self.fontText,fg=self.fg,bg=self.bg)
+        #labelOs.grid(row=6,column=0,sticky=W,padx=10,pady=0)
+        #labelOsType = Label(frameBg,text='python os type: '+pyching.osType,
+        #       font=self.fontText,fg=self.fg,bg=self.bg)
+        #labelOsType.grid(row=6,column=1,sticky=W,padx=5,pady=0)
+        #framePad = Frame(frameBg,bg=self.bg,height=5).grid(row=7,column=0)
+
+        self.buttonLicense = Button(frameBg,text='View Readme',underline=5,
+                width=14,highlightbackground=self.bg,command=self.ShowLicense)#takefocus=FALSE
+        self.buttonLicense.grid(row=9,column=0,sticky=W,padx=10,pady=10)
+        self.buttonCredits = Button(frameBg,text='View Credits',underline=5,
+                width=14,highlightbackground=self.bg,command=self.ShowCredits)#takefocus=FALSE
+        self.buttonCredits.grid(row=9,column=1,columnspan=2,sticky=E,padx=10,pady=10)
+
+    def CreditsButtonBinding(self,event):
+        self.buttonCredits.invoke()
+
+    def LicenseButtonBinding(self,event):
+        self.buttonLicense.invoke()
+
+    def ShowLicense(self):
+        self.ViewFile('About - Readme','README.txt')
+        
+    def ShowCredits(self):
+        self.ViewFile('About - Credits','CREDITS.txt')
+
+    def ViewFile(self,viewTitle,viewFile):
+        fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),viewFile)
+        textView.TextViewer(self,viewTitle,fn)
+
+    def Ok(self, event=None):
+        self.destroy()
     
-  def CreateWidgets(self):
-    frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
-    frameButtons = Frame(self)
-    frameButtons.pack(side=BOTTOM,fill=X)
-    frameMain.pack(side=TOP,expand=TRUE,fill=BOTH)
-    self.buttonOk = Button(frameButtons,text='Ok',
-        command=self.Ok)#,default=ACTIVE
-    self.buttonOk.pack(padx=5,pady=5)
-    #self.picture = Image('photo',data=self.pictureData)
-    frameBg = Frame(frameMain,bg=self.bg)
-    frameBg.pack(expand=TRUE,fill=BOTH)
-    labelTitle = Label(frameBg,text='IDLEfork',fg=self.fg,bg=self.bg,
-        font=('courier', 24, 'bold'))
-    labelTitle.grid(row=0,column=0,sticky=W,padx=10,pady=10)
-    #labelPicture = Label(frameBg,text='[picture]')
-    #image=self.picture,bg=self.bg)
-    #labelPicture.grid(row=0,column=1,sticky=W,rowspan=2,padx=0,pady=3)
-    labelVersion = Label(frameBg,text='version  '+idlever.IDLE_VERSION,
-        fg=self.fg,bg=self.bg,font=self.textFont)
-    labelVersion.grid(row=1,column=0,sticky=W,padx=10,pady=5)
-    labelCopyright = Label(frameBg,
-        text="A development version of Python's lightweight\n"+
-        'Integrated DeveLopment Environment, IDLE.',
-        justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
-    labelCopyright.grid(row=2,column=0,sticky=W,columnspan=3,padx=10,pady=5)
-    labelLicense = Label(frameBg,
-        text='Licenced under the Python 2.1.1 PSF Licence\n'+
-        '(a GPL compatible licence with extra freedoms)',
-        justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
-    labelLicense.grid(row=3,column=0,sticky=W,columnspan=3,padx=10,pady=5)
-    framePad = Frame(frameBg,height=5,bg=self.bg).grid(row=4,column=0)
-    labelEmail = Label(frameBg,text='email:  idle-dev@python.org',
-        justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
-    labelEmail.grid(row=5,column=0,columnspan=2,sticky=W,padx=10,pady=0)
-    labelWWW = Label(frameBg,text='www:  http://idlefork.sourceforge.net',
-        justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
-    labelWWW.grid(row=6,column=0,columnspan=2,sticky=W,padx=10,pady=0)
-    frameDivider = Frame(frameBg,borderwidth=1,relief=SUNKEN,
-        height=2,bg=self.bg).grid(row=7,column=0,sticky=(E,W),columnspan=3,
-        padx=5,pady=5)
-    labelPythonVer = Label(frameBg,text='Python version:  '+
-        sys.version.split()[0],fg=self.fg,bg=self.bg,font=self.textFont)
-    labelPythonVer.grid(row=8,column=0,sticky=W,padx=10,pady=0)
-    #handle weird tk version num in windoze python >= 1.6 (?!?)
-    tkVer = `TkVersion`.split('.')
-    tkVer[len(tkVer)-1] = str('%.3g' % (float('.'+tkVer[len(tkVer)-1])))[2:]
-    if tkVer[len(tkVer)-1] == '': 
-      tkVer[len(tkVer)-1] = '0'
-    tkVer = string.join(tkVer,'.')
-    labelTkVer = Label(frameBg,text='Tk version:  '+tkVer,fg=self.fg,bg=self.bg,
-        font=self.textFont)
-    labelTkVer.grid(row=8,column=1,sticky=W,padx=2,pady=0)
-    #labelOs = Label(frameBg,text='python os name: '+pyching.os,
-    #       font=self.fontText,fg=self.fg,bg=self.bg)
-    #labelOs.grid(row=6,column=0,sticky=W,padx=10,pady=0)
-    #labelOsType = Label(frameBg,text='python os type: '+pyching.osType,
-    #       font=self.fontText,fg=self.fg,bg=self.bg)
-    #labelOsType.grid(row=6,column=1,sticky=W,padx=5,pady=0)
-    #framePad = Frame(frameBg,bg=self.bg,height=5).grid(row=7,column=0)
-
-    self.buttonLicense = Button(frameBg,text='View Readme',underline=5,
-        width=14,highlightbackground=self.bg,command=self.ShowLicense)#takefocus=FALSE
-    self.buttonLicense.grid(row=9,column=0,sticky=W,padx=10,pady=10)
-    self.buttonCredits = Button(frameBg,text='View Credits',underline=5,
-        width=14,highlightbackground=self.bg,command=self.ShowCredits)#takefocus=FALSE
-    self.buttonCredits.grid(row=9,column=1,columnspan=2,sticky=E,padx=10,pady=10)
-
-  def CreditsButtonBinding(self,event):
-    self.buttonCredits.invoke()
-
-  def LicenseButtonBinding(self,event):
-    self.buttonLicense.invoke()
-
-  def ShowLicense(self):
-    textView.TextViewer(self,title='About - Readme',
-          fileName='./README.txt')
-    
-  def ShowCredits(self):
-    textView.TextViewer(self,title='About - Credits',
-          fileName='./CREDITS.txt')
-    
-  def Ok(self, event=None):
-    self.destroy()
-
 if __name__ == '__main__':
-  #test the dialog
-  root=Tk()
-  Button(root,text='About',command=lambda:AboutDialog(root,'About')).pack()
-  root.mainloop()
+    #test the dialog
+    root=Tk()
+    def run():
+        import aboutDialog
+        aboutDialog.AboutDialog(root,'About')
+    Button(root,text='Dialog',command=run).pack()
+    root.mainloop()
