Mercurial > cpython-lru_cache-weakref
annotate Lib/tkinter/filedialog.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | bf92327eeda8 |
| children |
| rev | line source |
|---|---|
| 3031 | 1 """File selection dialog classes. |
| 2 | |
| 3 Classes: | |
| 4 | |
| 5 - FileDialog | |
| 6 - LoadFileDialog | |
| 7 - SaveFileDialog | |
| 8 | |
|
47132
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
9 This module also presents tk common file dialogues, it provides interfaces |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
10 to the native file dialogues available in Tk 4.2 and newer, and the |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
11 directory dialogue available in Tk 8.3 and newer. |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
12 These interfaces were written by Fredrik Lundh, May 1997. |
| 3031 | 13 """ |
| 14 | |
|
47130
ef4cca2d6171
Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents:
47129
diff
changeset
|
15 from tkinter import * |
|
ef4cca2d6171
Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents:
47129
diff
changeset
|
16 from tkinter.dialog import Dialog |
|
47132
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
17 from tkinter import commondialog |
| 3031 | 18 |
| 19 import os | |
| 20 import fnmatch | |
| 21 | |
| 22 | |
| 3643 | 23 dialogstates = {} |
| 24 | |
| 25 | |
| 3031 | 26 class FileDialog: |
| 27 | |
| 28 """Standard file selection dialog -- no checks on selected file. | |
| 29 | |
| 30 Usage: | |
| 31 | |
| 32 d = FileDialog(master) | |
|
27325
c404879cf999
Fix example in a docstring to not use 'file' as a variable name
Andrew M. Kuchling <amk@amk.ca>
parents:
13620
diff
changeset
|
33 fname = d.go(dir_or_file, pattern, default, key) |
|
c404879cf999
Fix example in a docstring to not use 'file' as a variable name
Andrew M. Kuchling <amk@amk.ca>
parents:
13620
diff
changeset
|
34 if fname is None: ...canceled... |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
35 else: ...open file... |
| 3643 | 36 |
| 37 All arguments to go() are optional. | |
| 38 | |
| 39 The 'key' argument specifies a key in the global dictionary | |
| 40 'dialogstates', which keeps track of the values for the directory | |
| 41 and pattern arguments, overriding the values passed in (it does | |
| 42 not keep track of the default argument!). If no key is specified, | |
| 43 the dialog keeps no memory of previous state. Note that memory is | |
|
13620
5b727ab37092
Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents:
8227
diff
changeset
|
44 kept even when the dialog is canceled. (All this emulates the |
| 3643 | 45 behavior of the Macintosh file selection dialogs.) |
| 3031 | 46 |
| 47 """ | |
| 48 | |
| 49 title = "File Selection Dialog" | |
| 50 | |
| 3643 | 51 def __init__(self, master, title=None): |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
52 if title is None: title = self.title |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
53 self.master = master |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
54 self.directory = None |
| 3643 | 55 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
56 self.top = Toplevel(master) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
57 self.top.title(title) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
58 self.top.iconname(title) |
| 3643 | 59 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
60 self.botframe = Frame(self.top) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
61 self.botframe.pack(side=BOTTOM, fill=X) |
| 3643 | 62 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
63 self.selection = Entry(self.top) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
64 self.selection.pack(side=BOTTOM, fill=X) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
65 self.selection.bind('<Return>', self.ok_event) |
| 3643 | 66 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
67 self.filter = Entry(self.top) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
68 self.filter.pack(side=TOP, fill=X) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
69 self.filter.bind('<Return>', self.filter_command) |
| 3643 | 70 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
71 self.midframe = Frame(self.top) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
72 self.midframe.pack(expand=YES, fill=BOTH) |
| 3643 | 73 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
74 self.filesbar = Scrollbar(self.midframe) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
75 self.filesbar.pack(side=RIGHT, fill=Y) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
76 self.files = Listbox(self.midframe, exportselection=0, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
77 yscrollcommand=(self.filesbar, 'set')) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
78 self.files.pack(side=RIGHT, expand=YES, fill=BOTH) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
79 btags = self.files.bindtags() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
80 self.files.bindtags(btags[1:] + btags[:1]) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
81 self.files.bind('<ButtonRelease-1>', self.files_select_event) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
82 self.files.bind('<Double-ButtonRelease-1>', self.files_double_event) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
83 self.filesbar.config(command=(self.files, 'yview')) |
| 3643 | 84 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
85 self.dirsbar = Scrollbar(self.midframe) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
86 self.dirsbar.pack(side=LEFT, fill=Y) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
87 self.dirs = Listbox(self.midframe, exportselection=0, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
88 yscrollcommand=(self.dirsbar, 'set')) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
89 self.dirs.pack(side=LEFT, expand=YES, fill=BOTH) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
90 self.dirsbar.config(command=(self.dirs, 'yview')) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
91 btags = self.dirs.bindtags() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
92 self.dirs.bindtags(btags[1:] + btags[:1]) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
93 self.dirs.bind('<ButtonRelease-1>', self.dirs_select_event) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
94 self.dirs.bind('<Double-ButtonRelease-1>', self.dirs_double_event) |
| 3643 | 95 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
96 self.ok_button = Button(self.botframe, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
97 text="OK", |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
98 command=self.ok_command) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
99 self.ok_button.pack(side=LEFT) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
100 self.filter_button = Button(self.botframe, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
101 text="Filter", |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
102 command=self.filter_command) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
103 self.filter_button.pack(side=LEFT, expand=YES) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
104 self.cancel_button = Button(self.botframe, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
105 text="Cancel", |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
106 command=self.cancel_command) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
107 self.cancel_button.pack(side=RIGHT) |
| 3031 | 108 |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
109 self.top.protocol('WM_DELETE_WINDOW', self.cancel_command) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
110 # XXX Are the following okay for a general audience? |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
111 self.top.bind('<Alt-w>', self.cancel_command) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
112 self.top.bind('<Alt-W>', self.cancel_command) |
| 3643 | 113 |
| 114 def go(self, dir_or_file=os.curdir, pattern="*", default="", key=None): | |
|
39592
0f135affabf2
Couple more has_keys() going...
Guido van Rossum <guido@python.org>
parents:
32940
diff
changeset
|
115 if key and key in dialogstates: |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
116 self.directory, pattern = dialogstates[key] |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
117 else: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
118 dir_or_file = os.path.expanduser(dir_or_file) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
119 if os.path.isdir(dir_or_file): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
120 self.directory = dir_or_file |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
121 else: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
122 self.directory, default = os.path.split(dir_or_file) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
123 self.set_filter(self.directory, pattern) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
124 self.set_selection(default) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
125 self.filter_command() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
126 self.selection.focus_set() |
|
32940
22ded309648b
Wait for visibility before setting a grab. Fixes #946153.
Martin v. Löwis <martin@v.loewis.de>
parents:
31515
diff
changeset
|
127 self.top.wait_visibility() # window needs to be visible for the grab |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
128 self.top.grab_set() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
129 self.how = None |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
130 self.master.mainloop() # Exited by self.quit(how) |
|
8227
4a13a4d2588b
When a file name is selected ("OK" button, <Return> in the filename entry),
Fred Drake <fdrake@acm.org>
parents:
7731
diff
changeset
|
131 if key: |
|
4a13a4d2588b
When a file name is selected ("OK" button, <Return> in the filename entry),
Fred Drake <fdrake@acm.org>
parents:
7731
diff
changeset
|
132 directory, pattern = self.get_filter() |
|
4a13a4d2588b
When a file name is selected ("OK" button, <Return> in the filename entry),
Fred Drake <fdrake@acm.org>
parents:
7731
diff
changeset
|
133 if self.how: |
|
4a13a4d2588b
When a file name is selected ("OK" button, <Return> in the filename entry),
Fred Drake <fdrake@acm.org>
parents:
7731
diff
changeset
|
134 directory = os.path.dirname(self.how) |
|
4a13a4d2588b
When a file name is selected ("OK" button, <Return> in the filename entry),
Fred Drake <fdrake@acm.org>
parents:
7731
diff
changeset
|
135 dialogstates[key] = directory, pattern |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
136 self.top.destroy() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
137 return self.how |
| 3643 | 138 |
| 139 def quit(self, how=None): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
140 self.how = how |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
141 self.master.quit() # Exit mainloop() |
| 3031 | 142 |
| 143 def dirs_double_event(self, event): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
144 self.filter_command() |
| 3031 | 145 |
| 146 def dirs_select_event(self, event): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
147 dir, pat = self.get_filter() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
148 subdir = self.dirs.get('active') |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
149 dir = os.path.normpath(os.path.join(self.directory, subdir)) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
150 self.set_filter(dir, pat) |
| 3031 | 151 |
| 152 def files_double_event(self, event): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
153 self.ok_command() |
| 3031 | 154 |
| 155 def files_select_event(self, event): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
156 file = self.files.get('active') |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
157 self.set_selection(file) |
| 3031 | 158 |
| 159 def ok_event(self, event): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
160 self.ok_command() |
| 3031 | 161 |
| 162 def ok_command(self): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
163 self.quit(self.get_selection()) |
| 3031 | 164 |
| 165 def filter_command(self, event=None): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
166 dir, pat = self.get_filter() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
167 try: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
168 names = os.listdir(dir) |
|
80916
bf92327eeda8
Replace os.error with OSError in tkinter and IDLE
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
73345
diff
changeset
|
169 except OSError: |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
170 self.master.bell() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
171 return |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
172 self.directory = dir |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
173 self.set_filter(dir, pat) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
174 names.sort() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
175 subdirs = [os.pardir] |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
176 matchingfiles = [] |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
177 for name in names: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
178 fullname = os.path.join(dir, name) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
179 if os.path.isdir(fullname): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
180 subdirs.append(name) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
181 elif fnmatch.fnmatch(name, pat): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
182 matchingfiles.append(name) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
183 self.dirs.delete(0, END) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
184 for name in subdirs: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
185 self.dirs.insert(END, name) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
186 self.files.delete(0, END) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
187 for name in matchingfiles: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
188 self.files.insert(END, name) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
189 head, tail = os.path.split(self.get_selection()) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
190 if tail == os.curdir: tail = '' |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
191 self.set_selection(tail) |
| 3031 | 192 |
| 193 def get_filter(self): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
194 filter = self.filter.get() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
195 filter = os.path.expanduser(filter) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
196 if filter[-1:] == os.sep or os.path.isdir(filter): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
197 filter = os.path.join(filter, "*") |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
198 return os.path.split(filter) |
| 3031 | 199 |
| 3643 | 200 def get_selection(self): |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
201 file = self.selection.get() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
202 file = os.path.expanduser(file) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
203 return file |
| 3643 | 204 |
| 205 def cancel_command(self, event=None): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
206 self.quit() |
| 3031 | 207 |
| 208 def set_filter(self, dir, pat): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
209 if not os.path.isabs(dir): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
210 try: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
211 pwd = os.getcwd() |
|
80916
bf92327eeda8
Replace os.error with OSError in tkinter and IDLE
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
73345
diff
changeset
|
212 except OSError: |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
213 pwd = None |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
214 if pwd: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
215 dir = os.path.join(pwd, dir) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
216 dir = os.path.normpath(dir) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
217 self.filter.delete(0, END) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
218 self.filter.insert(END, os.path.join(dir or os.curdir, pat or "*")) |
| 3031 | 219 |
| 220 def set_selection(self, file): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
221 self.selection.delete(0, END) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
222 self.selection.insert(END, os.path.join(self.directory, file)) |
| 3031 | 223 |
| 224 | |
| 225 class LoadFileDialog(FileDialog): | |
| 226 | |
| 227 """File selection dialog which checks that the file exists.""" | |
| 228 | |
| 229 title = "Load File Selection Dialog" | |
| 230 | |
| 231 def ok_command(self): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
232 file = self.get_selection() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
233 if not os.path.isfile(file): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
234 self.master.bell() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
235 else: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
236 self.quit(file) |
| 3031 | 237 |
| 238 | |
| 239 class SaveFileDialog(FileDialog): | |
| 240 | |
| 241 """File selection dialog which checks that the file may be created.""" | |
| 242 | |
| 243 title = "Save File Selection Dialog" | |
| 244 | |
| 245 def ok_command(self): | |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
246 file = self.get_selection() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
247 if os.path.exists(file): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
248 if os.path.isdir(file): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
249 self.master.bell() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
250 return |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
251 d = Dialog(self.top, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
252 title="Overwrite Existing File Question", |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
27325
diff
changeset
|
253 text="Overwrite existing file %r?" % (file,), |
|
7731
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
254 bitmap='questhead', |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
255 default=1, |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
256 strings=("Yes", "Cancel")) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
257 if d.num != 0: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
258 return |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
259 else: |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
260 head, tail = os.path.split(file) |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
261 if not os.path.isdir(head): |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
262 self.master.bell() |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
263 return |
|
9c37ed8868b9
Give in to the tab police.
Guido van Rossum <guido@python.org>
parents:
4893
diff
changeset
|
264 self.quit(file) |
| 3031 | 265 |
| 266 | |
|
47132
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
267 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
268 # For the following classes and modules: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
269 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
270 # options (all have default values): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
271 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
272 # - defaultextension: added to filename if not explicitly given |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
273 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
274 # - filetypes: sequence of (label, pattern) tuples. the same pattern |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
275 # may occur with several patterns. use "*" as pattern to indicate |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
276 # all files. |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
277 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
278 # - initialdir: initial directory. preserved by dialog instance. |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
279 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
280 # - initialfile: initial file (ignored by the open dialog). preserved |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
281 # by dialog instance. |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
282 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
283 # - parent: which window to place the dialog on top of |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
284 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
285 # - title: dialog title |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
286 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
287 # - multiple: if true user may select more than one file |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
288 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
289 # options for the directory chooser: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
290 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
291 # - initialdir, parent, title: see above |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
292 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
293 # - mustexist: if true, user must pick an existing directory |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
294 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
295 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
296 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
297 class _Dialog(commondialog.Dialog): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
298 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
299 def _fixoptions(self): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
300 try: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
301 # make sure "filetypes" is a tuple |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
302 self.options["filetypes"] = tuple(self.options["filetypes"]) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
303 except KeyError: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
304 pass |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
305 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
306 def _fixresult(self, widget, result): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
307 if result: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
308 # keep directory and filename until next time |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
309 # convert Tcl path objects to strings |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
310 try: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
311 result = result.string |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
312 except AttributeError: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
313 # it already is a string |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
314 pass |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
315 path, file = os.path.split(result) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
316 self.options["initialdir"] = path |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
317 self.options["initialfile"] = file |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
318 self.filename = result # compatibility |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
319 return result |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
320 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
321 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
322 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
323 # file dialogs |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
324 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
325 class Open(_Dialog): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
326 "Ask for a filename to open" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
327 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
328 command = "tk_getOpenFile" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
329 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
330 def _fixresult(self, widget, result): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
331 if isinstance(result, tuple): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
332 # multiple results: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
333 result = tuple([getattr(r, "string", r) for r in result]) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
334 if result: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
335 path, file = os.path.split(result[0]) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
336 self.options["initialdir"] = path |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
337 # don't set initialfile or filename, as we have multiple of these |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
338 return result |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
339 if not widget.tk.wantobjects() and "multiple" in self.options: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
340 # Need to split result explicitly |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
341 return self._fixresult(widget, widget.tk.splitlist(result)) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
342 return _Dialog._fixresult(self, widget, result) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
343 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
344 class SaveAs(_Dialog): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
345 "Ask for a filename to save as" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
346 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
347 command = "tk_getSaveFile" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
348 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
349 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
350 # the directory dialog has its own _fix routines. |
|
50401
7239fbcdcd4f
Merged revisions 68103 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47132
diff
changeset
|
351 class Directory(commondialog.Dialog): |
|
47132
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
352 "Ask for a directory" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
353 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
354 command = "tk_chooseDirectory" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
355 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
356 def _fixresult(self, widget, result): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
357 if result: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
358 # convert Tcl path objects to strings |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
359 try: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
360 result = result.string |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
361 except AttributeError: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
362 # it already is a string |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
363 pass |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
364 # keep directory until next time |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
365 self.options["initialdir"] = result |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
366 self.directory = result # compatibility |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
367 return result |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
368 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
369 # |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
370 # convenience stuff |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
371 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
372 def askopenfilename(**options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
373 "Ask for a filename to open" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
374 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
375 return Open(**options).show() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
376 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
377 def asksaveasfilename(**options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
378 "Ask for a filename to save as" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
379 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
380 return SaveAs(**options).show() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
381 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
382 def askopenfilenames(**options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
383 """Ask for multiple filenames to open |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
384 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
385 Returns a list of filenames or empty list if |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
386 cancel button selected |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
387 """ |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
388 options["multiple"]=1 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
389 return Open(**options).show() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
390 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
391 # FIXME: are the following perhaps a bit too convenient? |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
392 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
393 def askopenfile(mode = "r", **options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
394 "Ask for a filename to open, and returned the opened file" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
395 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
396 filename = Open(**options).show() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
397 if filename: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
398 return open(filename, mode) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
399 return None |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
400 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
401 def askopenfiles(mode = "r", **options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
402 """Ask for multiple filenames and return the open file |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
403 objects |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
404 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
405 returns a list of open file objects or an empty list if |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
406 cancel selected |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
407 """ |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
408 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
409 files = askopenfilenames(**options) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
410 if files: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
411 ofiles=[] |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
412 for filename in files: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
413 ofiles.append(open(filename, mode)) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
414 files=ofiles |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
415 return files |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
416 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
417 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
418 def asksaveasfile(mode = "w", **options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
419 "Ask for a filename to save as, and returned the opened file" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
420 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
421 filename = SaveAs(**options).show() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
422 if filename: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
423 return open(filename, mode) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
424 return None |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
425 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
426 def askdirectory (**options): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
427 "Ask for a directory, and return the file name" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
428 return Directory(**options).show() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
429 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
430 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
431 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
432 # -------------------------------------------------------------------- |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
433 # test stuff |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
434 |
| 3031 | 435 def test(): |
| 436 """Simple test program.""" | |
| 437 root = Tk() | |
| 438 root.withdraw() | |
| 439 fd = LoadFileDialog(root) | |
| 3643 | 440 loadfile = fd.go(key="test") |
| 3031 | 441 fd = SaveFileDialog(root) |
| 3643 | 442 savefile = fd.go(key="test") |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
39592
diff
changeset
|
443 print(loadfile, savefile) |
| 3031 | 444 |
|
47132
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
445 # Since the file name may contain non-ASCII characters, we need |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
446 # to find an encoding that likely supports the file name, and |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
447 # displays correctly on the terminal. |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
448 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
449 # Start off with UTF-8 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
450 enc = "utf-8" |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
451 import sys |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
452 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
453 # See whether CODESET is defined |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
454 try: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
455 import locale |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
456 locale.setlocale(locale.LC_ALL,'') |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
457 enc = locale.nl_langinfo(locale.CODESET) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
458 except (ImportError, AttributeError): |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
459 pass |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
460 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
461 # dialog for openening files |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
462 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
463 openfilename=askopenfilename(filetypes=[("all files", "*")]) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
464 try: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
465 fp=open(openfilename,"r") |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
466 fp.close() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
467 except: |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
468 print("Could not open File: ") |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
469 print(sys.exc_info()[1]) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
470 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
471 print("open", openfilename.encode(enc)) |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
472 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
473 # dialog for saving files |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
474 |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
475 saveasfilename=asksaveasfilename() |
|
8a74612f3d2b
Tkinter, step 4: merge simple- and filedialog modules.
Georg Brandl <georg@python.org>
parents:
47130
diff
changeset
|
476 print("saveas", saveasfilename.encode(enc)) |
| 3031 | 477 |
| 478 if __name__ == '__main__': | |
| 479 test() |
