320 lines · 7.4 KB · Python
RawDownload
## An Introduction to Tkinter# tkSimpleDialog.py## Copyright (c) 1997 by Fredrik Lundh## fredrik@pythonware.com# http://www.pythonware.com# # --------------------------------------------------------------------# dialog base class '''Dialog boxes This module handles dialog boxes. It contains the followingpublic symbols: 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 *import os 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:            import Tkinter            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):         import tkMessageBox         try:            result = self.getresult()        except ValueError:            tkMessageBox.showwarning(                "Illegal value",                self.errormessage + "\nPlease try again",                parent = self            )            return 0         if self.minvalue is not None and result < self.minvalue:            tkMessageBox.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:            tkMessageBox.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__":     root = Tk()    root.update()     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")