#!/usr/bin/env python
"""
Implements the utility methods for pandastable classes.
Created August 2015
Copyright (C) Damien Farrell
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
from __future__ import absolute_import, division, print_function
try:
from tkinter import *
from tkinter.ttk import *
except:
from Tkinter import *
from ttk import *
import math, time
import os, types
import string, copy
import numpy as np
import pandas as pd
SCRATCH = None
[docs]def getTextLength(text, w, font=None):
"""Get correct canvas text size (chars) that will fit in \
a given canvas width"""
global SCRATCH
if SCRATCH is None:
SCRATCH = Canvas()
scratch = SCRATCH
length = len(text)
t = scratch.create_text((0,0), text=text, font=font)
b = scratch.bbox(t)
scratch.delete(t)
twidth = b[2]-b[0]
ratio = length/twidth
length = math.floor(w*ratio)
return twidth,length
[docs]def check_multiindex(index):
"""Check if index is a multiindex"""
#if isinstance(index, pd.core.index.MultiIndex):
if isinstance(index, pd.core.indexes.multi.MultiIndex):
return 1
else:
return 0
[docs]def getAttributes(obj):
"""Get non hidden and built-in type object attributes that can be persisted"""
d={}
allowed = [str,int,float,list,tuple,bool]
for key in obj.__dict__:
if key.startswith('_'):
continue
item = obj.__dict__[key]
if type(item) in allowed:
d[key] = item
elif type(item) is dict:
if checkDict(item) == 1:
d[key] = item
return d
[docs]def setAttributes(obj, data):
"""Set attributes from a dict. Used for restoring settings in tables"""
for key in data:
try:
obj.__dict__[key] = data[key]
except Exception as e:
print (e)
return
[docs]def checkDict(d):
"""Check a dict recursively for non serializable types"""
allowed = [str,int,float,list,tuple,bool]
for k, v in d.items():
if isinstance(v, dict):
checkDict(v)
else:
if type(v) not in allowed:
return 0
return 1
[docs]def getFonts():
"""Get the current list of system fonts"""
import matplotlib.font_manager
#l = matplotlib.font_manager.get_fontconfig_fonts()
l = matplotlib.font_manager.findSystemFonts()
fonts = []
for fname in l:
try: fonts.append(matplotlib.font_manager.FontProperties(fname=fname).get_name())
except RuntimeError: pass
fonts = list(set(fonts))
fonts.sort()
#f = matplotlib.font_manager.FontProperties(family='monospace')
#print (matplotlib.font_manager.findfont(f))
return fonts
[docs]def adjustColorMap(cmap, minval=0.0, maxval=1.0, n=100):
"""Adjust colormap to avoid using white in plots"""
from matplotlib import colors
new_cmap = colors.LinearSegmentedColormap.from_list(
'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
cmap(np.linspace(minval, maxval, n)))
return new_cmap
[docs]def colorScale(hex_color, brightness_offset=1):
"""Takes a hex color and produces a lighter or darker variant.
Returns:
new color in hex format
"""
#if not hex_color.startswith('#'):
#import matplotlib
#hex_color = matplotlib.colors.cnames[hex_color].lower()
if len(hex_color) != 7:
raise Exception("Passed %s into color_variant(), needs to be in #87c95f format." % hex_color)
rgb_hex = [hex_color[x:x+2] for x in [1, 3, 5]]
new_rgb_int = [max(0, int(hex_value, 16) + brightness_offset) for hex_value in rgb_hex]
r,g,b = [min([255, max([1, i])]) for i in new_rgb_int]
# hex() produces "0x88", we want just "88"
return "#{0:02x}{1:02x}{2:02x}".format(r, g, b)
[docs]def checkOS():
"""Check the OS we are in"""
from sys import platform as _platform
if _platform == "linux" or _platform == "linux2":
return 'linux'
elif _platform == "darwin":
return 'darwin'
if "win" in _platform:
return 'windows'