def __init__(self, master, nodeName="", figsize=(5, 4), dpi=100, isPolar=False): super(DataFigure, self).__init__(nodeName=nodeName) figure = Figure(figsize, dpi) canvas = FigureCanvasTkAgg(figure, master=master) canvas.show() self.__canvas = canvas toolbar = NavigationToolbar2TkAgg(canvas, master) toolbar.update() canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=YES) toolbar.pack() with self.attributeLock: # All the properties being set in this block will be locked automatically, # i.e. these properties cannot be replaced. setMultiAttr( self, figure=figure, lineObjects=[], axes=figure.add_subplot(111, polar=isPolar), isPolar=isPolar ) self.indicators = self.Indicators(dataFig=self) self.plotFunction = None self.index = None # Used by FigureList self.__majorGrid = isPolar self.__minorGrid = False self.__indicatorsMeta = []
def makeViewTab(self): toolTabs = self.toolTabs frmView = Frame(toolTabs) grpGrid = GridGroup(frmView, bd=2, relief=GROOVE, balloon=self.balloon, valueChecker=self.valueChecker) grpGrid.pack(side=LEFT, fill=Y) grpGrid.addObserver(self.figureBook.gridGroupObserver) self.figureBook.addObserver(grpGrid.figureObserver) grpAxis = AxisGroup(frmView, bd=2, relief=GROOVE, balloon=self.balloon, valueChecker=self.valueChecker) grpAxis.pack(side=LEFT, fill=Y) grpAxis.addObserver(self.figureBook.axisGroupObserver) self.figureBook.addObserver(grpAxis.figureObserver) grpClear = ClearGroup(frmView, bd=2, relief=GROOVE) grpClear.pack(side=LEFT, fill=Y) grpClear.addObserver(self.figureBook.clearGroupObserver) with self.attributeLock: setMultiAttr(self, grpGrid=grpGrid, grpAxis=grpAxis, grpClear=grpClear, viewFrame=frmView) toolTabs.add(frmView, text='View')
def __init__(self, *args, **kwargs): self._app = Application.instance self.__topwin = kwargs.pop('topwin') super(OptimizeGroup, self).__init__(*args, **kwargs) paramFrm = Frame(self) paramFrm.pack(side=LEFT, expand=YES, fill=Y) self.__num = ParamItem(paramFrm) setMultiAttr(self.__num, labelText = 'num', entryText = '1', labelWidth = 5, entryWidth = 8, checkFunc = self._app.checkInt ) self.__num.entry.bind('<Return>', lambda event: self.onSolveClick()) self.__num.pack(side=TOP) self.__pci = ParamItem(paramFrm) setMultiAttr(self.__pci, labelText = 'PCI', entryText = '100', labelWidth = 5, entryWidth = 8, checkFunc = self._app.checkInt ) self.__pci.pack(side=TOP) self.__bParallel = IntVar() self.__chkParallel = Checkbutton(paramFrm, text="Parallel", variable=self.__bParallel) self.__chkParallel.pack() progfrm = Frame(self) progfrm.pack(side=LEFT, expand=YES, fill=Y) self.__genbtn = Button(progfrm, text='Generate', command=self.onSolveClick) self.__genbtn.pack(side=TOP) Button(progfrm, text='Stop', command=self.onStopBtnClick).pack(side=TOP) self.__progress = IntVar() self.__finishedwav = IntVar() self.__progbar = Progressbar(progfrm, orient='horizontal', variable=self.__progress, maximum=100) self.__progbar.pack(side=LEFT) self.__progbar.config(length=55) self.__finishedwavbar = Progressbar(progfrm, orient='horizontal', variable=self.__finishedwav) self.__finishedwavbar.pack(side=LEFT) self.__finishedwavbar.config(length=30) self.name = 'Generate' self.getparams = None self.__stopflag = False
def makeExportTab(self): toolTabs = self.toolTabs frmExport = Frame(toolTabs) grpFigureExport = FigureExportGroup(frmExport, bd=2, relief=GROOVE, topwin=self) grpFigureExport.pack(side=LEFT, fill=Y) with self.attributeLock: setMultiAttr(self, grpFigureExport=grpFigureExport, exportFrame=frmExport) toolTabs.add(frmExport, text="Export")
def __init__(self, *args, **kwargs): # app = Application.instance if "valueChecker" in kwargs: valueChecker = kwargs.pop("valueChecker") checkFloat = valueChecker.checkFloat else: checkFloat = None if "balloon" in kwargs: balloonBindWidget = kwargs.pop("balloon").bind_widget else: balloonBindWidget = lambda *args, **kwargs: None super(AxisGroup, self).__init__(*args, **kwargs) self.__params = [StringVar() for i in range(8)] paramfrm = Frame(self) paramfrm.pack() names = ["xmin", "xmax", "ymin", "ymax", "major xtick", "major ytick", "minor xtick", "minor ytick"] images = [ "ViewTab_XMin.png", "ViewTab_XMax.png", "ViewTab_YMin.png", "ViewTab_YMax.png", "ViewTab_MajorXTick.png", "ViewTab_MajorYTick.png", "ViewTab_MinorXTick.png", "ViewTab_MinorYTick.png", ] for c in range(4): for r in range(2): temp = ParamItem(paramfrm) image = ImageTk.PhotoImage(file=uiImagePath(images[c * 2 + r])) setMultiAttr( temp, checkFunc=checkFloat, # labelText = names[c*2+r], labelImage=image, labelWidth=5 if c * 2 + r < 4 else 10, entryWidth=5, entryVar=self.__params[c * 2 + r], ) temp.entry.bind("<Return>", self.onConfirmClick) temp.grid(row=r, column=c) balloonBindWidget(temp, balloonmsg=names[c * 2 + r]) btnfrm = Frame(self) btnfrm.pack() Button(btnfrm, text="Confirm", command=self.onConfirmClick).pack(side=LEFT) Button(btnfrm, text="Auto", command=self.onAutoClick).pack(side=RIGHT) self.name = "Axis" self.__figureObserver = self.FigureObserver(self)
def __init__(self, *args, **kwargs): # app = Application.instance if 'valueChecker' in kwargs: valueChecker = kwargs.pop('valueChecker') checkFloat = valueChecker.checkFloat else: checkFloat = None if 'balloon' in kwargs: balloonBindWidget = kwargs.pop('balloon').bind_widget else: balloonBindWidget = lambda *args, **kwargs: None super(AxisGroup, self).__init__(*args, **kwargs) self.__params = [StringVar() for i in range(8)] paramfrm = Frame(self) paramfrm.pack() names = [ 'xmin', 'xmax', 'ymin', 'ymax', 'major xtick', 'major ytick', 'minor xtick', 'minor ytick' ] images = [ 'ViewTab_XMin.png', 'ViewTab_XMax.png', 'ViewTab_YMin.png', 'ViewTab_YMax.png', 'ViewTab_MajorXTick.png', 'ViewTab_MajorYTick.png', 'ViewTab_MinorXTick.png', 'ViewTab_MinorYTick.png' ] for c in range(4): for r in range(2): temp = ParamItem(paramfrm) image = ImageTk.PhotoImage(file=uiImagePath(images[c * 2 + r])) setMultiAttr( temp, checkFunc=checkFloat, #labelText = names[c*2+r], labelImage=image, labelWidth=5 if c * 2 + r < 4 else 10, entryWidth=5, entryVar=self.__params[c * 2 + r]) temp.entry.bind('<Return>', self.onConfirmClick) temp.grid(row=r, column=c) balloonBindWidget(temp, balloonmsg=names[c * 2 + r]) btnfrm = Frame(self) btnfrm.pack() Button(btnfrm, text='Confirm', command=self.onConfirmClick).pack(side=LEFT) Button(btnfrm, text='Auto', command=self.onAutoClick).pack(side=RIGHT) self.name = 'Axis' self.__figureObserver = self.FigureObserver(self)
def makeExportTab(self): toolTabs = self.toolTabs frmExport = Frame(toolTabs) grpFigureExport = FigureExportGroup(frmExport, bd=2, relief=GROOVE, topwin=self) grpFigureExport.pack(side=LEFT, fill=Y) with self.attributeLock: setMultiAttr(self, grpFigureExport=grpFigureExport, exportFrame=frmExport) toolTabs.add(frmExport, text='Export')
def makeMarkerTab(self): toolTabs = self.toolTabs frmMarker = Frame(toolTabs) grpLabel = LabelGroup(frmMarker, bd=2, relief=GROOVE) grpLabel.pack(side=LEFT, fill=Y) grpLabel.addObserver(self.figureBook.labelGroupObserver) grpIndicator = IndicatorGroup(frmMarker, bd=2, relief=GROOVE) grpIndicator.pack(side=LEFT, fill=Y) grpIndicator.addObserver(self.figureBook.indicatorGroupObserver) with self.attributeLock: setMultiAttr(self, grpLabel=grpLabel, grpIndicator=grpIndicator) toolTabs.add(frmMarker, text='Marker')
def makeMarkerTab(self): toolTabs = self.toolTabs frmMarker = Frame(toolTabs) grpLabel = LabelGroup(frmMarker, bd=2, relief=GROOVE) grpLabel.pack(side=LEFT, fill=Y) grpLabel.addObserver(self.figureBook.labelGroupObserver) grpIndicator = IndicatorGroup(frmMarker, bd=2, relief=GROOVE) grpIndicator.pack(side=LEFT, fill=Y) grpIndicator.addObserver(self.figureBook.indicatorGroupObserver) with self.attributeLock: setMultiAttr(self, grpLabel=grpLabel, grpIndicator=grpIndicator) toolTabs.add(frmMarker, text="Marker")
def makeViewTab(self): toolTabs = self.toolTabs frmView = Frame(toolTabs) grpGrid = GridGroup(frmView, bd=2, relief=GROOVE, balloon=self.balloon, valueChecker=self.valueChecker) grpGrid.pack(side=LEFT, fill=Y) grpGrid.addObserver(self.figureBook.gridGroupObserver) self.figureBook.addObserver(grpGrid.figureObserver) grpAxis = AxisGroup(frmView, bd=2, relief=GROOVE, balloon=self.balloon, valueChecker=self.valueChecker) grpAxis.pack(side=LEFT, fill=Y) grpAxis.addObserver(self.figureBook.axisGroupObserver) self.figureBook.addObserver(grpAxis.figureObserver) grpClear = ClearGroup(frmView, bd=2, relief=GROOVE) grpClear.pack(side=LEFT, fill=Y) grpClear.addObserver(self.figureBook.clearGroupObserver) with self.attributeLock: setMultiAttr(self, grpGrid=grpGrid, grpAxis=grpAxis, grpClear=grpClear, viewFrame=frmView) toolTabs.add(frmView, text="View")
def __init__(self, master, nodeName='', figsize=(5, 4), dpi=100, isPolar=False): super(DataFigure, self).__init__(nodeName=nodeName) figure = Figure(figsize, dpi) canvas = FigureCanvasTkAgg(figure, master=master) canvas.show() self.__canvas = canvas toolbar = NavigationToolbar2TkAgg(canvas, master) toolbar.update() canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=YES) toolbar.pack() with self.attributeLock: # All the properties being set in this block will be locked automatically, # i.e. these properties cannot be replaced. setMultiAttr(self, figure=figure, lineObjects=[], axes=figure.add_subplot(111, polar=isPolar), isPolar=isPolar) self.indicators = self.Indicators(dataFig=self) self.plotFunction = None self.index = None # Used by FigureList self.__majorGrid = isPolar self.__minorGrid = False self.__indicatorsMeta = []
def __init__(self, *args, **kwargs): ''' nodeName: The name of this node. Usually set by ModelNode.__setattr__ automatically. figureMeta: Meta information of figure. The rest parameters are passed to PanedWindow.__init__. ''' nodeName = kwargs.pop('nodeName', '') # lock super(FigureBook, self).__init__(nodeName=nodeName) figureMeta = None if 'figureMeta' not in kwargs \ else kwargs.pop('figureMeta') kwargs['orient'] = HORIZONTAL panedWindow = PanedWindow(*args, **kwargs) panedWindow.config(sashwidth=4, sashrelief=GROOVE, bg='forestgreen') # figureTabsStyle = Style() # figureTabsStyle.configure('Figure.TNotebook', tabposition='sw') # figureTabs = Notebook(panedWindow, style='Figure.TNotebook') figureTabs = Notebook(panedWindow) self.figureTabs = figureTabs figureTabs.bind('<<NotebookTabChanged>>', self.onTabChange) self.lockAttribute('figureTabs') if figureMeta: self.makeFigures(figureMeta) self.lockElements() panedWindow.add(figureTabs, stretch='always') listPan = PanedWindow(panedWindow, orient=VERTICAL) listPan.config(sashwidth=4, sashrelief=GROOVE, bg='forestgreen') panedWindow.add(listPan, stretch='never') listFrm = Frame(listPan) listPan.add(listFrm, stretch='always') Label(listFrm, text='Curves', bg='#b5d6b0').pack(side=TOP, fill=X) self.__list = ScrolledList(listFrm, relief=GROOVE) self.__list.listConfig(width=20) self.__list.listClick = self.onListClick self.__list.pack(fill=BOTH, expand=YES) listFrm = Frame(listPan) listPan.add(listFrm, stretch='never') Label(listFrm, text='Indicators', bg='#b5d6b0').pack(side=TOP, fill=X) self.__indicatorListbox = ScrolledList(listFrm, relief=GROOVE) self.__indicatorListbox.listConfig(width=20) self.__indicatorListbox.pack(fill=BOTH, expand=YES) with self.attributeLock: setMultiAttr( self, panedWindow=panedWindow, gridGroupObserver=self.GridGroupObserver(self), axisGroupObserver=self.AxisGroupObserver(self), clearGroupObserver=self.ClearGroupObserver(self), labelGroupObserver=self.LabelGroupObserver(self), indicatorGroupObserver=self.IndicatorGroupObserver(self), dataFigureObserver=self.DataFigureObserver(self), dataPool=[])
def __init__(self): # The instance of this class is the root of the model tree. Thus isRoot is set to True super(Application, self).__init__(nodeName=Scripting.rootName, isRoot=True) Scripting.nameSpace['locals'][Scripting.rootName] = self Scripting.nameSpace['globals'] = globals() self.homePage = 'https://github.com/xialulee/WaveSyn' filePath = getsourcefile(type(self)) dirPath = os.path.split(filePath)[0] # load config file configFileName = os.path.join(dirPath, 'config.json') with open(configFileName) as f: config = json.load(f) consoleMenu = config['ConsoleMenu'] self.editorInfo = config['EditorInfo'] self.lockAttribute('editorInfo') self.promptSymbols = config['PromptSymbols'] tagDefs = config['TagDefs'] # End load config file root = Tix.Tk() mainThreadId = thread.get_ident() from wavesynlib.interfaces.xmlrpc.server import CommandSlot valueChecker = ValueChecker(root) with self.attributeLock: setMultiAttr(self, # UI elements root = root, balloon = Tix.Balloon(root), tbicon = TaskbarIcon(root), # End UI elements mainThreadId = mainThreadId, execThreadLock = threading.RLock(), xmlrpcCommandSlot = CommandSlot(), # Validation Functions valueChecker = valueChecker, checkInt = valueChecker.checkInt, checkFloat = valueChecker.checkFloat, checkPositiveFloat = valueChecker.checkPositiveFloat, # End Validation Functions filePath = filePath, dirPath = dirPath, streamManager =StreamManager(), configFileName = configFileName ) from wavesynlib.basewindow import WindowDict self.windows = WindowDict() # Instance of ModelNode can be locked automatically. self.editors = EditorDict() class EditorObserver(object): # use SimpleObserver instead def __init__(self, wavesyn): self.wavesyn = wavesyn def update(self, editor): wavesyn = self.wavesyn code = editor.code if not code: return wavesyn.streamManager.write('WaveSyn: executing code from editor {0} listed as follows:\n'.format(id(editor)), 'TIP') wavesyn.streamManager.write(code, 'HISTORY') wavesyn.streamManager.write('\n') wavesyn.execute(code) self.editors.manager.addObserver(EditorObserver(self)) with self.attributeLock: self.monitorTimer = self.createTimer(interval=100, active=False) # Make wavesyn.editors.manager check wavesyn.editors every 100ms self.monitorTimer.addObserver(self.editors.manager) self.monitorTimer.addObserver(self.streamManager) frm = Frame(root) frm.pack(side=TOP, fill=X) self.console = ConsoleWindow(menu=consoleMenu, tagDefs=tagDefs) self.streamManager.addObserver(self.console.streamObserver) #! self.clipboard = Clipboard() self.scripting = Scripting(self) self.noTip = False self.monitorTimer.active = True
def __init__(self, *args, **kwargs): """ nodeName: The name of this node. Usually set by ModelNode.__setattr__ automatically. figureMeta: Meta information of figure. The rest parameters are passed to PanedWindow.__init__. """ nodeName = kwargs.pop("nodeName", "") # lock super(FigureBook, self).__init__(nodeName=nodeName) figureMeta = None if "figureMeta" not in kwargs else kwargs.pop("figureMeta") kwargs["orient"] = HORIZONTAL panedWindow = PanedWindow(*args, **kwargs) panedWindow.config(sashwidth=4, sashrelief=GROOVE, bg="forestgreen") # figureTabsStyle = Style() # figureTabsStyle.configure('Figure.TNotebook', tabposition='sw') # figureTabs = Notebook(panedWindow, style='Figure.TNotebook') figureTabs = Notebook(panedWindow) self.figureTabs = figureTabs figureTabs.bind("<<NotebookTabChanged>>", self.onTabChange) self.lockAttribute("figureTabs") if figureMeta: self.makeFigures(figureMeta) self.lockElements() panedWindow.add(figureTabs, stretch="always") listPan = PanedWindow(panedWindow, orient=VERTICAL) listPan.config(sashwidth=4, sashrelief=GROOVE, bg="forestgreen") panedWindow.add(listPan, stretch="never") listFrm = Frame(listPan) listPan.add(listFrm, stretch="always") Label(listFrm, text="Curves", bg="#b5d6b0").pack(side=TOP, fill=X) self.__list = ScrolledList(listFrm, relief=GROOVE) self.__list.listConfig(width=20) self.__list.listClick = self.onListClick self.__list.pack(fill=BOTH, expand=YES) listFrm = Frame(listPan) listPan.add(listFrm, stretch="never") Label(listFrm, text="Indicators", bg="#b5d6b0").pack(side=TOP, fill=X) self.__indicatorListbox = ScrolledList(listFrm, relief=GROOVE) self.__indicatorListbox.listConfig(width=20) self.__indicatorListbox.pack(fill=BOTH, expand=YES) with self.attributeLock: setMultiAttr( self, panedWindow=panedWindow, gridGroupObserver=self.GridGroupObserver(self), axisGroupObserver=self.AxisGroupObserver(self), clearGroupObserver=self.ClearGroupObserver(self), labelGroupObserver=self.LabelGroupObserver(self), indicatorGroupObserver=self.IndicatorGroupObserver(self), dataFigureObserver=self.DataFigureObserver(self), dataPool=[], )
def __init__(self, *args, **kwargs): FigureWindow.__init__(self, *args, **kwargs) self.currentData = None # algorithm dict and current data self.algorithms = AlgorithmDict() self.lockAttribute('algorithms') # # The toolbar toolTabs = self.toolTabs figureBook = self.figureBook frmAlgo = Frame(toolTabs) grpAlgoSel = AlgoSelGroup(frmAlgo, topwin=self) grpAlgoSel.pack(side=LEFT, fill=Y) grpParams = ParamsGroup(frmAlgo, topwin=self) grpParams.pack(side=LEFT, fill=Y) grpSolve = OptimizeGroup(frmAlgo, topwin=self) grpSolve.pack(side=LEFT, fill=Y) toolTabs.add(frmAlgo, text='Algorithm') with self.attributeLock: setMultiAttr(self, grpAlgoSel = grpAlgoSel, grpParams = grpParams, grpSolve = grpSolve ) self.makeViewTab() self.makeMarkerTab() self.makeExportTab() # End toolbar figureBook.makeFigures( figureMeta = [ dict(name='Envelope', polar=False), dict(name='Phase', polar=False), dict(name='AutoCorrelation', polar=False), dict(name='PSD', polar=False) ] ) with open(Application.instance.configFileName) as f: config = json.load(f) algorithms = config['SingleWaveformAlgorithms'] for algo in algorithms: self.loadAlgorithm(moduleName=algo['ModuleName'], className=algo['ClassName']) self.grpAlgoSel.algoList.current(len(algorithms)-1) figEnvelope = figureBook[0] figEnvelope.plotFunction = lambda currentData, *args, **kwargs:\ figEnvelope.plot(abs(currentData), *args, **kwargs) figPhase = figureBook[1] figPhase.plotFunction = lambda currentData, *args, **kwargs:\ figPhase.plot(angle(currentData), *args, **kwargs) def plot_acdb(currentData, *args, **kwargs): s = currentData if not isinstance(s, ndarray): s = array(s) N = len(s) ac = convolve(s, conj(s[::-1])) acdb = 20*log10(abs(ac)) acdb = acdb - max(acdb) figAuto.plot(r_[(-N+1):N], acdb, *args, **kwargs) figAuto = figureBook[2] figAuto.plotFunction = plot_acdb figPSD = figureBook[3] figPSD.plotFunction = lambda currentData, *args, **kwargs:\ figPSD.plot(abs(fft.fft(currentData)), *args, **kwargs)
def __init__(self, *args, **kwargs): self._app = Application.instance self.__topwin = kwargs.pop('topwin') Group.__init__(self, *args, **kwargs) frm = Frame(self) self.__center = ParamItem(frm) setMultiAttr(self.__center, labelText='center(deg)', entryText=0, checkFunc=self._app.checkInt, entryWidth=5, labelWidth=10) self.__center.pack(side=TOP) self._app.balloon.bind_widget( self.__center, balloonmsg='Specify the beam center here.') self.__width = ParamItem(frm) setMultiAttr(self.__width, labelText='width(deg)', entryText=20, checkFunc=self._app.checkInt, entryWidth=5, labelWidth=10) self.__width.pack(side=TOP) self._app.balloon.bind_widget( self.__width, balloonmsg='Specify the beam width here.') self.__uiImages = [] imageAddBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Add_Button.png')) self.__uiImages.append(imageAddBtn) btn = Button(frm, image=imageAddBtn, command=self.onAdd) btn.pack(side=LEFT) self._app.balloon.bind_widget( btn, balloonmsg='Add new beam to the ideal pattern.') imageDelBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Del_Button.png')) self.__uiImages.append(imageDelBtn) btn = Button(frm, image=imageDelBtn, command=self.onDel) btn.pack(side=LEFT) self._app.balloon.bind_widget( btn, balloonmsg='Remove the selected beam in the listbox.') imageClrBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Clear_Button.png')) self.__uiImages.append(imageClrBtn) btn = Button(frm, image=imageClrBtn, command=self.onClear) btn.pack(side=LEFT) self._app.balloon.bind_widget( btn, balloonmsg='Clear the listbox of the beam parameters.') imagePlotBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Plot_Button.png')) self.__uiImages.append(imagePlotBtn) btn = Button(frm, image=imagePlotBtn, command=self.onPlotIdealPattern) btn.pack(side=LEFT) self._app.balloon.bind_widget(btn, balloonmsg='Plot the ideal pattern.') frm.pack(side=LEFT, fill=Y) self.__paramlist = ScrolledList(self) self.__paramlist.list.config(height=4, width=10) self.__paramlist.pack(side=LEFT) self.name = 'Edit Ideal Pattern' self.optgrp = None
def __init__(self, *args, **kwargs): self._app = Application.instance self.__topwin = kwargs.pop('topwin') Group.__init__(self, *args, **kwargs) frm = Frame(self) self.__center = ParamItem(frm) setMultiAttr(self.__center, labelText = 'center(deg)', entryText = 0, checkFunc = self._app.checkInt, entryWidth = 5, labelWidth = 10 ) self.__center.pack(side=TOP) self._app.balloon.bind_widget(self.__center, balloonmsg='Specify the beam center here.') self.__width = ParamItem(frm) setMultiAttr(self.__width, labelText = 'width(deg)', entryText = 20, checkFunc = self._app.checkInt, entryWidth = 5, labelWidth = 10 ) self.__width.pack(side=TOP) self._app.balloon.bind_widget(self.__width, balloonmsg='Specify the beam width here.') self.__uiImages = [] imageAddBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Add_Button.png') ) self.__uiImages.append(imageAddBtn) btn = Button(frm, image=imageAddBtn, command=self.onAdd) btn.pack(side=LEFT) self._app.balloon.bind_widget(btn, balloonmsg='Add new beam to the ideal pattern.') imageDelBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Del_Button.png') ) self.__uiImages.append(imageDelBtn) btn = Button(frm, image=imageDelBtn, command=self.onDel) btn.pack(side=LEFT) self._app.balloon.bind_widget(btn, balloonmsg='Remove the selected beam in the listbox.') imageClrBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Clear_Button.png') ) self.__uiImages.append(imageClrBtn) btn = Button(frm, image=imageClrBtn, command=self.onClear) btn.pack(side=LEFT) self._app.balloon.bind_widget(btn, balloonmsg='Clear the listbox of the beam parameters.') imagePlotBtn = ImageTk.PhotoImage( file=uiImagePath('Pattern_Plot_Button.png') ) self.__uiImages.append(imagePlotBtn) btn = Button(frm, image=imagePlotBtn, command=self.onPlotIdealPattern) btn.pack(side=LEFT) self._app.balloon.bind_widget(btn, balloonmsg='Plot the ideal pattern.') frm.pack(side=LEFT, fill=Y) self.__paramlist = ScrolledList(self) self.__paramlist.list.config(height=4, width=10) self.__paramlist.pack(side=LEFT) self.name = 'Edit Ideal Pattern' self.optgrp = None