"""
.. moduleauthor:: easygui developers and Stephen Raymond Ferg
.. default-domain:: py
.. highlight:: python
Version |release|
"""
import os
try:
from . import utils as ut
except (SystemError, ValueError, ImportError):
import utils as ut
try:
import tkinter as tk # python 3
import tkinter.font as tk_Font
except:
import Tkinter as tk # python 2
import tkFont as tk_Font
# -------------------------------------------------------------------
#
# fileboxSetup
#
# -------------------------------------------------------------------
def fileboxSetup(default, filetypes):
if not default:
default = os.path.join(".", "*")
initialdir, initialfile = os.path.split(default)
if not initialdir:
initialdir = "."
if not initialfile:
initialfile = "*"
initialbase, initialext = os.path.splitext(initialfile)
initialFileTypeObject = FileTypeObject(initialfile)
allFileTypeObject = FileTypeObject("*")
ALL_filetypes_was_specified = False
if not filetypes:
filetypes = list()
filetypeObjects = list()
for filemask in filetypes:
fto = FileTypeObject(filemask)
if fto.isAll():
ALL_filetypes_was_specified = True # remember this
if fto == initialFileTypeObject:
initialFileTypeObject.add(fto) # add fto to initialFileTypeObject
else:
filetypeObjects.append(fto)
# ------------------------------------------------------------------
# make sure that the list of filetypes includes the ALL FILES type.
# ------------------------------------------------------------------
if ALL_filetypes_was_specified:
pass
elif allFileTypeObject == initialFileTypeObject:
pass
else:
filetypeObjects.insert(0, allFileTypeObject)
# ------------------------------------------------------------------
# Make sure that the list includes the initialFileTypeObject
# in the position in the list that will make it the default.
# This changed between Python version 2.5 and 2.6
# ------------------------------------------------------------------
if len(filetypeObjects) == 0:
filetypeObjects.append(initialFileTypeObject)
if initialFileTypeObject in (filetypeObjects[0], filetypeObjects[-1]):
pass
else:
if ut.runningPython27:
filetypeObjects.append(initialFileTypeObject)
else:
filetypeObjects.insert(0, initialFileTypeObject)
filetypes = [fto.toTuple() for fto in filetypeObjects]
return initialbase, initialfile, initialdir, filetypes
# Hotkeys
if buttons:
for button_name, button in buttons.items():
hotkey_pressed = event.keysym
if event.keysym != event.char: # A special character
hotkey_pressed = '<{}>'.format(event.keysym)
if button['hotkey'] == hotkey_pressed:
__replyButtonText = button_name
boxRoot.quit()
return
print("Event not understood")
# -------------------------------------------------------------------
# class FileTypeObject for use with fileopenbox
# -------------------------------------------------------------------
class FileTypeObject:
def __init__(self, filemask):
if len(filemask) == 0:
raise AssertionError('Filetype argument is empty.')
self.masks = list()
if isinstance(filemask, ut.basestring): # a str or unicode
self.initializeFromString(filemask)
elif isinstance(filemask, list):
if len(filemask) < 2:
raise AssertionError('Invalid filemask.\n'
+ 'List contains less than 2 members: "{}"'.format(filemask))
else:
self.name = filemask[-1]
self.masks = list(filemask[:-1])
else:
raise AssertionError('Invalid filemask: "{}"'.format(filemask))
def __eq__(self, other):
if self.name == other.name:
return True
return False
def add(self, other):
for mask in other.masks:
if mask in self.masks:
pass
else:
self.masks.append(mask)
def toTuple(self):
return self.name, tuple(self.masks)
def isAll(self):
if self.name == "All files":
return True
return False
def initializeFromString(self, filemask):
# remove everything except the extension from the filemask
self.ext = os.path.splitext(filemask)[1]
if self.ext == "":
self.ext = ".*"
if self.ext == ".":
self.ext = ".*"
self.name = self.getName()
self.masks = ["*" + self.ext]
def getName(self):
e = self.ext
file_types = {".*": "All", ".txt": "Text",
".py": "Python", ".pyc": "Python", ".xls": "Excel"}
if e in file_types:
return '{} files'.format(file_types[e])
if e.startswith("."):
return '{} files'.format(e[1:].upper())
return '{} files'.format(e.upper())