blob: eb2a90027e285b1dcad960543dcf4b572ee46517 [file] [log] [blame]
Guido van Rossum1e8c8a21997-07-19 20:02:36 +00001#
2# Instant Python
3# $Id$
4#
5# tk common file dialogues
6#
7# this module provides interfaces to the native file dialogues
8# available in Tk 4.2 and newer.
9#
10# written by Fredrik Lundh, May 1997.
11#
12
13#
14# options (all have default values):
15#
16# - defaultextension: added to filename if not explicitly given
17#
18# - filetypes: sequence of (label, pattern) tuples. the same pattern
19# may occur with several patterns. use "*" as pattern to indicate
20# all files.
21#
22# - initialdir: initial directory. preserved by dialog instance.
23#
24# - initialfile: initial file (ignored by the open dialog). preserved
25# by dialog instance.
26#
27# - parent: which window to place the dialog on top of
28#
29# - title: dialog title
30#
31
32from tkCommonDialog import Dialog
33
34class _Dialog(Dialog):
35
36 def _fixoptions(self):
37 try:
38 # make sure "filetypes" is a tuple
39 self.options["filetypes"] = tuple(self.options["filetypes"])
40 except KeyError:
41 pass
42
43 def _fixresult(self, widget, result):
Guido van Rossumc4570481998-03-20 20:45:49 +000044 if result:
45 # keep directory and filename until next time
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000046 import os
Guido van Rossumc4570481998-03-20 20:45:49 +000047 path, file = os.path.split(result)
48 self.options["initialdir"] = path
49 self.options["initialfile"] = file
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000050 self.filename = result # compatibility
Guido van Rossumc4570481998-03-20 20:45:49 +000051 return result
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000052
53
54#
55# file dialogs
56
57class Open(_Dialog):
58 "Ask for a filename to open"
59
60 command = "tk_getOpenFile"
61
62class SaveAs(_Dialog):
63 "Ask for a filename to save as"
64
65 command = "tk_getSaveFile"
66
Martin v. Löwis25ee87c2001-11-07 22:38:08 +000067class Directory(_Dialog):
68 "Ask for a directory"
69
70 command = "tk_chooseDirectory"
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000071
72#
73# convenience stuff
74
75def askopenfilename(**options):
76 "Ask for a filename to open"
77
Martin v. Löwis25ee87c2001-11-07 22:38:08 +000078 return Open(**options).show()
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000079
80def asksaveasfilename(**options):
81 "Ask for a filename to save as"
82
Martin v. Löwis25ee87c2001-11-07 22:38:08 +000083 return SaveAs(**options).show()
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000084
85# FIXME: are the following two perhaps a bit too convenient?
86
87def askopenfile(mode = "r", **options):
88 "Ask for a filename to open, and returned the opened file"
89
Martin v. Löwis25ee87c2001-11-07 22:38:08 +000090 filename = Open(**options).show()
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000091 if filename:
92 return open(filename, mode)
93 return None
94
95def asksaveasfile(mode = "w", **options):
96 "Ask for a filename to save as, and returned the opened file"
97
Martin v. Löwis25ee87c2001-11-07 22:38:08 +000098 filename = SaveAs(**options).show()
Guido van Rossum1e8c8a21997-07-19 20:02:36 +000099 if filename:
100 return open(filename, mode)
101 return None
102
Martin v. Löwis25ee87c2001-11-07 22:38:08 +0000103def askdirectory (**options):
104 "Ask for a directory, and return the file name"
105 return Directory(**options).show()
Guido van Rossum1e8c8a21997-07-19 20:02:36 +0000106
107# --------------------------------------------------------------------
108# test stuff
109
110if __name__ == "__main__":
111
112 print "open", askopenfilename(filetypes=[("all filez", "*")])
113 print "saveas", asksaveasfilename()