215 lines · 5.6 KB · Python
RawDownload
## Instant Python# $Id: tkFileDialog.py 36560 2004-07-18 06:16:08Z tim_one $## tk common file dialogues## this module 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.## written by Fredrik Lundh, May 1997.# ## 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##  from tkCommonDialog import Dialog class _Dialog(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 if __name__ == "__main__":    # 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)