1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
"""
.. moduleauthor:: easygui developers and Stephen Raymond Ferg
.. default-domain:: py
.. highlight:: python
Version |release|
"""
import os
import sys
import traceback
# A set of variables and functions to centralize differences between
# python 2 and 3
runningPython27 = False
runningPython34 = False
if 0x020700F0 <= sys.hexversion <= 0x030000F0:
runningPython27 = True
if 0x030400F0 <= sys.hexversion <= 0x040000F0:
runningPython34 = True
if not runningPython27 and not runningPython34:
raise Exception("You must run on Python 2.7+ or Python 3.4+")
# Import Tkinter, the tk filedialog, and put everything in tkinter into
# the current namespace
try:
import tkinter as tk # python3
# TODO: Ultimately this should go away once everything stops using it.
from tkinter import *
import tkinter.filedialog as tk_FileDialog
import tkinter.font as tk_Font
except ImportError:
try:
import Tkinter as tk # python2
# TODO: Ultimately this should go away once everything stops using it.
from Tkinter import *
import tkFileDialog as tk_FileDialog
import tkFont as tk_Font
except ImportError:
raise ImportError("Unable to find tkinter package.")
if tk.TkVersion < 8.0:
raise ImportError("You must use python-tk (tkinter) version 8.0 or higher")
# Try to import the Python Image Library. If it doesn't exist, only .gif
# images are supported.
try:
from PIL import Image as PILImage
from PIL import ImageTk as PILImageTk
except:
pass
# Code should use 'basestring' anywhere you might think to use the system 'str'. This is all to support
# Python 2. If 2 ever goes away, this logic can go away and uses of
# utils.basestring should be changed to just str
if runningPython27:
basestring = basestring
if runningPython34:
basestring = str
def lower_case_sort(things):
if runningPython34:
things.sort(key=str.lower)
else:
# case-insensitive sort
things.sort(lambda x, y: cmp(x.lower(), y.lower()))
return things # RL: Not sure of this exactly
# -----------------------------------------------------------------------
# exception_format
# -----------------------------------------------------------------------
def exception_format():
"""
Convert exception info into a string suitable for display.
"""
return "".join(traceback.format_exception(
sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
))
# -------------------------------------------------------------------
# utility routines
# -------------------------------------------------------------------
# These routines are used by several other functions in the EasyGui module.
def uniquify_list_of_strings(input_list):
"""
Ensure that every string within input_list is unique.
:param list input_list: List of strings
:return: New list with unique names as needed.
"""
output_list = list()
for i, item in enumerate(input_list):
tempList = input_list[:i] + input_list[i + 1:]
if item not in tempList:
output_list.append(item)
else:
output_list.append('{0}_{1}'.format(item, i))
return output_list
import re
def parse_hotkey(text):
"""
Extract a desired hotkey from the text. The format to enclose
the hotkey in square braces
as in Button_[1] which would assign the keyboard key 1 to that button.
The one will be included in the
button text. To hide they key, use double square braces as in: Ex[[qq]]
it , which would assign
the q key to the Exit button. Special keys such as <Enter> may also be
used: Move [<left>] for a full
list of special keys, see this reference: http://infohoglobal_state.nmt.edu/tcc/help/
pubs/tkinter/web/key-names.html
:param text:
:return: list containing cleaned text, hotkey, and hotkey position within
cleaned text.
"""
ret_val = [text, None, None] # Default return values
if text is None:
return ret_val
# Single character, remain visible
res = re.search(r'(?<=\[).(?=\])', text)
if res:
start = res.start(0)
end = res.end(0)
caption = text[:start - 1] + text[start:end] + text[end + 1:]
ret_val = [caption, text[start:end], start - 1]
# Single character, hide it
res = re.search(r'(?<=\[\[).(?=\]\])', text)
if res:
start = res.start(0)
end = res.end(0)
caption = text[:start - 2] + text[end + 2:]
ret_val = [caption, text[start:end], None]
# a Keysym. Always hide it
res = re.search(r'(?<=\[\<).+(?=\>\])', text)
if res:
start = res.start(0)
end = res.end(0)
caption = text[:start - 2] + text[end + 2:]
ret_val = [caption, '<{}>'.format(text[start:end]), None]
return ret_val
def load_tk_image(filename, tk_master=None):
"""
Load in an image file and return as a tk Image.
Loads an image. If the PIL library is available use it. otherwise use the tk method.
NOTE: tk_master is required if there are more than one Tk() instances, which there are very often.
REF: http://stackoverflow.com/a/23229091/2184122
:param filename: image filename to load
:param tk_master: root object (Tk())
:return: tk Image object
"""
if filename is None:
return None
if not os.path.isfile(filename):
raise ValueError(
'Image file {} does not exist.'.format(filename))
tk_image = None
filename = os.path.normpath(filename)
_, ext = os.path.splitext(filename)
try:
pil_image = PILImage.open(filename)
tk_image = PILImageTk.PhotoImage(pil_image, master=tk_master)
except:
try:
# Fallback if PIL isn't available
tk_image = tk.PhotoImage(file=filename, master=tk_master)
except:
msg = "Cannot load {}. Check to make sure it is an image file.".format(
filename)
try:
_ = PILImage
except:
msg += "\nPIL library isn't installed. If it isn't installed, only .gif files can be used."
raise ValueError(msg)
return tk_image
# -------------------------------------------------------------------
# getFileDialogTitle
# -------------------------------------------------------------------
def getFileDialogTitle(msg, title):
"""
Create nicely-formatted string based on arguments msg and title
:param msg: the msg to be displayed
:param title: the window title
:return: None
"""
if msg and title:
return "%s - %s" % (title, msg)
if msg and not title:
return str(msg)
if title and not msg:
return str(title)
return None # no message and no title
if __name__ == '__main__':
print("Hello from utils")
|