14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# An Introduction to Tkinter
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# tkSimpleDialog.py
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Copyright (c) 1997 by Fredrik Lundh
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# fredrik@pythonware.com
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# http://www.pythonware.com
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# --------------------------------------------------------------------
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# dialog base class
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao'''Dialog boxes
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis module handles dialog boxes. It contains the following
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaopublic symbols:
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDialog -- a base class for dialogs
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaskinteger -- get an integer from the user
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaskfloat -- get a float from the user
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaskstring -- get a string from the user
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao'''
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom Tkinter import *
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Dialog(Toplevel):
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''Class to open dialogs.
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This class is intended as a base class for custom dialogs
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, parent, title = None):
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''Initialize a dialog.
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Arguments:
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parent -- a parent window (the application window)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            title -- the dialog title
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Toplevel.__init__(self, parent)
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.withdraw() # remain invisible for now
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # If the master is not viewable, don't
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # make the child transient, or else it
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # would be opened withdrawn
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if parent.winfo_viewable():
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.transient(parent)
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if title:
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.title(title)
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.parent = parent
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.result = None
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        body = Frame(self)
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.initial_focus = self.body(body)
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        body.pack(padx=5, pady=5)
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.buttonbox()
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.initial_focus:
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.initial_focus = self
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.protocol("WM_DELETE_WINDOW", self.cancel)
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.parent is not None:
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      parent.winfo_rooty()+50))
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.deiconify() # become visibile now
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.initial_focus.focus_set()
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # wait for window to appear on screen before calling grab_set
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.wait_visibility()
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.grab_set()
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.wait_window(self)
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def destroy(self):
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''Destroy the window'''
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.initial_focus = None
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Toplevel.destroy(self)
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # construction hooks
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def body(self, master):
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''create dialog body.
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return widget that should have initial focus.
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        This method should be overridden, and is called
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        by the __init__ method.
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def buttonbox(self):
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''add standard button box.
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        override if you do not want the standard buttons
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        box = Frame(self)
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        w.pack(side=LEFT, padx=5, pady=5)
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        w = Button(box, text="Cancel", width=10, command=self.cancel)
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        w.pack(side=LEFT, padx=5, pady=5)
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.bind("<Return>", self.ok)
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.bind("<Escape>", self.cancel)
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        box.pack()
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # standard button semantics
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def ok(self, event=None):
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.validate():
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.initial_focus.focus_set() # put focus back
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.withdraw()
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.update_idletasks()
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.apply()
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cancel()
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def cancel(self, event=None):
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # put focus back to the parent window
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.parent is not None:
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.parent.focus_set()
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.destroy()
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # command hooks
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def validate(self):
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''validate the data
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        This method is called automatically to validate the data before the
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dialog is destroyed. By default, it always validates OK.
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1 # override
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def apply(self):
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''process the data
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        This method is called automatically to process the data, *after*
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        the dialog is destroyed. By default, it does nothing.
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        '''
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass # override
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# --------------------------------------------------------------------
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# convenience dialogues
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryDialog(Dialog):
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, title, prompt,
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 initialvalue=None,
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 minvalue = None, maxvalue = None,
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 parent = None):
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not parent:
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import Tkinter
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parent = Tkinter._default_root
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.prompt   = prompt
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.minvalue = minvalue
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.maxvalue = maxvalue
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.initialvalue = initialvalue
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Dialog.__init__(self, parent, title)
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def destroy(self):
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.entry = None
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Dialog.destroy(self)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def body(self, master):
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        w = Label(master, text=self.prompt, justify=LEFT)
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        w.grid(row=0, padx=5, sticky=W)
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.entry = Entry(master, name="entry")
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.entry.grid(row=1, padx=5, sticky=W+E)
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.initialvalue is not None:
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.entry.insert(0, self.initialvalue)
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.entry.select_range(0, END)
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.entry
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def validate(self):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import tkMessageBox
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = self.getresult()
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tkMessageBox.showwarning(
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "Illegal value",
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.errormessage + "\nPlease try again",
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parent = self
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.minvalue is not None and result < self.minvalue:
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tkMessageBox.showwarning(
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "Too small",
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "The allowed minimum value is %s. "
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "Please try again." % self.minvalue,
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parent = self
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.maxvalue is not None and result > self.maxvalue:
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tkMessageBox.showwarning(
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "Too large",
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "The allowed maximum value is %s. "
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "Please try again." % self.maxvalue,
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                parent = self
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.result = result
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryInteger(_QueryDialog):
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    errormessage = "Not an integer."
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def getresult(self):
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return int(self.entry.get())
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef askinteger(title, prompt, **kw):
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''get an integer from the user
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Arguments:
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title -- the dialog title
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prompt -- the label text
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        **kw -- see SimpleDialog class
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Return value is an integer
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    d = _QueryInteger(title, prompt, **kw)
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return d.result
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryFloat(_QueryDialog):
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    errormessage = "Not a floating point value."
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def getresult(self):
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return float(self.entry.get())
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef askfloat(title, prompt, **kw):
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''get a float from the user
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Arguments:
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title -- the dialog title
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prompt -- the label text
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        **kw -- see SimpleDialog class
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Return value is a float
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    d = _QueryFloat(title, prompt, **kw)
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return d.result
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _QueryString(_QueryDialog):
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *args, **kw):
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if "show" in kw:
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.__show = kw["show"]
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del kw["show"]
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.__show = None
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _QueryDialog.__init__(self, *args, **kw)
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def body(self, master):
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        entry = _QueryDialog.body(self, master)
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.__show is not None:
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            entry.configure(show=self.__show)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return entry
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def getresult(self):
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.entry.get()
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef askstring(title, prompt, **kw):
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''get a string from the user
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Arguments:
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        title -- the dialog title
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prompt -- the label text
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        **kw -- see SimpleDialog class
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Return value is a string
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    '''
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    d = _QueryString(title, prompt, **kw)
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return d.result
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    root = Tk()
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    root.update()
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print askinteger("Spam", "Egg count", initialvalue=12*12)
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100)
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    print askstring("Spam", "Egg label")
324