1""" 2 3.. moduleauthor:: easygui developers and Stephen Raymond Ferg 4.. default-domain:: py 5.. highlight:: python 6 7Version |release| 8 9""" 10import os 11try: 12 from . import utils as ut 13except (SystemError, ValueError, ImportError): 14 import utils as ut 15 16try: 17 import tkinter as tk # python 3 18 import tkinter.font as tk_Font 19except: 20 import Tkinter as tk # python 2 21 import tkFont as tk_Font 22 23# ------------------------------------------------------------------- 24# 25# fileboxSetup 26# 27# ------------------------------------------------------------------- 28 29 30def fileboxSetup(default, filetypes): 31 if not default: 32 default = os.path.join(".", "*") 33 initialdir, initialfile = os.path.split(default) 34 if not initialdir: 35 initialdir = "." 36 if not initialfile: 37 initialfile = "*" 38 initialbase, initialext = os.path.splitext(initialfile) 39 initialFileTypeObject = FileTypeObject(initialfile) 40 41 allFileTypeObject = FileTypeObject("*") 42 ALL_filetypes_was_specified = False 43 44 if not filetypes: 45 filetypes = list() 46 filetypeObjects = list() 47 48 for filemask in filetypes: 49 fto = FileTypeObject(filemask) 50 51 if fto.isAll(): 52 ALL_filetypes_was_specified = True # remember this 53 54 if fto == initialFileTypeObject: 55 initialFileTypeObject.add(fto) # add fto to initialFileTypeObject 56 else: 57 filetypeObjects.append(fto) 58 59 # ------------------------------------------------------------------ 60 # make sure that the list of filetypes includes the ALL FILES type. 61 # ------------------------------------------------------------------ 62 if ALL_filetypes_was_specified: 63 pass 64 elif allFileTypeObject == initialFileTypeObject: 65 pass 66 else: 67 filetypeObjects.insert(0, allFileTypeObject) 68 # ------------------------------------------------------------------ 69 # Make sure that the list includes the initialFileTypeObject 70 # in the position in the list that will make it the default. 71 # This changed between Python version 2.5 and 2.6 72 # ------------------------------------------------------------------ 73 if len(filetypeObjects) == 0: 74 filetypeObjects.append(initialFileTypeObject) 75 76 if initialFileTypeObject in (filetypeObjects[0], filetypeObjects[-1]): 77 pass 78 else: 79 if ut.runningPython27: 80 filetypeObjects.append(initialFileTypeObject) 81 else: 82 filetypeObjects.insert(0, initialFileTypeObject) 83 84 filetypes = [fto.toTuple() for fto in filetypeObjects] 85 86 return initialbase, initialfile, initialdir, filetypes 87 88 # Hotkeys 89 if buttons: 90 for button_name, button in buttons.items(): 91 hotkey_pressed = event.keysym 92 if event.keysym != event.char: # A special character 93 hotkey_pressed = '<{}>'.format(event.keysym) 94 if button['hotkey'] == hotkey_pressed: 95 __replyButtonText = button_name 96 boxRoot.quit() 97 return 98 99 print("Event not understood") 100 101 102# ------------------------------------------------------------------- 103# class FileTypeObject for use with fileopenbox 104# ------------------------------------------------------------------- 105class FileTypeObject: 106 107 def __init__(self, filemask): 108 if len(filemask) == 0: 109 raise AssertionError('Filetype argument is empty.') 110 111 self.masks = list() 112 113 if isinstance(filemask, ut.basestring): # a str or unicode 114 self.initializeFromString(filemask) 115 116 elif isinstance(filemask, list): 117 if len(filemask) < 2: 118 raise AssertionError('Invalid filemask.\n' 119 + 'List contains less than 2 members: "{}"'.format(filemask)) 120 else: 121 self.name = filemask[-1] 122 self.masks = list(filemask[:-1]) 123 else: 124 raise AssertionError('Invalid filemask: "{}"'.format(filemask)) 125 126 def __eq__(self, other): 127 if self.name == other.name: 128 return True 129 return False 130 131 def add(self, other): 132 for mask in other.masks: 133 if mask in self.masks: 134 pass 135 else: 136 self.masks.append(mask) 137 138 def toTuple(self): 139 return self.name, tuple(self.masks) 140 141 def isAll(self): 142 if self.name == "All files": 143 return True 144 return False 145 146 def initializeFromString(self, filemask): 147 # remove everything except the extension from the filemask 148 self.ext = os.path.splitext(filemask)[1] 149 if self.ext == "": 150 self.ext = ".*" 151 if self.ext == ".": 152 self.ext = ".*" 153 self.name = self.getName() 154 self.masks = ["*" + self.ext] 155 156 def getName(self): 157 e = self.ext 158 file_types = {".*": "All", ".txt": "Text", 159 ".py": "Python", ".pyc": "Python", ".xls": "Excel"} 160 if e in file_types: 161 return '{} files'.format(file_types[e]) 162 if e.startswith("."): 163 return '{} files'.format(e[1:].upper()) 164 return '{} files'.format(e.upper()) 165