tkFileDialog.py 3.82 KB
Newer Older
1 2 3 4 5 6 7
#
# Instant Python
# $Id$
#
# tk common file dialogues
#
# this module provides interfaces to the native file dialogues
8 9
# available in Tk 4.2 and newer, and the directory dialogue available
# in Tk 8.3 and newer.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#
# 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
#
32 33 34 35 36 37
# options for the directory chooser:
#
# - initialdir, parent, title: see above
#
# - mustexist: if true, user must pick an existing directory
#
38 39 40 41 42 43 44 45 46 47 48 49 50

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):
51 52
        if result:
            # keep directory and filename until next time
53
            import os
54 55 56
            path, file = os.path.split(result)
            self.options["initialdir"] = path
            self.options["initialfile"] = file
57
        self.filename = result # compatibility
58
        return result
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73


#
# file dialogs

class Open(_Dialog):
    "Ask for a filename to open"

    command = "tk_getOpenFile"

class SaveAs(_Dialog):
    "Ask for a filename to save as"

    command = "tk_getSaveFile"

74 75 76

# the directory dialog has its own _fix routines.
class Directory(Dialog):
77 78 79
    "Ask for a directory"

    command = "tk_chooseDirectory"
80

81 82 83 84 85 86 87
    def _fixresult(self, widget, result):
        if result:
            # keep directory until next time
            self.options["initialdir"] = result
        self.directory = result # compatibility
        return result

88 89 90 91 92 93
#
# convenience stuff

def askopenfilename(**options):
    "Ask for a filename to open"

94
    return Open(**options).show()
95 96 97 98

def asksaveasfilename(**options):
    "Ask for a filename to save as"

99
    return SaveAs(**options).show()
100 101 102 103 104 105

# FIXME: are the following two perhaps a bit too convenient?

def askopenfile(mode = "r", **options):
    "Ask for a filename to open, and returned the opened file"

106
    filename = Open(**options).show()
107 108 109 110 111 112 113
    if filename:
        return open(filename, mode)
    return None

def asksaveasfile(mode = "w", **options):
    "Ask for a filename to save as, and returned the opened file"

114
    filename = SaveAs(**options).show()
115 116 117 118
    if filename:
        return open(filename, mode)
    return None

119 120 121
def askdirectory (**options):
    "Ask for a directory, and return the file name"
    return Directory(**options).show()
122 123 124 125 126

# --------------------------------------------------------------------
# test stuff

if __name__ == "__main__":
127 128 129 130 131 132
    # 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"
133
    import sys
134 135 136 137

    # See whether CODESET is defined
    try:
        import locale
138
        locale.setlocale(locale.LC_ALL,'')
139 140 141 142
        enc = locale.nl_langinfo(locale.CODESET)
    except (ImportError, AttributeError):
        pass

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
    # 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)
159