Files
PBSwissMX/python/PBMotionAnalyzer/wxutils.py
2018-11-21 08:08:23 +01:00

115 lines
3.3 KiB
Python
Executable File

from __future__ import print_function
if __name__ == '__main__':
#Used to guarantee to use at least Wx2.8
import wxversion
wxversion.ensureMinimal('2.8')
import wx
import matplotlib as mpl
if __name__ == '__main__':
mpl.use('WXAgg') #or mpl.use('WX')
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
import time,os
class Path():
@staticmethod
def GetImage():
path=__file__
try:symPath=os.readlink(path) #follow symbolic link
except (AttributeError,OSError) as e:pass
else:
path=symPath
path=os.path.abspath(path)
path=os.path.dirname(path)
return path
class StopWatch():
@classmethod
def Start(cls):
cls.ts=time.time()
@classmethod
def Log(cls,str=None,restart=True):
ts=time.time()
print('%.6f'%(ts-cls.ts),str)
if restart:
cls.ts=ts
class SliderGroup():
def __init__(self, parent, label, range=(0,100),val=0):
self.sliderLabel = wx.StaticText(parent, label=label)
self.sliderText = wx.TextCtrl(parent, -1, style=wx.TE_PROCESS_ENTER)
self.slider = wx.Slider(parent, -1)
self.slider.SetRange(range[0],range[1])
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.sliderLabel, 0, wx.EXPAND | wx.ALIGN_CENTER | wx.ALL, border=2)
sizer.Add(self.sliderText, 0, wx.EXPAND | wx.ALIGN_CENTER | wx.ALL, border=2)
sizer.Add(self.slider, 1, wx.EXPAND)
self.sizer = sizer
self.slider.Bind(wx.EVT_SLIDER, self.sliderHandler)
self.sliderText.Bind(wx.EVT_TEXT_ENTER, self.sliderTextHandler)
self.SetValue(val)
def SetValue(self, value):
self.value = value
self.slider.SetValue(value)
self.sliderText.SetValue(str(value))
def SetCallback(self,funcCB,usrData):
self.cbFuncData=(funcCB,usrData)
def Callback(self,value,msg):
try:
(funcCB,usrData)=self.cbFuncData
except BaseException as e:
pass
else:
funcCB(usrData,value,msg)
def sliderHandler(self, evt):
value = evt.GetInt()
self.sliderText.SetValue(str(value))
self.value=value
self.Callback(value,0)
def sliderTextHandler(self, evt):
value = int(self.sliderText.GetValue())
self.slider.SetValue(value)
value = self.slider.Value
self.sliderText.SetValue(str(value))
self.value=value
self.Callback(value,1)
def GetSlice(idxXY,shp,wxAxCtrlLst):
'''returns a slice list to select data'''
sl=[None]*len(shp)
for ax in wxAxCtrlLst:
sl[ax.idx]=ax.value
for i in idxXY:
sl[i]=slice(None)
sl=tuple(sl)
return sl
def AddToolbar(parent,sizer):
toolbar = NavigationToolbar(parent)
toolbar.Realize()
if wx.Platform == '__WXMAC__':
# Mac platform (OSX 10.3, MacPython) does not seem to cope with
# having a toolbar in a sizer. This work-around gets the buttons
# back, but at the expense of having the toolbar at the top
parent.SetToolBar(toolbar)
else:
# On Windows platform, default window size is incorrect, so set
# toolbar width to figure width.
tw, th = toolbar.GetSizeTuple()
fw, fh = parent.GetSizeTuple()
# By adding toolbar in sizer, we are able to put it at the bottom
# of the frame - so appearance is closer to GTK version.
# As noted above, doesn't work for Mac.
toolbar.SetSize(wx.Size(fw, th))
sizer.Add(toolbar, 0, wx.LEFT | wx.EXPAND)
# update the axes menu on the toolbar
toolbar.update()
return toolbar