annotate Lib/lib-tk/FileDialog.py @ 4893:c2eac126e8ff legacy-trunk

Fix the following bug: - When dragging the mouse in either listbox, the *first* entry clicked on is selected rather than the last (but the last one is highlighted). This is done by changing the bindtags so that our binding is executed after the default binding (which sets the 'active' index to the last item selected), and using 'active' instead of 'anchor' as the index to ask for.
author Guido van Rossum <guido@python.org>
date Fri, 03 Jan 1997 23:39:26 +0000
parents 0d1463a45b6f
children 9c37ed8868b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 """File selection dialog classes.
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 Classes:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 - FileDialog
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 - LoadFileDialog
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 - SaveFileDialog
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 """
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 from Tkinter import *
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 from Dialog import Dialog
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 import os
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 import fnmatch
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
18 dialogstates = {}
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
19
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
20
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 class FileDialog:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 """Standard file selection dialog -- no checks on selected file.
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 Usage:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 d = FileDialog(master)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
28 file = d.go(dir_or_file, pattern, default, key)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 if file is None: ...canceled...
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
30 else: ...open file...
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
31
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
32 All arguments to go() are optional.
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
33
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
34 The 'key' argument specifies a key in the global dictionary
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
35 'dialogstates', which keeps track of the values for the directory
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
36 and pattern arguments, overriding the values passed in (it does
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
37 not keep track of the default argument!). If no key is specified,
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
38 the dialog keeps no memory of previous state. Note that memory is
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
39 kept even when the dialog is cancelled. (All this emulates the
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
40 behavior of the Macintosh file selection dialogs.)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 """
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 title = "File Selection Dialog"
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
46 def __init__(self, master, title=None):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
47 if title is None: title = self.title
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 self.master = master
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 self.directory = None
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
50
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 self.top = Toplevel(master)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
52 self.top.title(title)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
53 self.top.iconname(title)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
54
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
55 self.botframe = Frame(self.top)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
56 self.botframe.pack(side=BOTTOM, fill=X)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
57
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
58 self.selection = Entry(self.top)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
59 self.selection.pack(side=BOTTOM, fill=X)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
60 self.selection.bind('<Return>', self.ok_event)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
61
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 self.filter = Entry(self.top)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
63 self.filter.pack(side=TOP, fill=X)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 self.filter.bind('<Return>', self.filter_command)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
65
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 self.midframe = Frame(self.top)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 self.midframe.pack(expand=YES, fill=BOTH)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
68
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
69 self.filesbar = Scrollbar(self.midframe)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
70 self.filesbar.pack(side=RIGHT, fill=Y)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
71 self.files = Listbox(self.midframe, exportselection=0,
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
72 yscrollcommand=(self.filesbar, 'set'))
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 self.files.pack(side=RIGHT, expand=YES, fill=BOTH)
4893
c2eac126e8ff Fix the following bug:
Guido van Rossum <guido@python.org>
parents: 3643
diff changeset
74 btags = self.files.bindtags()
c2eac126e8ff Fix the following bug:
Guido van Rossum <guido@python.org>
parents: 3643
diff changeset
75 self.files.bindtags(btags[1:] + btags[:1])
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 self.files.bind('<ButtonRelease-1>', self.files_select_event)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 self.files.bind('<Double-ButtonRelease-1>', self.files_double_event)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
78 self.filesbar.config(command=(self.files, 'yview'))
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
79
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
80 self.dirsbar = Scrollbar(self.midframe)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
81 self.dirsbar.pack(side=LEFT, fill=Y)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
82 self.dirs = Listbox(self.midframe, exportselection=0,
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
83 yscrollcommand=(self.dirsbar, 'set'))
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
84 self.dirs.pack(side=LEFT, expand=YES, fill=BOTH)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
85 self.dirsbar.config(command=(self.dirs, 'yview'))
4893
c2eac126e8ff Fix the following bug:
Guido van Rossum <guido@python.org>
parents: 3643
diff changeset
86 btags = self.dirs.bindtags()
c2eac126e8ff Fix the following bug:
Guido van Rossum <guido@python.org>
parents: 3643
diff changeset
87 self.dirs.bindtags(btags[1:] + btags[:1])
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
88 self.dirs.bind('<ButtonRelease-1>', self.dirs_select_event)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
89 self.dirs.bind('<Double-ButtonRelease-1>', self.dirs_double_event)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
90
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 self.ok_button = Button(self.botframe,
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 text="OK",
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 command=self.ok_command)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 self.ok_button.pack(side=LEFT)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 self.filter_button = Button(self.botframe,
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 text="Filter",
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 command=self.filter_command)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 self.filter_button.pack(side=LEFT, expand=YES)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 self.cancel_button = Button(self.botframe,
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 text="Cancel",
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 command=self.cancel_command)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 self.cancel_button.pack(side=RIGHT)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
104 self.top.protocol('WM_DELETE_WINDOW', self.cancel_command)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
105 # XXX Are the following okay for a general audience?
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
106 self.top.bind('<Alt-w>', self.cancel_command)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
107 self.top.bind('<Alt-W>', self.cancel_command)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
108
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
109 def go(self, dir_or_file=os.curdir, pattern="*", default="", key=None):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
110 if key and dialogstates.has_key(key):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
111 self.directory, pattern = dialogstates[key]
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
112 else:
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
113 dir_or_file = os.path.expanduser(dir_or_file)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
114 if os.path.isdir(dir_or_file):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
115 self.directory = dir_or_file
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
116 else:
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
117 self.directory, default = os.path.split(dir_or_file)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
118 self.set_filter(self.directory, pattern)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
119 self.set_selection(default)
3068
31c52a0a372c Filter button should set selection's directory, too
Guido van Rossum <guido@python.org>
parents: 3031
diff changeset
120 self.filter_command()
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 self.selection.focus_set()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 self.top.grab_set()
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
123 self.how = None
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
124 self.master.mainloop() # Exited by self.quit(how)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
125 if key: dialogstates[key] = self.get_filter()
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
126 self.top.destroy()
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
127 return self.how
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
128
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
129 def quit(self, how=None):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
130 self.how = how
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
131 self.master.quit() # Exit mainloop()
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 def dirs_double_event(self, event):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 self.filter_command()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 def dirs_select_event(self, event):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 dir, pat = self.get_filter()
4893
c2eac126e8ff Fix the following bug:
Guido van Rossum <guido@python.org>
parents: 3643
diff changeset
138 subdir = self.dirs.get('active')
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 dir = os.path.normpath(os.path.join(self.directory, subdir))
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 self.set_filter(dir, pat)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 def files_double_event(self, event):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 self.ok_command()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 def files_select_event(self, event):
4893
c2eac126e8ff Fix the following bug:
Guido van Rossum <guido@python.org>
parents: 3643
diff changeset
146 file = self.files.get('active')
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 self.set_selection(file)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 def ok_event(self, event):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 self.ok_command()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 def ok_command(self):
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
153 self.quit(self.get_selection())
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 def filter_command(self, event=None):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 dir, pat = self.get_filter()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 try:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 names = os.listdir(dir)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 except os.error:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 self.master.bell()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 return
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 self.directory = dir
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 self.set_filter(dir, pat)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 names.sort()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 subdirs = [os.pardir]
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 matchingfiles = []
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 for name in names:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 fullname = os.path.join(dir, name)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 if os.path.isdir(fullname):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 subdirs.append(name)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 elif fnmatch.fnmatch(name, pat):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 matchingfiles.append(name)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 self.dirs.delete(0, END)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 for name in subdirs:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 self.dirs.insert(END, name)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 self.files.delete(0, END)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 for name in matchingfiles:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 self.files.insert(END, name)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
179 head, tail = os.path.split(self.get_selection())
3068
31c52a0a372c Filter button should set selection's directory, too
Guido van Rossum <guido@python.org>
parents: 3031
diff changeset
180 if tail == os.curdir: tail = ''
31c52a0a372c Filter button should set selection's directory, too
Guido van Rossum <guido@python.org>
parents: 3031
diff changeset
181 self.set_selection(tail)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 def get_filter(self):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 filter = self.filter.get()
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
185 filter = os.path.expanduser(filter)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
186 if filter[-1:] == os.sep or os.path.isdir(filter):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
187 filter = os.path.join(filter, "*")
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 return os.path.split(filter)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
190 def get_selection(self):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
191 file = self.selection.get()
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
192 file = os.path.expanduser(file)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
193 return file
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
194
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
195 def cancel_command(self, event=None):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
196 self.quit()
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 def set_filter(self, dir, pat):
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
199 if not os.path.isabs(dir):
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
200 try:
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
201 pwd = os.getcwd()
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
202 except os.error:
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
203 pwd = None
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
204 if pwd:
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
205 dir = os.path.join(pwd, dir)
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
206 dir = os.path.normpath(dir)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 self.filter.delete(0, END)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 self.filter.insert(END, os.path.join(dir or os.curdir, pat or "*"))
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 def set_selection(self, file):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 self.selection.delete(0, END)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 self.selection.insert(END, os.path.join(self.directory, file))
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 class LoadFileDialog(FileDialog):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 """File selection dialog which checks that the file exists."""
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 title = "Load File Selection Dialog"
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 def ok_command(self):
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
222 file = self.get_selection()
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 if not os.path.isfile(file):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 self.master.bell()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 else:
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
226 self.quit(file)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 class SaveFileDialog(FileDialog):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 """File selection dialog which checks that the file may be created."""
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 title = "Save File Selection Dialog"
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 def ok_command(self):
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
236 file = self.get_selection()
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 if os.path.exists(file):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 if os.path.isdir(file):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 self.master.bell()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 return
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
241 d = Dialog(self.top,
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 title="Overwrite Existing File Question",
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 text="Overwrite existing file %s?" % `file`,
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 bitmap='questhead',
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
245 default=1,
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 strings=("Yes", "Cancel"))
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
247 if d.num != 0:
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
248 return
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 else:
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 head, tail = os.path.split(file)
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 if not os.path.isdir(head):
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 self.master.bell()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 return
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
254 self.quit(file)
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 def test():
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 """Simple test program."""
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 root = Tk()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 root.withdraw()
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 fd = LoadFileDialog(root)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
262 loadfile = fd.go(key="test")
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 fd = SaveFileDialog(root)
3643
0d1463a45b6f Major overhaul:
Guido van Rossum <guido@python.org>
parents: 3642
diff changeset
264 savefile = fd.go(key="test")
3031
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 print loadfile, savefile
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 if __name__ == '__main__':
9c49ace6b1e7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 test()