class FilePick(Frame): def __init__(self, master, file_mask, default_file, user_onChange = None, font = None, dirs = (".", ), allowNone = False): """ file_mask: file mask or list of file masks """ self.master = master self.user_onChange = user_onChange Frame.__init__(self, master) self.columnconfigure(0, weight=1) self.unmodified = True self.file_extension = "" if "." in file_mask: self.file_extension = file_mask[file_mask.rfind('.'):] if type(file_mask) != list: file_mask = [file_mask] self.file_masks = file_mask self.allowNone = allowNone self.dirs = dirs # create list of files self.updateList() # pick default if applicable self.set(default_file) def onSelChange(self, name, index=0, mode=0): filename = self.picked_name.get() if self.user_onChange != None: self.user_onChange(filename) def updateList(self): prev_sel = self.get() # get list of files (paths) self.files = [] if self.allowNone: self.files.append("") for fm in self.file_masks: for dir in self.dirs: try: for filename in os.listdir(dir): if fnmatch(filename, fm): if dir != ".": path = os.path.join(dir, filename) else: path = filename self.files.append(path) except: pass self.files.sort() if len(self.files) == 0: self.files.append("(no %s files found)" % self.file_masks) # create list object self._makelist() # reselect self.set(prev_sel) def getList(self): """ returns the current list of files """ return self.files def _makelist(self): if havePMW: self.list = ComboBox(self, selectioncommand = self.onSelChange, scrolledlist_items = self.files, ) self.list.grid(row=0, column=0, padx=0, sticky="NEWS") self.list.component('entryfield').component('entry').configure(state = 'readonly', relief = 'raised') self.picked_name = self.list else: self.picked_name = StringVar() self.list = OptionMenu(*(self, self.picked_name) + tuple(self.files)) self.list.grid(row=0, column=0, sticky="NEW") self.picked_name.trace("w", self.onSelChange) def set(self, filename): default_file = filename if default_file in self.files: if not havePMW: self.picked_name.set(default_file) # default value else: self.list.selectitem(self.files.index(default_file)) self.onSelChange(default_file) pass def get(self): if not hasattr(self, 'picked_name'): return None return self.picked_name.get()
class DropdownList: def __init__(self, master, filemask='*.mln', default=None, allowNone=False, onselchange=None, directory='.'): self.allowNone = allowNone self.directory = directory self.list_frame = master self.onchange = onselchange if type(filemask) != list: filemask = [filemask] self.file_mask = filemask self.updateList() if havePMW: self.list = ComboBox(master, selectioncommand=onselchange, scrolledlist_items = self.files) self.list.component('entryfield').component('entry').configure(state = 'readonly', relief = 'raised') self.picked_name = self.list else: self.picked_name = StringVar() self.list = OptionMenu(*(master, self.picked_name) + tuple(self.files)) if onselchange is not None: self.picked_name.trace("w", self.onchange) if default is not None: self.select(default) else: self.select(self.files[0]) def __getattr__(self, name): return getattr(self.list, name) def get(self): return self.picked_name.get() def select(self, item): if item in self.files: if not havePMW: self.picked_name.set(item) else: self.list.selectitem(item) def updateList(self): self.files = [] if self.allowNone: self.files.append("") if os.path.exists(self.directory): for filename in os.listdir(self.directory): for fm in self.file_mask: if fnmatch(filename, fm): self.files.append(filename) self.files.sort() if len(self.files) == 0 and not self.allowNone: self.files.append("(no %s files found)" % str(self.file_mask)) def makelist(self): if havePMW: self.list = ComboBox(self.list_frame, selectioncommand = self.onSelChange, scrolledlist_items = self.files, ) self.list.grid(row=0, column=0, padx=0, pady=0, sticky="NEWS") self.list.component('entryfield').component('entry').configure(state = 'readonly', relief = 'raised') self.picked_name = self.list else: self.list = OptionMenu(*(self.list_frame, self.picked_name) + tuple(self.files)) self.list.grid(row=0, column=0, sticky="NEW") self.picked_name.trace("w", self.onSelChange) self.select(self.files[0]) def setDirectory(self, directory, keep=False): self.directory = directory self.updateList() self.makelist() # if keep is true, only the files list will be updated but the content of the # text area will not be altered/removed if not keep: self.select("") def onSelChange(self, name, index=0, mode=0): filename = self.picked_name.get() if self.onchange != None: self.onchange(filename)