massive move and cleanup
This commit is contained in:
113
python/PBMotionAnalyzer/wxutils.py
Executable file
113
python/PBMotionAnalyzer/wxutils.py
Executable file
@@ -0,0 +1,113 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user