# $Id: tkFileDialog.py,v 1.13 2004/07/18 06:14:44 tim_one Exp $
# 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
# 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
# - initialdir: initial directory. preserved by dialog instance.
# - initialfile: initial file (ignored by the open dialog). preserved
# - parent: which window to place the dialog on top of
# - 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
# make sure "filetypes" is a tuple
self
.options
["filetypes"] = tuple(self
.options
["filetypes"])
def _fixresult(self
, widget
, result
):
# keep directory and filename until next time
# convert Tcl path objects to strings
path
, file = os
.path
.split(result
)
self
.options
["initialdir"] = path
self
.options
["initialfile"] = file
self
.filename
= result
# compatibility
"Ask for a filename to open"
command
= "tk_getOpenFile"
def _fixresult(self
, widget
, result
):
if isinstance(result
, tuple):
result
= tuple([getattr(r
, "string", r
) for r
in result
])
path
, file = os
.path
.split(result
[0])
self
.options
["initialdir"] = path
# don't set initialfile or filename, as we have multiple of these
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
)
"Ask for a filename to save as"
command
= "tk_getSaveFile"
# the directory dialog has its own _fix routines.
command
= "tk_chooseDirectory"
def _fixresult(self
, widget
, result
):
# convert Tcl path objects to strings
# keep directory until next time
self
.options
["initialdir"] = result
self
.directory
= result
# compatibility
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
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()
return open(filename
, mode
)
def askopenfiles(mode
= "r", **options
):
"""Ask for multiple filenames and return the open file
returns a list of open file objects or an empty list if
files
= askopenfilenames(**options
)
ofiles
.append(open(filename
, mode
))
def asksaveasfile(mode
= "w", **options
):
"Ask for a filename to save as, and returned the opened file"
filename
= SaveAs(**options
).show()
return open(filename
, mode
)
def askdirectory (**options
):
"Ask for a directory, and return the file name"
return Directory(**options
).show()
# --------------------------------------------------------------------
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.
# See whether CODESET is defined
locale
.setlocale(locale
.LC_ALL
,'')
enc
= locale
.nl_langinfo(locale
.CODESET
)
except (ImportError, AttributeError):
# dialog for openening files
openfilename
=askopenfilename(filetypes
=[("all files", "*")])
fp
=open(openfilename
,"r")
print "Could not open File: "
print "open", openfilename
.encode(enc
)
# dialog for saving files
saveasfilename
=asksaveasfilename()
print "saveas", saveasfilename
.encode(enc
)