Skip to content

Commit 32b53fb

Browse files
committed
Improve extension management in save mode
1 parent 2e33ee6 commit 32b53fb

File tree

6 files changed

+95
-13
lines changed

6 files changed

+95
-13
lines changed

README.rst

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,11 @@ Changelog
117117

118118
- tkfilebrowser 2.2.0
119119
* Use babel instead of locale in order not to change the locale globally
120-
* Speed up (a little) folder content display (only python >= 3.5)
120+
* Speed up (a little) folder content display
121121
* Improve example: add comparison with default dialogs
122122
* Add select all on Ctrl+A if multiple selection is enabled
123+
* Disable folder creation button if the user does not have write access
124+
* Improve extension management in save mode
123125

124126
- tkfilebrowser 2.1.1
125127
* Fix error if LOCAL_PATH does not exists or is not writtable
@@ -174,25 +176,62 @@ Example
174176
try:
175177
import tkinter as tk
176178
import tkinter.ttk as ttk
179+
from tkinter import filedialog
177180
except ImportError:
178181
import Tkinter as tk
179182
import ttk
180-
from tkfilebrowser import askopendirnames, asksaveasfilename
183+
import tkFileDialog as filedialog
184+
from tkfilebrowser import askopendirname, askopenfilenames, asksaveasfilename
185+
181186
182187
root = tk.Tk()
188+
183189
style = ttk.Style(root)
184190
style.theme_use("clam")
185191
186-
def c_open():
187-
rep = askopendirnames(parent=root)
192+
193+
def c_open_file_old():
194+
rep = filedialog.askopenfilenames(parent=root, initialdir='/', initialfile='tmp',
195+
filetypes=[("PNG", "*.png"), ("JPEG", "*.jpg"), ("All files", "*")])
196+
print(rep)
197+
198+
199+
def c_open_dir_old():
200+
rep = filedialog.askdirectory(parent=root, initialdir='/tmp')
201+
print(rep)
202+
203+
204+
def c_save_old():
205+
rep = filedialog.asksaveasfilename(parent=root, defaultextension=".png", initialdir='/tmp', initialfile='image.png',
206+
filetypes=[("PNG", "*.png"), ("JPEG", "*.jpg"), ("All files", "*")])
188207
print(rep)
189208
209+
210+
def c_open_file():
211+
rep = askopenfilenames(parent=root, initialdir='/', initialfile='tmp',
212+
filetypes=[("Pictures", "*.png|*.jpg|*.JPG"), ("All files", "*")])
213+
print(rep)
214+
215+
216+
def c_open_dir():
217+
rep = askopendirname(parent=root, initialdir='/', initialfile='tmp')
218+
print(rep)
219+
220+
190221
def c_save():
191-
rep = asksaveasfilename(parent=root, defaultext=".png",
222+
rep = asksaveasfilename(parent=root, defaultext=".png", initialdir='/tmp', initialfile='image.png',
192223
filetypes=[("Pictures", "*.png|*.jpg|*.JPG"), ("All files", "*")])
193224
print(rep)
194225
195-
ttk.Button(root, text="Open folders", command=c_open).pack()
196-
ttk.Button(root, text="Save file", command=c_save).pack()
226+
227+
ttk.Label(root, text='Default dialogs').grid(row=0, column=0, padx=4, pady=4, sticky='ew')
228+
ttk.Label(root, text='tkfilebrowser dialogs').grid(row=0, column=1, padx=4, pady=4, sticky='ew')
229+
ttk.Button(root, text="Open files", command=c_open_file_old).grid(row=1, column=0, padx=4, pady=4, sticky='ew')
230+
ttk.Button(root, text="Open folder", command=c_open_dir_old).grid(row=2, column=0, padx=4, pady=4, sticky='ew')
231+
ttk.Button(root, text="Save file", command=c_save_old).grid(row=3, column=0, padx=4, pady=4, sticky='ew')
232+
ttk.Button(root, text="Open files", command=c_open_file).grid(row=1, column=1, padx=4, pady=4, sticky='ew')
233+
ttk.Button(root, text="Open folder", command=c_open_dir).grid(row=2, column=1, padx=4, pady=4, sticky='ew')
234+
ttk.Button(root, text="Save file", command=c_save).grid(row=3, column=1, padx=4, pady=4, sticky='ew')
197235
198236
root.mainloop()
237+

TODO

Lines changed: 0 additions & 3 deletions
This file was deleted.

changelog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Changelog
1111
* Speed up (a little) folder content display
1212
* Improve example: add comparison with default dialogs
1313
* Add select all on Ctrl+A if multiple selection is enabled
14+
* Disable folder creation button if the user does not have write access
15+
* Improve extension management in save mode
1416

1517
- tkfilebrowser 2.1.1
1618
* Fix error if LOCAL_PATH does not exists or is not writtable

tests/test_filebrowser.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,25 @@ def test_filebrowser_save(self):
105105
self.window.update()
106106
fb.validate()
107107
self.assertEqual(fb.get_result(), '/test.png')
108+
fb = FileBrowser(self.window, initialdir="/", initialfile="test.png", mode="save",
109+
filetypes=[("PNG", '*.png|*.PNG'), ("JPG", '*.jpg|*.JPG'),
110+
('ALL', '*')])
111+
self.window.update()
112+
self.assertEqual(fb.entry.get(), "test.png")
113+
fb.filetype.set('JPG')
114+
self.window.update()
115+
self.assertEqual(fb.entry.get(), "test.jpg")
116+
fb.filetype.set('ALL')
117+
self.window.update()
118+
self.assertEqual(fb.entry.get(), "test.jpg")
119+
fb.filetype.set('PNG')
120+
self.window.update()
121+
self.assertEqual(fb.entry.get(), "test.png")
122+
fb.entry.delete(0, 'end')
123+
fb.entry.insert(0, "test.JPG")
124+
fb.filetype.set('JPG')
125+
self.window.update()
126+
self.assertEqual(fb.entry.get(), "test.JPG")
108127

109128
def test_filebrowser_keybrowse(self):
110129
# --- openfile
@@ -246,6 +265,21 @@ def test_filebrowser_keybrowse(self):
246265
fb.event_generate('<Alt-Down>')
247266
self.window.update()
248267

268+
def test_filebowser_foldercreation(self):
269+
fb = FileBrowser(self.window, initialdir="/",
270+
foldercreation=True)
271+
self.window.update()
272+
self.assertTrue(fb.b_new_folder.winfo_ismapped())
273+
self.assertTrue('disabled' in fb.b_new_folder.state())
274+
fb.display_folder(os.path.expanduser('~'))
275+
self.window.update()
276+
self.assertTrue(fb.b_new_folder.winfo_ismapped())
277+
self.assertFalse('disabled' in fb.b_new_folder.state())
278+
fb.left_tree.selection_clear()
279+
fb.left_tree.selection_set('recent')
280+
self.window.update()
281+
self.assertFalse(fb.b_new_folder.winfo_ismapped())
282+
249283
def test_filebrowser_sorting(self):
250284
fb = FileBrowser(self.window, initialdir="/",
251285
multiple_selection=True, defaultext=".png",

tkfilebrowser/filebrowser.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,12 @@ def __init__(self, parent, initialdir="", initialfile="", mode="openfile",
190190
width=w)
191191
b_filetype.grid(row=3, sticky="e", padx=10, pady=(4, 0))
192192
self.filetype.set(filetypes[0][0])
193-
b_filetype.bind('<<ComboboxSelected>>',
194-
lambda e: self._change_filetype())
193+
try:
194+
self.filetype.trace_add('write', lambda *args: self._change_filetype())
195+
except AttributeError:
196+
self.filetype.trace('w', lambda *args: self._change_filetype())
197+
# b_filetype.bind('<<ComboboxSelected>>',
198+
# lambda e: self._change_filetype())
195199
else:
196200
self.filetypes[""] = [""]
197201

@@ -749,6 +753,12 @@ def _change_filetype(self):
749753
self.display_folder(self.history[self._hist_index])
750754
else:
751755
self._display_recents()
756+
if self.mode == 'save':
757+
name, ext = splitext(self.entry.get())
758+
new_ext = self.filetypes[self.filetype.get()][0]
759+
if new_ext and ext not in self.filetypes[self.filetype.get()]:
760+
self.entry.delete(len(name), 'end')
761+
self.entry.insert('end', new_ext)
752762

753763
# --- path completion in entries: key bindings
754764
def _down(self, event):

tkfilebrowser/functions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,4 @@ def asksaveasfilename(parent=None, title=_("Save As"), **kwargs):
138138
"""
139139
dialog = FileBrowser(parent, mode="save", title=title, **kwargs)
140140
dialog.wait_window(dialog)
141-
return dialog.get_result()
141+
return dialog.get_result()

0 commit comments

Comments
 (0)