| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Instant Python | 
					
						
							|  |  |  | # $Id$ | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # tk common file dialogues | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # this module provides interfaces to the native file dialogues | 
					
						
							| 
									
										
										
										
											2001-11-08 17:51:33 +00:00
										 |  |  | # available in Tk 4.2 and newer, and the directory dialogue available | 
					
						
							|  |  |  | # in Tk 8.3 and newer. | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # 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 | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2002-10-13 10:28:04 +00:00
										 |  |  | # - multiple: if true user may select more than one file | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2001-11-08 17:51:33 +00:00
										 |  |  | # options for the directory chooser: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # - initialdir, parent, title: see above | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # - mustexist: if true, user must pick an existing directory | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2002-10-13 10:28:04 +00:00
										 |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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): | 
					
						
							| 
									
										
										
										
											1998-03-20 20:45:49 +00:00
										 |  |  |         if result: | 
					
						
							|  |  |  |             # keep directory and filename until next time | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  |             import os | 
					
						
							| 
									
										
										
										
											2003-01-04 00:08:09 +00:00
										 |  |  |             # convert Tcl path objects to strings | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 result = result.string | 
					
						
							|  |  |  |             except AttributeError: | 
					
						
							|  |  |  |                 # it already is a string | 
					
						
							|  |  |  |                 pass | 
					
						
							| 
									
										
										
										
											1998-03-20 20:45:49 +00:00
										 |  |  |             path, file = os.path.split(result) | 
					
						
							|  |  |  |             self.options["initialdir"] = path | 
					
						
							|  |  |  |             self.options["initialfile"] = file | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  |         self.filename = result # compatibility | 
					
						
							| 
									
										
										
										
											1998-03-20 20:45:49 +00:00
										 |  |  |         return result | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # file dialogs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Open(_Dialog): | 
					
						
							|  |  |  |     "Ask for a filename to open" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     command = "tk_getOpenFile" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-14 21:34:32 +00:00
										 |  |  |     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)) | 
					
						
							| 
									
										
										
										
											2003-06-15 19:08:57 +00:00
										 |  |  |         return _Dialog._fixresult(self, widget, result) | 
					
						
							| 
									
										
										
										
											2003-06-14 21:34:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | class SaveAs(_Dialog): | 
					
						
							|  |  |  |     "Ask for a filename to save as" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     command = "tk_getSaveFile" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-08 17:51:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # the directory dialog has its own _fix routines. | 
					
						
							|  |  |  | class Directory(Dialog): | 
					
						
							| 
									
										
										
										
											2001-11-07 22:38:08 +00:00
										 |  |  |     "Ask for a directory" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     command = "tk_chooseDirectory" | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-08 17:51:33 +00:00
										 |  |  |     def _fixresult(self, widget, result): | 
					
						
							|  |  |  |         if result: | 
					
						
							|  |  |  |             # keep directory until next time | 
					
						
							|  |  |  |             self.options["initialdir"] = result | 
					
						
							|  |  |  |         self.directory = result # compatibility | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # convenience stuff | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def askopenfilename(**options): | 
					
						
							|  |  |  |     "Ask for a filename to open" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-07 22:38:08 +00:00
										 |  |  |     return Open(**options).show() | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def asksaveasfilename(**options): | 
					
						
							|  |  |  |     "Ask for a filename to save as" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-07 22:38:08 +00:00
										 |  |  |     return SaveAs(**options).show() | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-13 10:28:04 +00:00
										 |  |  | def askopenfilenames(**options): | 
					
						
							|  |  |  |     """Ask for multiple filenames to open
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     Returns a list of filenames or empty list if  | 
					
						
							|  |  |  |     cancel button selected | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     options["multiple"]=1 | 
					
						
							| 
									
										
										
										
											2003-06-14 21:34:32 +00:00
										 |  |  |     return Open(**options).show() | 
					
						
							| 
									
										
										
										
											2002-10-13 10:28:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # FIXME: are the following  perhaps a bit too convenient? | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def askopenfile(mode = "r", **options): | 
					
						
							|  |  |  |     "Ask for a filename to open, and returned the opened file" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-07 22:38:08 +00:00
										 |  |  |     filename = Open(**options).show() | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  |     if filename: | 
					
						
							|  |  |  |         return open(filename, mode) | 
					
						
							|  |  |  |     return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-13 10:28:04 +00:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | def asksaveasfile(mode = "w", **options): | 
					
						
							|  |  |  |     "Ask for a filename to save as, and returned the opened file" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-07 22:38:08 +00:00
										 |  |  |     filename = SaveAs(**options).show() | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  |     if filename: | 
					
						
							|  |  |  |         return open(filename, mode) | 
					
						
							|  |  |  |     return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-07 22:38:08 +00:00
										 |  |  | def askdirectory (**options): | 
					
						
							|  |  |  |     "Ask for a directory, and return the file name" | 
					
						
							|  |  |  |     return Directory(**options).show() | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # -------------------------------------------------------------------- | 
					
						
							|  |  |  | # test stuff | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2001-12-30 14:43:56 +00:00
										 |  |  |     # 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" | 
					
						
							| 
									
										
										
										
											2002-04-08 14:51:31 +00:00
										 |  |  |     import sys | 
					
						
							| 
									
										
										
										
											2001-12-30 14:43:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # See whether CODESET is defined | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         import locale | 
					
						
							| 
									
										
										
										
											2002-04-08 14:51:31 +00:00
										 |  |  |         locale.setlocale(locale.LC_ALL,'') | 
					
						
							| 
									
										
										
										
											2001-12-30 14:43:56 +00:00
										 |  |  |         enc = locale.nl_langinfo(locale.CODESET) | 
					
						
							|  |  |  |     except (ImportError, AttributeError): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-08 14:51:31 +00:00
										 |  |  |     # 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) | 
					
						
							| 
									
										
										
										
											1997-07-19 20:02:36 +00:00
										 |  |  | 
 |