diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py
deleted file mode 100644
index 8583cb0..0000000
--- a/Lib/tkinter/filedialog.py
+++ /dev/null
@@ -1,481 +0,0 @@
-"""File selection dialog classes.
-
-Classes:
-
-- FileDialog
-- LoadFileDialog
-- SaveFileDialog
-
-This module also presents tk common file dialogues, it provides interfaces
-to the native file dialogues available in Tk 4.2 and newer, and the
-directory dialogue available in Tk 8.3 and newer.
-These interfaces were written by Fredrik Lundh, May 1997.
-"""
-
-from tkinter import *
-from tkinter.dialog import Dialog
-from tkinter import commondialog
-
-import os
-import fnmatch
-
-
-dialogstates = {}
-
-
-class FileDialog:
-
-    """Standard file selection dialog -- no checks on selected file.
-
-    Usage:
-
-        d = FileDialog(master)
-        fname = d.go(dir_or_file, pattern, default, key)
-        if fname is None: ...canceled...
-        else: ...open file...
-
-    All arguments to go() are optional.
-
-    The 'key' argument specifies a key in the global dictionary
-    'dialogstates', which keeps track of the values for the directory
-    and pattern arguments, overriding the values passed in (it does
-    not keep track of the default argument!).  If no key is specified,
-    the dialog keeps no memory of previous state.  Note that memory is
-    kept even when the dialog is canceled.  (All this emulates the
-    behavior of the Macintosh file selection dialogs.)
-
-    """
-
-    title = "File Selection Dialog"
-
-    def __init__(self, master, title=None):
-        if title is None: title = self.title
-        self.master = master
-        self.directory = None
-
-        self.top = Toplevel(master)
-        self.top.title(title)
-        self.top.iconname(title)
-
-        self.botframe = Frame(self.top)
-        self.botframe.pack(side=BOTTOM, fill=X)
-
-        self.selection = Entry(self.top)
-        self.selection.pack(side=BOTTOM, fill=X)
-        self.selection.bind('<Return>', self.ok_event)
-
-        self.filter = Entry(self.top)
-        self.filter.pack(side=TOP, fill=X)
-        self.filter.bind('<Return>', self.filter_command)
-
-        self.midframe = Frame(self.top)
-        self.midframe.pack(expand=YES, fill=BOTH)
-
-        self.filesbar = Scrollbar(self.midframe)
-        self.filesbar.pack(side=RIGHT, fill=Y)
-        self.files = Listbox(self.midframe, exportselection=0,
-                             yscrollcommand=(self.filesbar, 'set'))
-        self.files.pack(side=RIGHT, expand=YES, fill=BOTH)
-        btags = self.files.bindtags()
-        self.files.bindtags(btags[1:] + btags[:1])
-        self.files.bind('<ButtonRelease-1>', self.files_select_event)
-        self.files.bind('<Double-ButtonRelease-1>', self.files_double_event)
-        self.filesbar.config(command=(self.files, 'yview'))
-
-        self.dirsbar = Scrollbar(self.midframe)
-        self.dirsbar.pack(side=LEFT, fill=Y)
-        self.dirs = Listbox(self.midframe, exportselection=0,
-                            yscrollcommand=(self.dirsbar, 'set'))
-        self.dirs.pack(side=LEFT, expand=YES, fill=BOTH)
-        self.dirsbar.config(command=(self.dirs, 'yview'))
-        btags = self.dirs.bindtags()
-        self.dirs.bindtags(btags[1:] + btags[:1])
-        self.dirs.bind('<ButtonRelease-1>', self.dirs_select_event)
-        self.dirs.bind('<Double-ButtonRelease-1>', self.dirs_double_event)
-
-        self.ok_button = Button(self.botframe,
-                                 text="OK",
-                                 command=self.ok_command)
-        self.ok_button.pack(side=LEFT)
-        self.filter_button = Button(self.botframe,
-                                    text="Filter",
-                                    command=self.filter_command)
-        self.filter_button.pack(side=LEFT, expand=YES)
-        self.cancel_button = Button(self.botframe,
-                                    text="Cancel",
-                                    command=self.cancel_command)
-        self.cancel_button.pack(side=RIGHT)
-
-        self.top.protocol('WM_DELETE_WINDOW', self.cancel_command)
-        # XXX Are the following okay for a general audience?
-        self.top.bind('<Alt-w>', self.cancel_command)
-        self.top.bind('<Alt-W>', self.cancel_command)
-
-    def go(self, dir_or_file=os.curdir, pattern="*", default="", key=None):
-        if key and dialogstates.has_key(key):
-            self.directory, pattern = dialogstates[key]
-        else:
-            dir_or_file = os.path.expanduser(dir_or_file)
-            if os.path.isdir(dir_or_file):
-                self.directory = dir_or_file
-            else:
-                self.directory, default = os.path.split(dir_or_file)
-        self.set_filter(self.directory, pattern)
-        self.set_selection(default)
-        self.filter_command()
-        self.selection.focus_set()
-        self.top.wait_visibility() # window needs to be visible for the grab
-        self.top.grab_set()
-        self.how = None
-        self.master.mainloop()          # Exited by self.quit(how)
-        if key:
-            directory, pattern = self.get_filter()
-            if self.how:
-                directory = os.path.dirname(self.how)
-            dialogstates[key] = directory, pattern
-        self.top.destroy()
-        return self.how
-
-    def quit(self, how=None):
-        self.how = how
-        self.master.quit()              # Exit mainloop()
-
-    def dirs_double_event(self, event):
-        self.filter_command()
-
-    def dirs_select_event(self, event):
-        dir, pat = self.get_filter()
-        subdir = self.dirs.get('active')
-        dir = os.path.normpath(os.path.join(self.directory, subdir))
-        self.set_filter(dir, pat)
-
-    def files_double_event(self, event):
-        self.ok_command()
-
-    def files_select_event(self, event):
-        file = self.files.get('active')
-        self.set_selection(file)
-
-    def ok_event(self, event):
-        self.ok_command()
-
-    def ok_command(self):
-        self.quit(self.get_selection())
-
-    def filter_command(self, event=None):
-        dir, pat = self.get_filter()
-        try:
-            names = os.listdir(dir)
-        except os.error:
-            self.master.bell()
-            return
-        self.directory = dir
-        self.set_filter(dir, pat)
-        names.sort()
-        subdirs = [os.pardir]
-        matchingfiles = []
-        for name in names:
-            fullname = os.path.join(dir, name)
-            if os.path.isdir(fullname):
-                subdirs.append(name)
-            elif fnmatch.fnmatch(name, pat):
-                matchingfiles.append(name)
-        self.dirs.delete(0, END)
-        for name in subdirs:
-            self.dirs.insert(END, name)
-        self.files.delete(0, END)
-        for name in matchingfiles:
-            self.files.insert(END, name)
-        head, tail = os.path.split(self.get_selection())
-        if tail == os.curdir: tail = ''
-        self.set_selection(tail)
-
-    def get_filter(self):
-        filter = self.filter.get()
-        filter = os.path.expanduser(filter)
-        if filter[-1:] == os.sep or os.path.isdir(filter):
-            filter = os.path.join(filter, "*")
-        return os.path.split(filter)
-
-    def get_selection(self):
-        file = self.selection.get()
-        file = os.path.expanduser(file)
-        return file
-
-    def cancel_command(self, event=None):
-        self.quit()
-
-    def set_filter(self, dir, pat):
-        if not os.path.isabs(dir):
-            try:
-                pwd = os.getcwd()
-            except os.error:
-                pwd = None
-            if pwd:
-                dir = os.path.join(pwd, dir)
-                dir = os.path.normpath(dir)
-        self.filter.delete(0, END)
-        self.filter.insert(END, os.path.join(dir or os.curdir, pat or "*"))
-
-    def set_selection(self, file):
-        self.selection.delete(0, END)
-        self.selection.insert(END, os.path.join(self.directory, file))
-
-
-class LoadFileDialog(FileDialog):
-
-    """File selection dialog which checks that the file exists."""
-
-    title = "Load File Selection Dialog"
-
-    def ok_command(self):
-        file = self.get_selection()
-        if not os.path.isfile(file):
-            self.master.bell()
-        else:
-            self.quit(file)
-
-
-class SaveFileDialog(FileDialog):
-
-    """File selection dialog which checks that the file may be created."""
-
-    title = "Save File Selection Dialog"
-
-    def ok_command(self):
-        file = self.get_selection()
-        if os.path.exists(file):
-            if os.path.isdir(file):
-                self.master.bell()
-                return
-            d = Dialog(self.top,
-                       title="Overwrite Existing File Question",
-                       text="Overwrite existing file %r?" % (file,),
-                       bitmap='questhead',
-                       default=1,
-                       strings=("Yes", "Cancel"))
-            if d.num != 0:
-                return
-        else:
-            head, tail = os.path.split(file)
-            if not os.path.isdir(head):
-                self.master.bell()
-                return
-        self.quit(file)
-
-
-
-# For the following classes and modules:
-#
-# options (all have default values):
-#
-# - defaultextension: added to filename if not explicitly given
-#
-# - filetypes: sequence of (label, pattern) tuples.  the same pattern
-#   may occur with several patterns.  use "*" as pattern to indicate
-#   all files.
-#
-# - initialdir: initial directory.  preserved by dialog instance.
-#
-# - initialfile: initial file (ignored by the open dialog).  preserved
-#   by dialog instance.
-#
-# - parent: which window to place the dialog on top of
-#
-# - title: dialog title
-#
-# - multiple: if true user may select more than one file
-#
-# options for the directory chooser:
-#
-# - initialdir, parent, title: see above
-#
-# - mustexist: if true, user must pick an existing directory
-#
-
-
-class _Dialog(commondialog.Dialog):
-
-    def _fixoptions(self):
-        try:
-            # make sure "filetypes" is a tuple
-            self.options["filetypes"] = tuple(self.options["filetypes"])
-        except KeyError:
-            pass
-
-    def _fixresult(self, widget, result):
-        if result:
-            # keep directory and filename until next time
-            import os
-            # convert Tcl path objects to strings
-            try:
-                result = result.string
-            except AttributeError:
-                # it already is a string
-                pass
-            path, file = os.path.split(result)
-            self.options["initialdir"] = path
-            self.options["initialfile"] = file
-        self.filename = result # compatibility
-        return result
-
-
-#
-# file dialogs
-
-class Open(_Dialog):
-    "Ask for a filename to open"
-
-    command = "tk_getOpenFile"
-
-    def _fixresult(self, widget, result):
-        if isinstance(result, tuple):
-            # multiple results:
-            result = tuple([getattr(r, "string", r) for r in result])
-            if result:
-                import os
-                path, file = os.path.split(result[0])
-                self.options["initialdir"] = path
-                # don't set initialfile or filename, as we have multiple of these
-            return result
-        if not widget.tk.wantobjects() and "multiple" in self.options:
-            # Need to split result explicitly
-            return self._fixresult(widget, widget.tk.splitlist(result))
-        return _Dialog._fixresult(self, widget, result)
-
-class SaveAs(_Dialog):
-    "Ask for a filename to save as"
-
-    command = "tk_getSaveFile"
-
-
-# the directory dialog has its own _fix routines.
-class Directory(Dialog):
-    "Ask for a directory"
-
-    command = "tk_chooseDirectory"
-
-    def _fixresult(self, widget, result):
-        if result:
-            # convert Tcl path objects to strings
-            try:
-                result = result.string
-            except AttributeError:
-                # it already is a string
-                pass
-            # keep directory until next time
-            self.options["initialdir"] = result
-        self.directory = result # compatibility
-        return result
-
-#
-# convenience stuff
-
-def askopenfilename(**options):
-    "Ask for a filename to open"
-
-    return Open(**options).show()
-
-def asksaveasfilename(**options):
-    "Ask for a filename to save as"
-
-    return SaveAs(**options).show()
-
-def askopenfilenames(**options):
-    """Ask for multiple filenames to open
-
-    Returns a list of filenames or empty list if
-    cancel button selected
-    """
-    options["multiple"]=1
-    return Open(**options).show()
-
-# FIXME: are the following  perhaps a bit too convenient?
-
-def askopenfile(mode = "r", **options):
-    "Ask for a filename to open, and returned the opened file"
-
-    filename = Open(**options).show()
-    if filename:
-        return open(filename, mode)
-    return None
-
-def askopenfiles(mode = "r", **options):
-    """Ask for multiple filenames and return the open file
-    objects
-
-    returns a list of open file objects or an empty list if
-    cancel selected
-    """
-
-    files = askopenfilenames(**options)
-    if files:
-        ofiles=[]
-        for filename in files:
-            ofiles.append(open(filename, mode))
-        files=ofiles
-    return files
-
-
-def asksaveasfile(mode = "w", **options):
-    "Ask for a filename to save as, and returned the opened file"
-
-    filename = SaveAs(**options).show()
-    if filename:
-        return open(filename, mode)
-    return None
-
-def askdirectory (**options):
-    "Ask for a directory, and return the file name"
-    return Directory(**options).show()
-
-
-
-# --------------------------------------------------------------------
-# test stuff
-
-def test():
-    """Simple test program."""
-    root = Tk()
-    root.withdraw()
-    fd = LoadFileDialog(root)
-    loadfile = fd.go(key="test")
-    fd = SaveFileDialog(root)
-    savefile = fd.go(key="test")
-    print loadfile, savefile
-
-    # Since the file name may contain non-ASCII characters, we need
-    # to find an encoding that likely supports the file name, and
-    # displays correctly on the terminal.
-
-    # Start off with UTF-8
-    enc = "utf-8"
-    import sys
-
-    # See whether CODESET is defined
-    try:
-        import locale
-        locale.setlocale(locale.LC_ALL,'')
-        enc = locale.nl_langinfo(locale.CODESET)
-    except (ImportError, AttributeError):
-        pass
-
-    # dialog for openening files
-
-    openfilename=askopenfilename(filetypes=[("all files", "*")])
-    try:
-        fp=open(openfilename,"r")
-        fp.close()
-    except:
-        print "Could not open File: "
-        print sys.exc_info()[1]
-
-    print "open", openfilename.encode(enc)
-
-    # dialog for saving files
-
-    saveasfilename=asksaveasfilename()
-    print "saveas", saveasfilename.encode(enc)
-
-if __name__ == '__main__':
-    test()
diff --git a/Lib/tkinter/simpledialog.py b/Lib/tkinter/simpledialog.py
deleted file mode 100644
index 7fa5d69..0000000
--- a/Lib/tkinter/simpledialog.py
+++ /dev/null
@@ -1,421 +0,0 @@
-#
-# An Introduction to Tkinter
-#
-# Copyright (c) 1997 by Fredrik Lundh
-#
-# This copyright applies to Dialog, askinteger, askfloat and asktring
-#
-# fredrik@pythonware.com
-# http://www.pythonware.com
-#
-"""This modules handles dialog boxes.
-
-It contains the following public symbols:
-
-SimpleDialog -- A simple but flexible modal dialog box
-
-Dialog -- a base class for dialogs
-
-askinteger -- get an integer from the user
-
-askfloat -- get a float from the user
-
-askstring -- get a string from the user
-"""
-
-from tkinter import *
-from tkinter import messagebox
-
-import tkinter # used at _QueryDialog for tkinter._default_root
-
-class SimpleDialog:
-
-    def __init__(self, master,
-                 text='', buttons=[], default=None, cancel=None,
-                 title=None, class_=None):
-        if class_:
-            self.root = Toplevel(master, class_=class_)
-        else:
-            self.root = Toplevel(master)
-        if title:
-            self.root.title(title)
-            self.root.iconname(title)
-        self.message = Message(self.root, text=text, aspect=400)
-        self.message.pack(expand=1, fill=BOTH)
-        self.frame = Frame(self.root)
-        self.frame.pack()
-        self.num = default
-        self.cancel = cancel
-        self.default = default
-        self.root.bind('<Return>', self.return_event)
-        for num in range(len(buttons)):
-            s = buttons[num]
-            b = Button(self.frame, text=s,
-                       command=(lambda self=self, num=num: self.done(num)))
-            if num == default:
-                b.config(relief=RIDGE, borderwidth=8)
-            b.pack(side=LEFT, fill=BOTH, expand=1)
-        self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
-        self._set_transient(master)
-
-    def _set_transient(self, master, relx=0.5, rely=0.3):
-        widget = self.root
-        widget.withdraw() # Remain invisible while we figure out the geometry
-        widget.transient(master)
-        widget.update_idletasks() # Actualize geometry information
-        if master.winfo_ismapped():
-            m_width = master.winfo_width()
-            m_height = master.winfo_height()
-            m_x = master.winfo_rootx()
-            m_y = master.winfo_rooty()
-        else:
-            m_width = master.winfo_screenwidth()
-            m_height = master.winfo_screenheight()
-            m_x = m_y = 0
-        w_width = widget.winfo_reqwidth()
-        w_height = widget.winfo_reqheight()
-        x = m_x + (m_width - w_width) * relx
-        y = m_y + (m_height - w_height) * rely
-        if x+w_width > master.winfo_screenwidth():
-            x = master.winfo_screenwidth() - w_width
-        elif x < 0:
-            x = 0
-        if y+w_height > master.winfo_screenheight():
-            y = master.winfo_screenheight() - w_height
-        elif y < 0:
-            y = 0
-        widget.geometry("+%d+%d" % (x, y))
-        widget.deiconify() # Become visible at the desired location
-
-    def go(self):
-        self.root.wait_visibility()
-        self.root.grab_set()
-        self.root.mainloop()
-        self.root.destroy()
-        return self.num
-
-    def return_event(self, event):
-        if self.default is None:
-            self.root.bell()
-        else:
-            self.done(self.default)
-
-    def wm_delete_window(self):
-        if self.cancel is None:
-            self.root.bell()
-        else:
-            self.done(self.cancel)
-
-    def done(self, num):
-        self.num = num
-        self.root.quit()
-
-
-class Dialog(Toplevel):
-
-    '''Class to open dialogs.
-
-    This class is intended as a base class for custom dialogs
-    '''
-
-    def __init__(self, parent, title = None):
-
-        '''Initialize a dialog.
-
-        Arguments:
-
-            parent -- a parent window (the application window)
-
-            title -- the dialog title
-        '''
-        Toplevel.__init__(self, parent)
-
-        # If the master is not viewable, don't
-        # make the child transient, or else it
-        # would be opened withdrawn
-        if parent.winfo_viewable():
-            self.transient(parent)
-
-        if title:
-            self.title(title)
-
-        self.parent = parent
-
-        self.result = None
-
-        body = Frame(self)
-        self.initial_focus = self.body(body)
-        body.pack(padx=5, pady=5)
-
-        self.buttonbox()
-
-        self.wait_visibility() # window needs to be visible for the grab
-        self.grab_set()
-
-        if not self.initial_focus:
-            self.initial_focus = self
-
-        self.protocol("WM_DELETE_WINDOW", self.cancel)
-
-        if self.parent is not None:
-            self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
-                                      parent.winfo_rooty()+50))
-
-        self.initial_focus.focus_set()
-
-        self.wait_window(self)
-
-    def destroy(self):
-        '''Destroy the window'''
-        self.initial_focus = None
-        Toplevel.destroy(self)
-
-    #
-    # construction hooks
-
-    def body(self, master):
-        '''create dialog body.
-
-        return widget that should have initial focus.
-        This method should be overridden, and is called
-        by the __init__ method.
-        '''
-        pass
-
-    def buttonbox(self):
-        '''add standard button box.
-
-        override if you do not want the standard buttons
-        '''
-
-        box = Frame(self)
-
-        w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
-        w.pack(side=LEFT, padx=5, pady=5)
-        w = Button(box, text="Cancel", width=10, command=self.cancel)
-        w.pack(side=LEFT, padx=5, pady=5)
-
-        self.bind("<Return>", self.ok)
-        self.bind("<Escape>", self.cancel)
-
-        box.pack()
-
-    #
-    # standard button semantics
-
-    def ok(self, event=None):
-
-        if not self.validate():
-            self.initial_focus.focus_set() # put focus back
-            return
-
-        self.withdraw()
-        self.update_idletasks()
-
-        try:
-            self.apply()
-        finally:
-            self.cancel()
-
-    def cancel(self, event=None):
-
-        # put focus back to the parent window
-        if self.parent is not None:
-            self.parent.focus_set()
-        self.destroy()
-
-    #
-    # command hooks
-
-    def validate(self):
-        '''validate the data
-
-        This method is called automatically to validate the data before the
-        dialog is destroyed. By default, it always validates OK.
-        '''
-
-        return 1 # override
-
-    def apply(self):
-        '''process the data
-
-        This method is called automatically to process the data, *after*
-        the dialog is destroyed. By default, it does nothing.
-        '''
-
-        pass # override
-
-
-# --------------------------------------------------------------------
-# convenience dialogues
-
-class _QueryDialog(Dialog):
-
-    def __init__(self, title, prompt,
-                 initialvalue=None,
-                 minvalue = None, maxvalue = None,
-                 parent = None):
-
-        if not parent:
-            parent = tkinter._default_root
-
-        self.prompt   = prompt
-        self.minvalue = minvalue
-        self.maxvalue = maxvalue
-
-        self.initialvalue = initialvalue
-
-        Dialog.__init__(self, parent, title)
-
-    def destroy(self):
-        self.entry = None
-        Dialog.destroy(self)
-
-    def body(self, master):
-
-        w = Label(master, text=self.prompt, justify=LEFT)
-        w.grid(row=0, padx=5, sticky=W)
-
-        self.entry = Entry(master, name="entry")
-        self.entry.grid(row=1, padx=5, sticky=W+E)
-
-        if self.initialvalue:
-            self.entry.insert(0, self.initialvalue)
-            self.entry.select_range(0, END)
-
-        return self.entry
-
-    def validate(self):
-        try:
-            result = self.getresult()
-        except ValueError:
-            messagebox.showwarning(
-                "Illegal value",
-                self.errormessage + "\nPlease try again",
-                parent = self
-            )
-            return 0
-
-        if self.minvalue is not None and result < self.minvalue:
-            messagebox.showwarning(
-                "Too small",
-                "The allowed minimum value is %s. "
-                "Please try again." % self.minvalue,
-                parent = self
-            )
-            return 0
-
-        if self.maxvalue is not None and result > self.maxvalue:
-            messagebox.showwarning(
-                "Too large",
-                "The allowed maximum value is %s. "
-                "Please try again." % self.maxvalue,
-                parent = self
-            )
-            return 0
-
-        self.result = result
-
-        return 1
-
-
-class _QueryInteger(_QueryDialog):
-    errormessage = "Not an integer."
-    def getresult(self):
-        return int(self.entry.get())
-
-def askinteger(title, prompt, **kw):
-    '''get an integer from the user
-
-    Arguments:
-
-        title -- the dialog title
-        prompt -- the label text
-        **kw -- see SimpleDialog class
-
-    Return value is an integer
-    '''
-    d = _QueryInteger(title, prompt, **kw)
-    return d.result
-
-class _QueryFloat(_QueryDialog):
-    errormessage = "Not a floating point value."
-    def getresult(self):
-        return float(self.entry.get())
-
-def askfloat(title, prompt, **kw):
-    '''get a float from the user
-
-    Arguments:
-
-        title -- the dialog title
-        prompt -- the label text
-        **kw -- see SimpleDialog class
-
-    Return value is a float
-    '''
-    d = _QueryFloat(title, prompt, **kw)
-    return d.result
-
-class _QueryString(_QueryDialog):
-    def __init__(self, *args, **kw):
-        if kw.has_key("show"):
-            self.__show = kw["show"]
-            del kw["show"]
-        else:
-            self.__show = None
-        _QueryDialog.__init__(self, *args, **kw)
-
-    def body(self, master):
-        entry = _QueryDialog.body(self, master)
-        if self.__show is not None:
-            entry.configure(show=self.__show)
-        return entry
-
-    def getresult(self):
-        return self.entry.get()
-
-def askstring(title, prompt, **kw):
-    '''get a string from the user
-
-    Arguments:
-
-        title -- the dialog title
-        prompt -- the label text
-        **kw -- see SimpleDialog class
-
-    Return value is a string
-    '''
-    d = _QueryString(title, prompt, **kw)
-    return d.result
-
-
-
-if __name__ == '__main__':
-
-    def test():
-        root = Tk()
-        def doit(root=root):
-            d = SimpleDialog(root,
-                         text="This is a test dialog.  "
-                              "Would this have been an actual dialog, "
-                              "the buttons below would have been glowing "
-                              "in soft pink light.\n"
-                              "Do you believe this?",
-                         buttons=["Yes", "No", "Cancel"],
-                         default=0,
-                         cancel=2,
-                         title="Test Dialog")
-            print d.go()
-            print askinteger("Spam", "Egg count", initialvalue=12*12)
-            print askfloat("Spam", "Egg weight\n(in tons)", minvalue=1,
-                           maxvalue=100)
-            print askstring("Spam", "Egg label")
-
-        t = Button(root, text='Test', command=doit)
-        t.pack()
-        q = Button(root, text='Quit', command=t.quit)
-        q.pack()
-        t.mainloop()
-
-    test()
