def body(self, guiFrame): self.geometry('600x350') guiFrame.expandGrid(0, 0) options = ['Axis Units', 'Axis Types', 'Panel Types'] tabbedFrame = TabbedFrame(guiFrame, options=options, grid=(0, 0)) frameA, frameB, frameC = tabbedFrame.frames self.tabbedFrame = tabbedFrame # # Units # frameA.expandGrid(0, 0) tipTexts = [ 'Row number', 'Short text name for the unit of measurement, for graphical display', 'Whether the axis values decrease left to right & bottom to top. For example "ppm" does, but most other units do not' ] headings = ('#', 'Name', 'Is backwards?') self.axis_unit_table = ScrolledMatrix(frameA, headingList=headings, callback=self.selectAxisUnit, deleteFunc=self.deleteAxisUnit, tipTexts=tipTexts, grid=(0, 0)) tipTexts = [ 'Create a new specification of a unit of measurement', 'Delete the selected measurement unit' ] texts = ['Create', 'Delete'] commands = [self.createAxisUnit, self.deleteAxisUnit] self.axis_unit_buttons = ButtonList(frameA, texts=texts, tipTexts=tipTexts, grid=(1, 0), commands=commands) # # Types # frameB.expandGrid(0, 0) tipTexts = [ 'Row number', 'Name of window axis type, for graphical interface etc.', 'Which isotopes the axis definition covers', 'What kind of physical property is measured along the window axis', 'Whether the axis represents discretely sampled values or a continuum of values (albeit fixed to a data grid)', 'The upper and lower bounds for numerical values allowed on the axis', 'The number of decimal places used to round axis values in graphical displays', 'The relative scale for the peak symbol (i.e the "X" shape) size compared to other axes', 'Units of measurement allowed for this kind of axis' ] headingList = ('#', 'Name', 'Isotope\ncodes', 'Measurement\nType', 'Dim\nSampled?', 'Region', 'Decimal\nplaces', 'Peak\nSize', 'Allowed\nUnits') self.regionEntry = FloatEntry(self, isArray=True, returnCallback=self.setRegion, width=12) self.decimalEntry = IntEntry(self, returnCallback=self.setDecimal, width=5) self.peakSizeEntry = FloatEntry(self, returnCallback=self.setPeakSize, width=5) editWidgets = [ None, None, None, None, None, self.regionEntry, self.decimalEntry, self.peakSizeEntry, None ] editGetCallbacks = [ None, None, None, None, None, self.getRegion, self.getDecimal, self.getPeakSize, self.addUnit ] editSetCallbacks = [ None, None, None, None, None, self.setRegion, self.setDecimal, self.setPeakSize, None ] self.axisTypeMatrix = ScrolledMatrix(frameB, tipTexts=tipTexts, headingList=headingList, initialRows=5, grid=(0, 0), callback=self.selectAxisType, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, deleteFunc=self.deleteAxisType) tipTexts = [ 'Create a new kind of axis to use in spectrum windows', 'Delete the selected window axis type specification' ] texts = ['Create', 'Delete'] commands = [self.createAxisType, self.deleteAxisType] self.axis_type_buttons = ButtonList(frameB, texts=texts, tipTexts=tipTexts, commands=commands, grid=(1, 0)) # # Types # frameC.expandGrid(0, 0) tipTexts = [ 'Row number', 'Name of panel type specification', 'Which kind of axis the panel is a subtype of' ] headings = ('#', 'Name', 'AxisType') self.panelTypeMatrix = ScrolledMatrix(frameC, tipTexts=tipTexts, headingList=headings, initialRows=5, callback=self.selectPanelType, deleteFunc=self.deletePanelType) self.panelTypeMatrix.grid(row=0, column=0, sticky='nsew') tipTexts = [ 'Add a new panel type specification (a subtype of a given kind of axis)', 'Delete the selected panel type specification' ] texts = ['Create', 'Delete'] commands = [self.createPanelType, self.deletePanelType] self.panel_type_buttons = ButtonList(frameC, texts=texts, grid=(1, 0), commands=commands, tipTexts=tipTexts) # # Main # buttons = UtilityButtonList(tabbedFrame.sideFrame, helpUrl=self.help_url, grid=(0, 0), sticky='e') self.updateAxisUnitTable() self.updateAxisTypeTable() self.updatePanelTypeTable() self.selectAxisUnit() self.selectAxisType() self.selectPanelType() self.administerNotifiers(self.registerNotify)
def body(self, guiFrame): row = 0 col = 0 # frame = Frame( guiFrame ) # frame.grid(row=row, column=col, sticky='news') self.menuBar = Menu(guiFrame) self.menuBar.grid(row=row, column=col, sticky='ew') #---------------------------------------------------------------------------------- # Project frame #---------------------------------------------------------------------------------- # guiFrame.grid_columnconfigure(row, weight=1) # frame = LabelFrame(guiFrame, text='Project', font=medFont) row = +1 col = 0 frame = LabelFrame(guiFrame, text='Project', **labelFrameAttributes) print '>', frame.keys() frame.grid(row=row, column=col, sticky='nsew') frame.grid_columnconfigure(2, weight=1) # frame.grid_rowconfigure(0, weight=1) srow = 0 self.projectOptions = [ 'old', 'new from PDB', 'new from CCPN', 'new from CYANA' ] self.projOptionsSelect = RadioButtons(frame, selected_index=0, entries=self.projectOptions, direction='vertical', select_callback=self.updateGui) self.projOptionsSelect.grid(row=srow, column=0, rowspan=len(self.projectOptions), columnspan=2, sticky='w') if self.options.name: text = self.options.name else: text = '' # end if self.projEntry = Entry(frame, bd=1, text=text, returnCallback=self.updateGui) self.projEntry.grid(row=srow, column=2, columnspan=2, sticky='ew') # self.projEntry.bind('<Key>', self.updateGui) self.projEntry.bind('<Leave>', self.updateGui) projButton = Button(frame, bd=1, command=self.chooseOldProjectFile, text='browse') projButton.grid(row=srow, column=3, sticky='ew') srow += 1 self.pdbEntry = Entry(frame, bd=1, text='') self.pdbEntry.grid(row=srow, column=2, sticky='ew') self.pdbEntry.bind('<Leave>', self.updateGui) pdbButton = Button(frame, bd=1, command=self.choosePdbFile, text='browse') pdbButton.grid(row=srow, column=3, sticky='ew') srow += 1 self.ccpnEntry = Entry(frame, bd=1, text='') self.ccpnEntry.grid(row=srow, column=2, sticky='ew') self.ccpnEntry.bind('<Leave>', self.updateGui) ccpnButton = Button(frame, bd=1, command=self.chooseCcpnFile, text='browse') ccpnButton.grid(row=srow, column=3, sticky='ew') srow += 1 self.cyanaEntry = Entry(frame, bd=1, text='') self.cyanaEntry.grid(row=srow, column=2, sticky='ew') self.cyanaEntry.bind('<Leave>', self.updateGui) cyanaButton = Button(frame, bd=1, command=self.chooseCyanaFile, text='browse') cyanaButton.grid(row=srow, column=3, sticky='ew') #Empty row srow += 1 label = Label(frame, text='') label.grid(row=srow, column=0, sticky='nw') srow += 1 label = Label(frame, text='Project name:') label.grid(row=srow, column=0, sticky='nw') self.nameEntry = Entry(frame, bd=1, text='') self.nameEntry.grid(row=srow, column=2, sticky='w') #Empty row srow += 1 label = Label(frame, text='') label.grid(row=srow, column=0, sticky='nw') srow += 1 self.openProjectButton = Button(frame, command=self.openProject, text='Open Project', **actionButtonAttributes) self.openProjectButton.grid(row=srow, column=0, columnspan=4, sticky='ew') #---------------------------------------------------------------------------------- # status #---------------------------------------------------------------------------------- # guiFrame.grid_columnconfigure(1, weight=0) srow = 0 frame = LabelFrame(guiFrame, text='Status', **labelFrameAttributes) frame.grid(row=srow, column=1, sticky='wnes') self.projectStatus = Text(frame, height=11, width=70, borderwidth=0, relief='flat') self.projectStatus.grid(row=0, column=0, sticky='wen') #Empty row srow += 1 label = Label(frame, text='') label.grid(row=srow, column=0, sticky='nw') srow += 1 self.closeProjectButton = Button(frame, command=self.closeProject, text='Close Project', **actionButtonAttributes) self.closeProjectButton.grid(row=srow, column=0, columnspan=4, sticky='ew') #---------------------------------------------------------------------------------- # Validate frame #---------------------------------------------------------------------------------- row += 1 col = 0 frame = LabelFrame(guiFrame, text='Validate', **labelFrameAttributes) # frame = LabelFrame(guiFrame, text='Validate', font=medFont) frame.grid(row=row, column=col, sticky='nsew') # frame.grid_columnconfigure(2, weight=1) frame.grid_rowconfigure(0, weight=1) srow = 0 # label = Label(frame, text='validation') # label.grid(row=srow,column=0,sticky='nw') # # self.selectDoValidation = CheckButton(frame) # self.selectDoValidation.grid(row=srow, column=1,sticky='nw' ) # self.selectDoValidation.set(True) # # srow += 1 # label = Label(frame, text='') # label.grid(row=srow,column=0,sticky='nw') # # srow += 1 label = Label(frame, text='checks') label.grid(row=srow, column=0, sticky='nw') self.selectCheckAssign = CheckButton(frame) self.selectCheckAssign.grid(row=srow, column=1, sticky='nw') self.selectCheckAssign.set(True) label = Label(frame, text='assignments and shifts') label.grid(row=srow, column=2, sticky='nw') # srow += 1 # self.selectCheckQueen = CheckButton(frame) # self.selectCheckQueen.grid(row=srow, column=4,sticky='nw' ) # self.selectCheckQueen.set(False) # label = Label(frame, text='QUEEN') # label.grid(row=srow,column=5,sticky='nw') # # queenButton = Button(frame, bd=1,command=None, text='setup') # queenButton.grid(row=srow,column=6,sticky='ew') srow += 1 self.selectCheckResraint = CheckButton(frame) self.selectCheckResraint.grid(row=srow, column=1, sticky='nw') self.selectCheckResraint.set(True) label = Label(frame, text='restraints') label.grid(row=srow, column=2, sticky='nw') srow += 1 self.selectCheckStructure = CheckButton(frame) self.selectCheckStructure.grid(row=srow, column=1, sticky='nw') self.selectCheckStructure.set(True) label = Label(frame, text='structural') label.grid(row=srow, column=2, sticky='nw') srow += 1 self.selectMakeHtml = CheckButton(frame) self.selectMakeHtml.grid(row=srow, column=1, sticky='nw') self.selectMakeHtml.set(True) label = Label(frame, text='generate HTML') label.grid(row=srow, column=2, sticky='nw') srow += 1 self.selectCheckScript = CheckButton(frame) self.selectCheckScript.grid(row=srow, column=1, sticky='nw') self.selectCheckScript.set(False) label = Label(frame, text='user script') label.grid(row=srow, column=0, sticky='nw') self.validScriptEntry = Entry(frame, bd=1, text='') self.validScriptEntry.grid(row=srow, column=2, columnspan=3, sticky='ew') scriptButton = Button(frame, bd=1, command=self.chooseValidScript, text='browse') scriptButton.grid(row=srow, column=5, sticky='ew') srow += 1 label = Label(frame, text='ranges') label.grid(row=srow, column=0, sticky='nw') self.rangesEntry = Entry(frame, text='') self.rangesEntry.grid(row=srow, column=2, columnspan=3, sticky='ew') # self.validScriptEntry = Entry(frame, bd=1, text='') # self.validScriptEntry.grid(row=srow,column=3,sticky='ew') # # scriptButton = Button(frame, bd=1,command=self.chooseValidScript, text='browse') # scriptButton.grid(row=srow,column=4,sticky='ew') srow += 1 texts = ['Run Validation', 'View Results', 'Setup QUEEN'] commands = [self.runCing, None, None] buttonBar = ButtonList(frame, texts=texts, commands=commands, expands=True) buttonBar.grid(row=srow, column=0, columnspan=6, sticky='ew') for button in buttonBar.buttons: button.config(**actionButtonAttributes) # end for self.runButton = buttonBar.buttons[0] self.viewResultButton = buttonBar.buttons[1] self.queenButton = buttonBar.buttons[2] #---------------------------------------------------------------------------------- # Miscellaneous frame #---------------------------------------------------------------------------------- row += 0 col = 1 # frame = LabelFrame(guiFrame, text='Miscellaneous', font=medFont) frame = LabelFrame(guiFrame, text='Miscellaneous', **labelFrameAttributes) frame.grid(row=row, column=col, sticky='news') frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(4, weight=1, minsize=30) frame.grid_rowconfigure(0, weight=1) # Exports srow = 0 label = Label(frame, text='export to') label.grid(row=srow, column=0, sticky='nw') self.selectExportXeasy = CheckButton(frame) self.selectExportXeasy.grid(row=srow, column=1, sticky='nw') self.selectExportXeasy.set(True) label = Label(frame, text='Xeasy, Sparky, TALOS, ...') label.grid(row=srow, column=2, sticky='nw') srow += 1 self.selectExportCcpn = CheckButton(frame) self.selectExportCcpn.grid(row=srow, column=1, sticky='nw') self.selectExportCcpn.set(True) label = Label(frame, text='CCPN') label.grid(row=srow, column=2, sticky='nw') srow += 1 self.selectExportQueen = CheckButton(frame) self.selectExportQueen.grid(row=srow, column=1, sticky='nw') self.selectExportQueen.set(True) label = Label(frame, text='QUEEN') label.grid(row=srow, column=2, sticky='nw') srow += 1 self.selectExportRefine = CheckButton(frame) self.selectExportRefine.grid(row=srow, column=1, sticky='nw') self.selectExportRefine.set(True) label = Label(frame, text='refine') label.grid(row=srow, column=2, sticky='nw') srow += 1 label = Label(frame, text='') label.grid(row=srow, column=0, sticky='nw') # User script srow += 1 label = Label(frame, text='user script') label.grid(row=srow, column=0, sticky='nw') self.selectMiscScript = CheckButton(frame) self.selectMiscScript.grid(row=srow, column=1, sticky='nw') self.selectMiscScript.set(False) self.miscScriptEntry = Entry(frame, bd=1, text='') self.miscScriptEntry.grid(row=srow, column=3, sticky='ew') script2Button = Button(frame, bd=1, command=self.chooseMiscScript, text='browse') script2Button.grid(row=srow, column=4, sticky='ew') srow += 1 texts = ['Export', 'Run Script'] commands = [None, None] buttonBar = ButtonList(frame, texts=texts, commands=commands, expands=True) buttonBar.grid(row=srow, column=0, columnspan=5, sticky='ew') for button in buttonBar.buttons: button.config(**actionButtonAttributes) # end for self.exportButton = buttonBar.buttons[0] self.scriptButton = buttonBar.buttons[1] #---------------------------------------------------------------------------------- # Textarea #---------------------------------------------------------------------------------- row += 1 guiFrame.grid_rowconfigure(row, weight=1) self.outputTextBox = ScrolledText(guiFrame) self.outputTextBox.grid(row=row, column=0, columnspan=2, sticky='nsew') self.redirectConsole() #---------------------------------------------------------------------------------- # Buttons #---------------------------------------------------------------------------------- row += 1 col = 0 texts = ['Quit', 'Help'] commands = [self.close, None] self.buttonBar = ButtonList(guiFrame, texts=texts, commands=commands, expands=True) self.buttonBar.grid(row=row, column=col, columnspan=2, sticky='ew') # self.openProjectButton = self.buttonBar.buttons[0] # self.closeProjectButton = self.buttonBar.buttons[1] # self.runButton = self.buttonBar.buttons[0] # self.viewResultButton = self.buttonBar.buttons[1] for button in self.buttonBar.buttons: button.config(**actionButtonAttributes)
def __init__(self, guiParent, basePopup): # Base popup required to handle notification of data model changes # e.g. new peak lists, so that the GUI can update to the latest # state self.basePopup = basePopup self.guiParent = guiParent # should the screen autorefresh self.autoRefresh = False # add this to shortcuts to ease navigation self.basePopup.frameShortcuts['Repository'] = self # get a port proxy instance # this should probably belong to the repository directly # or else should belong in a dictionary in the main gui # layer when it can be picked up easily # FIXME JMCI # need to work out how to get a number of these! loc = SharedBeanServiceLocator() self.port = loc.getSharedBean() self.registerNotify = basePopup.registerNotify self.unregisterNotify = basePopup.unregisterNotify Frame.__init__(self, guiParent) # set up the grid self.grid_columnconfigure(0, weight=0, minsize=20) self.grid_columnconfigure(1, weight=1, minsize=10) self.grid_columnconfigure(2, weight=0, minsize=20) self.grid_rowconfigure(0, weight=0, minsize=5) self.grid_rowconfigure(1, weight=0, minsize=0) self.grid_rowconfigure(2, weight=0, minsize=10) self.grid_rowconfigure(3, weight=0, minsize=10) self.grid_rowconfigure(4, weight=0, minsize=10) self.grid_rowconfigure(5, weight=1, minsize=10) self.grid_rowconfigure(6, weight=0, minsize=10) self.grid_rowconfigure(7, weight=0, minsize=10) # widgets for view when no data self.noDataWidgets = [] self.noRepLabel = Label(self, text='No repository currently selected.') self.noDataWidgets.append(self.noRepLabel) # widgets for view when current repository set self.dataWidgets = [] self.repTitle = Label(self, text='Repository:', font='Helvetica16') self.dataWidgets.append(self.repTitle) #self.repLabel = Label(self,text='All Projects in Repository') #self.dataWidgets.append(self.repLabel) self.repTree = Tree(self, doubleCallback=self.goto_project_tab) self.dataWidgets.append(self.repTree) sel = 1 if self.autoRefresh: sel = 0 self.autoRefreshSwitchLabel = Label(self, text='Auto Refresh') self.autoRefreshSwitch = RadioButtons(self, ['on', 'off'], select_callback=self.set_refresh, selected_index=sel) # need to decide whether this is static or not r_button_texts = [ 'Add to Basket', ' Import ', ' Export ', ' Refresh ', 'Properties' ] r_button_cmds = [ self.tmpCall, self.import_project, self.export_project, self.drawFrame, self.goto_project_tab ] self.rep_button_list = ButtonList(self, r_button_texts, r_button_cmds) self.dataWidgets.append(self.rep_button_list) self.filterFrame = FilterFrame(self, self.basePopup, text='Filter') self.dataWidgets.append(self.filterFrame) baskets = ('basket1', 'basket2', 'basket3') self.basketSelect = PulldownList(self, self.tmpCall, baskets) self.dataWidgets.append(self.basketSelect) basketElements = ('1ay3', '1ay7') self.basketList = ScrolledListbox(self, basketElements, 25, 18) self.dataWidgets.append(self.basketList) b_button_texts = ['Remove from Basket', 'New Basket'] b_button_cmds = [self.tmpCall, self.tmpCall] self.b_button_list = ButtonList(self, b_button_texts, b_button_cmds) self.dataWidgets.append(self.b_button_list) # draw if not automatically refreshing if sel == 1: self.drawFrame() # set up a loop self.refresh()
def body(self, guiFrame): row = 0 frame = Frame(guiFrame, grid=(row, 0)) frame.expandGrid(None, 6) label = Label(frame, text='Chain:', grid=(0, 0)) tipText = 'Selects which molecular chain to show residues and chemical shift values for' self.chainPulldown = PulldownList(frame, callback=self.changeChain, grid=(0, 1), tipText=tipText) label = Label(frame, text=' Shift List:', grid=(0, 2)) tipText = 'Selects which shift list is used to derive the displayed chemical shift values' self.shiftListPulldown = PulldownList(frame, callback=self.changeShiftList, grid=(0, 3), tipText=tipText) label = Label(frame, text=' List all shifts:', grid=(0, 4)) tipText = 'Sets whether to display all the chemical shifts for residues or just for the nominated atom types in columns' self.otherShiftsSelect = CheckButton(frame, callback=self.draw, grid=(0, 5), tipText=tipText) utilButtons = UtilityButtonList(frame, helpUrl=self.help_url, grid=(0, 7)) row += 1 frame = Frame(guiFrame, grid=(row, 0)) frame.expandGrid(None, 6) label = Label(frame, text=' 1-letter codes:', grid=(0, 0)) tipText = 'Whether to use 1-letter residue codes in the table, or otherwise Ccp/three-letter codes' self.oneLetterSelect = CheckButton(frame, callback=self.draw, grid=(0, 1), selected=False, tipText=tipText) precisions = [0.1, 0.01, 0.001] texts = [str(t) for t in precisions] label = Label(frame, text=' 1H precision:', grid=(0, 2)) tipText = 'Specifies how many decimal places to use when displaying 1H chemical shift values' self.protonPrecisionSelect = PulldownList(frame, texts=texts, objects=precisions, callback=self.draw, index=1, grid=(0, 3), tipText=tipText) label = Label(frame, text=' Other precision:') label.grid(row=0, column=4, sticky='w') tipText = 'Specifies how many decimal places to use when displaying chemical shift values for isotopes other than 1H' self.otherPrecisionSelect = PulldownList(frame, texts=texts, objects=precisions, callback=self.draw, index=1, grid=(0, 5), tipText=tipText) row += 1 frame = Frame(guiFrame, grid=(row, 0)) frame.expandGrid(None, 1) label = Label(frame, text='Column\nAtoms:', grid=(0, 0)) tipText = 'Selects which kinds of atoms are displayed in aligned columns, or otherwise displayed at the end of the residue row (if "List all shifts" is set)' self.optSelector = PartitionedSelector(frame, self.toggleOpt, tipText=tipText, maxRowObjects=10, grid=(0, 1), sticky='ew') options = ['H', 'N', 'C', 'CA', 'CB', 'CG'] self.optSelector.update(objects=options, labels=options, selected=['H', 'N', 'CA']) row += 1 guiFrame.expandGrid(row, 0) self.canvasFrame = ScrolledCanvas(guiFrame, relief='groove', width=650, borderwidth=2, resizeCallback=None, grid=(row, 0), padx=1, pady=1) self.canvas = self.canvasFrame.canvas #self.canvas.bind('<Button-1>', self.toggleResidue) row += 1 tipTexts = [ 'Output information from the table as PostScript file, for printing etc.', 'Output information from the table as a whitespace separated plain text file' ] commands = [self.makePostScript, self.exportText] texts = ['Export PostScript', 'Export Text'] buttonList = ButtonList(guiFrame, commands=commands, texts=texts, grid=(row, 0), tipTexts=tipTexts) chains = self.getChains() if len(chains) > 1: self.chain = chains[1] else: self.chain = None self.updateShiftLists() self.updateChains() self.otherShiftsSelect.set(True) self.update() for func in ('__init__', 'delete'): self.registerNotify(self.updateChains, 'ccp.molecule.MolSystem.Chain', func) for func in ('__init__', 'delete'): self.registerNotify(self.updateShiftLists, 'ccp.nmr.Nmr.ShiftList', func)
def body(self, guiFrame): guiFrame.grid_columnconfigure(3, weight=1) row = 0 label = Label(guiFrame, text='Spin System: ', grid=(row,0)) tipText = 'Indicates which spin system the residue type prediction is done for' self.spinSystemLabel = Label(guiFrame, text='Serial: Assignment:', grid=(row,1), gridSpan=(1,3), tipText=tipText) row += 1 label = Label(guiFrame, text='Shift List: ', grid=(row,0)) tipText = 'Selects which shift list is the source of chemical shift information to make the residue type prediction' self.shiftListPulldown = PulldownList(guiFrame, tipText=tipText, callback=self.setShiftList, grid=(row,1)) label = Label(guiFrame, text='Chain: ', grid=(row,2)) tipText = 'Selects which molecular chain the prediction is for; sets prior probabilities for the various residue types' self.chainPulldown = PulldownList(guiFrame, self.changeChain, grid=(row,3), tipText=tipText) row += 1 labelFrame = LabelFrame(guiFrame, text='Resonances', grid=(row,0), gridSpan=(1,4)) labelFrame.expandGrid(0,0) self.atomTypePulldown = PulldownList(self, callback=self.setAtomType) editWidgets = [ None, None, None, None, self.atomTypePulldown ] editGetCallbacks = [ None, None, None, None, self.getAtomType] editSetCallbacks = [ None, None, None, None, self.setAtomType] tipTexts = ['The nuclear isotope type of the resonance within the current spin system', 'The assignment annotation for the spin system resonance within the current spin system', 'The chemical shift of the resonance in the stated shift list', 'The weighted standard deviation of the resonance chemical shift', 'The current atom type of the resonance; when set this helps refine residue type prediction'] headingList = ['Isotope','Name','Shift\nValue','Shift\nError','Atom\nType'] self.resonanceMatrix = ScrolledMatrix(labelFrame, editWidgets=editWidgets, multiSelect=False, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, headingList=headingList, callback=self.selectResonance, grid=(0,0), tipTexts=tipTexts) tipTexts = ['Remove the selected resonance from the current spin system', 'Remove residue type information from the current spin system', 'Show a table of information for the selected resonance, including a list of all peak dimension positions', 'Show a table of the peaks to which the selected resonance is assigned'] texts = ['Remove From\nSpin System', 'Deassign\nResidue Type', 'Resonance\nInfo', 'Show\nPeaks'] commands = [self.removeResonance, self.deassignType, self.showResonanceInfo, self.showPeaks] buttonList = ButtonList(labelFrame, texts=texts, commands=commands, grid=(1,0), tipTexts=tipTexts) self.resButtons = buttonList.buttons row += 1 guiFrame.grid_rowconfigure(row, weight=1) labelFrame = LabelFrame(guiFrame, text='Type Scores', grid=(row,0), gridSpan=(1,4)) labelFrame.expandGrid(0,0) tipTexts = ['The ranking of the residue type possibility for the current spin system', 'The CCPN residue code for the type', 'The estimated percentage probability of the spin system being the residue type'] headingList = ['Rank','Ccp Code','% Probability'] self.scoresMatrix = ScrolledMatrix(labelFrame, headingList=headingList, callback=self.selectCcpCode, grid=(0,0), tipTexts=tipTexts) row += 1 tipTexts = ['Assign the residue type of the current spin system to the kind selected in the lower table',] texts = ['Assign Spin System Type'] commands = [self.assign] bottomButtons = UtilityButtonList(guiFrame, texts=texts, commands=commands, helpUrl=self.help_url, grid=(row,0), gridSpan=(1,4), tipTexts=tipTexts) self.assignButton = bottomButtons.buttons[0] self.updateShiftLists() self.updateChains() self.getChainAtomTypes() self.update() self.curateNotifiers(self.registerNotify)
def body(self, guiFrame): guiFrame.grid_columnconfigure(0, weight=1) row = 0 strucGenFrame = LabelFrame(guiFrame, text='Generation Runs') strucGenFrame.grid(row=row, column=0, columnspan=1, sticky='nsew') strucGenFrame.grid_columnconfigure(0, weight=1) strucGenFrame.grid_rowconfigure(0, weight=1) guiFrame.grid_rowconfigure(row, weight=0) #self.editDetailsEntry = Entry(self,text='',returnCallback = self.setDetails, width=12) #editWidgets = [None, None, None, None, None, self.editDetailsEntry] #editGetCallbacks = [None, None, None, None, None, self.getDetails] #editSetCallbacks = [None, None, None, None, None, self.setDetails] colHeadings = [ '#', 'Constraint\nLists', 'Violation\nLists', 'Structures', 'Fixed\nAtom Sets', 'Fixes\nResonance Sets', 'Chain\nStates', 'Database\nEntries', 'Resonance\nClouds' ] editWidgets = [None, None, None, None, None, None, None, None, None] editGetCallbacks = [ None, None, None, None, None, None, None, None, None ] editSetCallbacks = [ None, None, None, None, None, None, None, None, None ] self.structGenMatrix = ScrolledMatrix( strucGenFrame, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, initialRows=3, initialCols=6, headingList=colHeadings, callback=self.selectStructGenCell, objectList=[], textMatrix=[ [], ]) self.structGenMatrix.grid(row=0, column=0, sticky='nsew') texts = ['View Structures', 'Delete'] commands = [self.viewStructures, self.deleteStrucGen] self.structGenButtons = ButtonList(strucGenFrame, texts=texts, expands=True, commands=commands) self.structGenButtons.grid(row=1, column=0, sticky='ew') row += 1 constrFrame = LabelFrame(guiFrame, text='Constraint Lists') constrFrame.grid(row=row, column=0, columnspan=1, sticky='nsew') constrFrame.grid_columnconfigure(0, weight=1) constrFrame.grid_rowconfigure(0, weight=1) guiFrame.grid_rowconfigure(row, weight=1) colHeadings = [ '#', 'Type', 'Name', 'Constraints', 'Experiments', 'Details', 'Unit' ] editWidgets = [None, None, None, None, None, None, None] editGetCallbacks = [None, None, None, None, None, None, None] editSetCallbacks = [None, None, None, None, None, None, None] self.constrListMatrix = ScrolledMatrix( constrFrame, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, initialRows=10, headingList=colHeadings, callback=self.selectConstrListCell, objectList=[], textMatrix=[ [], ]) self.constrListMatrix.grid(row=0, column=0, sticky='nsew') texts = ['View Constraints', 'Create List', 'Delete List'] commands = [ self.viewConstraints, self.createConstraints, self.deleteConstraints ] self.constrListButtons = ButtonList(constrFrame, texts=texts, expands=True, commands=commands) self.constrListButtons.grid(row=1, column=0, sticky='ew') self.constrListButtons.buttons[1].disable() row += 1 violFrame = LabelFrame(guiFrame, text='Violation Lists') violFrame.grid(row=row, column=0, columnspan=1, sticky='nsew') violFrame.grid_columnconfigure(0, weight=1) violFrame.grid_rowconfigure(0, weight=1) guiFrame.grid_rowconfigure(row, weight=1) colHeadings = [ '#', 'Violations', 'Structures', 'Details', ] editWidgets = [None, None, None, None] editGetCallbacks = [None, None, None, None] editSetCallbacks = [None, None, None, None] self.violListMatrix = ScrolledMatrix(violFrame, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, initialRows=10, headingList=colHeadings, callback=self.selectViolListCell, objectList=[], textMatrix=[ [], ]) self.violListMatrix.grid(row=0, column=0, sticky='nsew') texts = ['View Violations', 'Delete List'] commands = [self.viewViolations, self.deleteViolations] self.violListButtons = ButtonList(violFrame, texts=texts, expands=True, commands=commands) self.violListButtons.grid(row=1, column=0, sticky='ew') row += 1 self.bottomButtons = UtilityButtonList(guiFrame, helpUrl=self.help_url) self.bottomButtons.grid(row=row, column=0, columnspan=1, sticky='ew') self.update() for func in ('__init__', 'delete', 'setName', 'setDetails', 'setUnit', 'setExperiments', 'addExperiment', 'removeExperiment'): for clazz in ('ccp.nmr.Nmr.ChemShiftConstraintList', 'ccp.nmr.Nmr.DihedralConstraintList', 'ccp.nmr.Nmr.DistanceConstraintList', 'ccp.nmr.Nmr.HBondConstraintList', 'ccp.nmr.Nmr.JCouplingConstraintList', 'ccp.nmr.Nmr.RdcConstraintList'): self.registerNotify(self.updateAfter, clazz, func) for func in ( '__init__', 'delete', ): for clazz in ('ccp.nmr.Nmr.ChemShiftConstraint', 'ccp.nmr.Nmr.DihedralConstraint', 'ccp.nmr.Nmr.DistanceConstraint', 'ccp.nmr.Nmr.HBondConstraint', 'ccp.nmr.Nmr.JCouplingConstraint', 'ccp.nmr.Nmr.RdcConstraint'): self.registerNotify(self.updateAfter, clazz, func) for func in ('__init__', 'delete', 'setChainStates', 'addChainState', 'removeChainState', 'addEntry', 'removeEntry', 'setResStructures', 'addResStructure', 'setEntries', 'removeResStructure', 'setStructures', 'addStructure', 'removeStructure'): self.registerNotify(self.updateAfter, 'ccp.nmr.Nmr.StructureGeneration', func) for func in ('__init__', 'delete', 'setDetails'): for clazz in ('ccp.nmr.Nmr.ViolationList', ): self.registerNotify(self.updateAfter, clazz, func) for func in ( '__init__', 'delete', ): for clazz in ('ccp.nmr.Nmr.Violation', ): self.registerNotify(self.updateAfter, clazz, func)
def body(self, guiFrame): self.specFreqEntry = IntEntry(self, text=self.specFreq, width=8, returnCallback=self.setSpecFreq) self.maxIterEntry = IntEntry(self, text=self.maxIter, width=8, returnCallback=self.setMaxIter) self.mixTimeEntry = FloatEntry(self, text=self.mixTime, width=8, returnCallback=self.setMixTime) self.corrTimeEntry = FloatEntry(self, text=self.corrTime, width=8, returnCallback=self.setCorrTime) self.leakRateEntry = FloatEntry(self, text=self.leakRate, width=8, returnCallback=self.setLeakRate) guiFrame.grid_columnconfigure(0, weight=1) guiFrame.grid_rowconfigure(1, weight=1) row = 0 labelFrame0 = LabelFrame(guiFrame, text='Input data') labelFrame0.grid(row=row, column=0, sticky=Tkinter.NSEW) labelFrame0.grid_columnconfigure(3, weight=1) label = Label(labelFrame0, text='Assigned NOESY spectrum') label.grid(row=0, column=0, sticky=Tkinter.NW) self.noesyPulldown = PulldownMenu(labelFrame0, entries=self.getNoesys(), callback=self.setNoesy, selected_index=0, do_initial_callback=0) self.noesyPulldown.grid(row=0, column=1, sticky=Tkinter.NW) label = Label(labelFrame0, text='H/D ratio: ') label.grid(row=0, column=2, sticky=Tkinter.NW) self.ratioHDEntry = FloatEntry(labelFrame0, text=self.ratioHD, width=6) self.ratioHDEntry.grid(row=0, column=3, sticky=Tkinter.NW) label = Label(labelFrame0, text='NOESY spectrum 1:') label.grid(row=1, column=0, sticky=Tkinter.NW) self.tmix1Pulldown = PulldownMenu(labelFrame0, entries=self.getNoesys(), callback=self.setNoesy1, selected_index=-0, do_initial_callback=0) self.tmix1Pulldown.grid(row=1, column=1, sticky=Tkinter.NW) label = Label(labelFrame0, text='Tmix (ms): ') label.grid(row=1, column=2, sticky=Tkinter.NW) self.tmix1Entry = FloatEntry(labelFrame0, text=60, width=6) self.tmix1Entry.grid(row=1, column=3, sticky=Tkinter.NW) label = Label(labelFrame0, text='NOESY spectrum 2:') label.grid(row=2, column=0, sticky=Tkinter.NW) self.tmix2Pulldown = PulldownMenu(labelFrame0, entries=self.getNoesys(), callback=self.setNoesy2, selected_index=0, do_initial_callback=0) self.tmix2Pulldown.grid(row=2, column=1, sticky=Tkinter.NW) label = Label(labelFrame0, text='Tmix (ms): ') label.grid(row=2, column=2, sticky=Tkinter.NW) self.tmix2Entry = FloatEntry(labelFrame0, text=120, width=6) self.tmix2Entry.grid(row=2, column=3, sticky=Tkinter.NW) label = Label(labelFrame0, text='NOESY spectrum 3:') label.grid(row=3, column=0, sticky=Tkinter.NW) self.tmix3Pulldown = PulldownMenu(labelFrame0, entries=self.getNoesys(), callback=self.setNoesy3, selected_index=0, do_initial_callback=0) self.tmix3Pulldown.grid(row=3, column=1, sticky=Tkinter.NW) label = Label(labelFrame0, text='Tmix (ms): ') label.grid(row=3, column=2, sticky=Tkinter.NW) self.tmix3Entry = FloatEntry(labelFrame0, text=200, width=6) self.tmix3Entry.grid(row=3, column=3, sticky=Tkinter.NW) label = Label(labelFrame0, text='3D NOESY:') label.grid(row=4, column=0, sticky=Tkinter.NW) self.noesy3dPulldown = PulldownMenu(labelFrame0, entries=self.getNoesys3d(), callback=self.setNoesy3d, selected_index=0, do_initial_callback=0) self.noesy3dPulldown.grid(row=4, column=1, sticky=Tkinter.NW) label10 = Label(labelFrame0, text='Num peaks:') label10.grid(row=5, column=0, sticky=Tkinter.NW) self.numPeaksLabel = Label(labelFrame0, text='0') self.numPeaksLabel.grid(row=5, column=1, sticky=Tkinter.NW) label11 = Label(labelFrame0, text='Num resonances:') label11.grid(row=5, column=2, sticky=Tkinter.NW) self.numResonancesLabel = Label(labelFrame0, text='0') self.numResonancesLabel.grid(row=5, column=3, sticky=Tkinter.NW) row += 1 labelFrame1 = LabelFrame(guiFrame, text='Parameters') labelFrame1.grid(row=row, column=0, sticky=Tkinter.NSEW) labelFrame1.grid_columnconfigure(3, weight=1) label = Label(labelFrame1, text='15N labelled sample:') label.grid(row=0, column=0, sticky=Tkinter.NW) self.nitrogenSelect = CheckButton(labelFrame1, callback=self.setNitrogenLabel) self.nitrogenSelect.grid(row=0, column=1, sticky=Tkinter.W) self.nitrogenSelect.set(1) label = Label(labelFrame1, text='13C labelled sample:') label.grid(row=0, column=2, sticky=Tkinter.NW) self.carbonSelect = CheckButton(labelFrame1, callback=self.setCarbonLabel) self.carbonSelect.grid(row=0, column=3, sticky=Tkinter.W) self.carbonSelect.set(0) labelFrame1.grid_rowconfigure(1, weight=1) data = [ self.specFreq, self.maxIter, self.mixTime, self.corrTime, self.leakRate ] colHeadings = [ 'Spectrometer\nfrequency', 'Max\niterations', 'Mixing\ntime (ms)', 'Correl.\ntime (ns)', 'Leak\nrate' ] editWidgets = [ self.specFreqEntry, self.maxIterEntry, self.mixTimeEntry, self.corrTimeEntry, self.leakRateEntry, ] editGetCallbacks = [ self.getSpecFreq, self.getMaxIter, self.getMixTime, self.getCorrTime, self.getLeakRate, ] editSetCallbacks = [ self.setSpecFreq, self.setMaxIter, self.setMixTime, self.setCorrTime, self.setLeakRate, ] self.midgeParamsMatrix = ScrolledMatrix( labelFrame1, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, maxRows=1, initialCols=5, headingList=colHeadings, callback=None, objectList=[ 'None', ], textMatrix=[ data, ]) self.midgeParamsMatrix.grid(row=1, column=0, columnspan=4, sticky=Tkinter.NSEW) label10 = Label(labelFrame1, text='Benchmark structure') label10.grid(row=2, column=0, sticky=Tkinter.NW) self.structurePulldown = PulldownMenu(labelFrame1, entries=self.getStructures(), callback=self.setStructure, selected_index=0, do_initial_callback=0) self.structurePulldown.grid(row=2, column=1, sticky=Tkinter.NW) label11 = Label(labelFrame1, text='ADC atom types:') label11.grid(row=2, column=2, sticky=Tkinter.NW) self.adcAtomsPulldown = PulldownMenu(labelFrame1, entries=self.getAdcAtomTypes(), callback=self.setAdcAtomTypes, selected_index=0, do_initial_callback=0) self.adcAtomsPulldown.grid(row=2, column=3, sticky=Tkinter.NW) row += 1 labelFrame2 = LabelFrame(guiFrame, text='Output') labelFrame2.grid(row=row, column=0, sticky=Tkinter.NSEW) labelFrame2.grid_columnconfigure(3, weight=1) label20 = Label(labelFrame2, text='Distance constraints:') label20.grid(row=0, column=0, sticky=Tkinter.NW) self.distConstrLabel = Label(labelFrame2, text='0') self.distConstrLabel.grid(row=0, column=1, sticky=Tkinter.NW) label21 = Label(labelFrame2, text='Anti-distance constraints:') label21.grid(row=0, column=2, sticky=Tkinter.NW) self.antiConstrLabel = Label(labelFrame2, text='0') self.antiConstrLabel.grid(row=0, column=3, sticky=Tkinter.NW) texts = [ 'Calculate distances', 'Show distance\nconstraints', 'Show anti-distance\nconstraints' ] commands = [ self.calculateDistances, self.showConstraints, self.showAntiConstraints ] self.midgeButtons = ButtonList(labelFrame2, expands=1, texts=texts, commands=commands) self.midgeButtons.grid(row=1, column=0, columnspan=4, sticky=Tkinter.NSEW) row += 1 self.bottomButtons = createDismissHelpButtonList(guiFrame, expands=0, help_url=None) self.bottomButtons.grid(row=row, column=0, columnspan=4, sticky=Tkinter.EW) self.getPeaks() self.getResonances() self.update() self.geometry('600x400')
def __init__(self, parent, initial_list=None, width=60, height=5, xscroll=True, yscroll=True, addDeleteButtons=False, selectmode=Tkinter.BROWSE, exportselection=0, select_callback=None, double_callback=None, list_background='white', *args, **kw): if (initial_list is None): initial_list = [] Frame.__init__(self, parent, *args, **kw) self.selectmode = selectmode self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) listbox = Tkinter.Listbox(self, width=width, height=height, background=list_background, selectmode=selectmode, exportselection=exportselection) listbox.grid(row=0, column=0, sticky=Tkinter.NSEW) if (xscroll): xscrollbar = Tkinter.Scrollbar(self, orient=Tkinter.HORIZONTAL) xscrollbar.config(command=listbox.xview) listbox.config(xscrollcommand=xscrollbar.set) xscrollbar.grid(row=1, column=0, sticky=Tkinter.EW) if (yscroll): yscrollbar = Tkinter.Scrollbar(self, orient=Tkinter.VERTICAL) yscrollbar.config(command=listbox.yview) listbox.config(yscrollcommand=yscrollbar.set) yscrollbar.grid(row=0, column=1, sticky=Tkinter.NS) if addDeleteButtons: texts = ['Add item', 'Delete selected'] commands = [self.addItem, self.deleteItems] buttons = ButtonList(self, texts=texts, commands=commands) buttons.grid(row=1, columnspan=2, sticky=Tkinter.EW) # bind frame, not listbox, because listbox with focus has # activation which means in particular that get underlining self.bind('<Enter>', self.enterCallback) self.bind('<KeyPress>', self.keypressCallback) self.listbox = listbox self.setItems(initial_list) self.setSelectCallback(select_callback) self.setDoubleCallback(double_callback) self.size = self.listbox.size # otherwise get Frame size called
def __init__(self, parent, application, *args, **kw): project = application.project self.nmrProject = nmrProject = application.nmrProject if project: calcStore = project.findFirstNmrCalcStore(name=APP_NAME, nmrProject=nmrProject) or \ project.newNmrCalcStore(name=APP_NAME, nmrProject=nmrProject) else: calcStore = None self.application = application self.residue = None self.structure = None self.serverCredentials = None self.iCingBaseUrl = DEFAULT_URL self.resultsUrl = None self.chain = None self.serverDone = False NmrCalcRunFrame.__init__(self, parent, project, calcStore, *args, **kw) # # # # # # New Structure Frame # # # # # self.structureTable.grid_forget() self.structureButtons.grid_forget() self.ensemblePulldown.grid_forget() self.modelButtons.grid_forget() self.modelPulldown.grid_forget() frame = self.inputTabs.frames[0] frame.grid_rowconfigure(0, weight=0) frame.grid_rowconfigure(1, weight=1) label = Label(frame, text='Ensemble: ', grid=(0, 0)) self.structurePulldown = PulldownList( frame, callback=self.changeStructure, grid=(0, 1), tipText='The structure ensemble coordinates to submit') tipTexts = [ 'Conformational model number', 'Whether analyse this model' ] headingList = ['Model', 'Use'] editWidgets = [None, None] editGetCallbacks = [None, self.toggleModel] editSetCallbacks = [ None, None, ] self.modelTable = ScrolledMatrix(frame, grid=(1, 0), gridSpan=(1, 2), callback=self.selectStructModel, multiSelect=True, tipTexts=tipTexts, editWidgets=editWidgets, initialRows=2, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, headingList=headingList) tipTexts = [ 'Activate the selected models so that they will be consedered in the analysis', 'Deactivate the selected models so that they will not be considered in the analysis' ] texts = ['Activate Selected', 'Inactivate Selected'] commands = [self.activateModels, self.disableModels] buttons = ButtonList(frame, texts=texts, commands=commands, grid=(2, 0), gridSpan=(1, 2), tipTexts=tipTexts) # # # # # # Submission frame # # # # # # tab = self.tabbedFrame.frames[1] tab.expandGrid(1, 0) frame = LabelFrame(tab, text='Server Job Submission', grid=(0, 0)) frame.expandGrid(None, 2) srow = 0 label = Label(frame, text='iCing URL:', grid=(srow, 0)) self.iCingBaseUrlPulldown = PulldownList( frame, texts=URLS, objects=URLS, index=0, grid=(srow, 1), tipText='Web location of iCING server to use') srow += 1 label = Label(frame, text='Results File:', grid=(srow, 0)) self.resultFileEntry = Entry( frame, bd=1, text='', grid=(srow, 1), width=50, tipText='Name of file to store compressed CING results in') self.setZipFileName() button = Button(frame, text='Choose File', bd=1, sticky='ew', command=self.chooseZipFile, grid=(srow, 2), tipText='Select file to overwrite with CING results') srow += 1 label = Label(frame, text='Results URL:', grid=(srow, 0)) self.resultUrlEntry = Entry( frame, bd=1, text='', grid=(srow, 1), width=50, tipText='Web location where CING results will be posted') button = Button(frame, text='View Results HTML', bd=1, sticky='ew', command=self.viewHtmlResults, grid=(srow, 2), tipText='Open the HTML CING results in a web browser') srow += 1 tipTexts = [ 'Submit the CCPN project to the CING server', 'Determin whether the iCING job is complete, pending or has failed', 'Remove all trace of the last submissionfrom the iCING server', 'Download the compressed CING results, including HTML' ] texts = [ 'Submit Project!', 'Check Run Status', 'Purge Server Result', 'Download Results' ] commands = [ self.runCingServer, self.checkStatus, self.purgeCingServer, self.downloadResults ] self.buttonBar = ButtonList(frame, texts=texts, commands=commands, grid=(srow, 0), gridSpan=(1, 3), tipTexts=tipTexts) for button in self.buttonBar.buttons[:1]: button.config(bg=CING_BLUE) # # # # # # Residue frame # # # # # # frame = LabelFrame(tab, text='Residue Options', grid=(1, 0)) frame.expandGrid(1, 1) label = Label(frame, text='Chain: ') label.grid(row=0, column=0, sticky='w') self.chainPulldown = PulldownList( frame, callback=self.changeChain, tipText='Select the molecular system chain to consider') self.chainPulldown.grid(row=0, column=1, sticky='w') headingList = ['#', 'Residue', 'Linking', 'Decriptor', 'Use?'] tipTexts = [ 'Sequence number', 'Residue type code', 'In-chain connectivity of residue', 'Protonation and steriochemical state', 'Whether to consider the residue in the analysis' ] editWidgets = [None, None, None, None, None] editGetCallbacks = [None, None, None, None, self.toggleResidue] editSetCallbacks = [ None, None, None, None, None, ] self.residueMatrix = ScrolledMatrix(frame, headingList=headingList, multiSelect=True, tipTexts=tipTexts, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, callback=self.selectResidue) self.residueMatrix.grid(row=1, column=0, columnspan=2, sticky='nsew') tipTexts = [ 'Use the selected residues in the analysis', 'Do not use the selected residues in the analysis' ] texts = ['Activate Selected', 'Inactivate Selected'] commands = [self.activateResidues, self.deactivateResidues] self.resButtons = ButtonList(frame, texts=texts, commands=commands, tipTexts=tipTexts) self.resButtons.grid(row=2, column=0, columnspan=2, sticky='ew') """ # # # # # # Validate frame # # # # # # frame = LabelFrame(tab, text='Validation Options', grid=(2,0)) frame.expandGrid(None,2) srow = 0 self.selectCheckAssign = CheckButton(frame) self.selectCheckAssign.grid(row=srow, column=0,sticky='nw' ) self.selectCheckAssign.set(True) label = Label(frame, text='Assignments and shifts') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckResraint = CheckButton(frame) self.selectCheckResraint.grid(row=srow, column=0,sticky='nw' ) self.selectCheckResraint.set(True) label = Label(frame, text='Restraints') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckQueen = CheckButton(frame) self.selectCheckQueen.grid(row=srow, column=0,sticky='nw' ) self.selectCheckQueen.set(False) label = Label(frame, text='QUEEN') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckScript = CheckButton(frame) self.selectCheckScript.grid(row=srow, column=0,sticky='nw' ) self.selectCheckScript.set(False) label = Label(frame, text='User Python script\n(overriding option)') label.grid(row=srow,column=1,sticky='nw') self.validScriptEntry = Entry(frame, bd=1, text='') self.validScriptEntry.grid(row=srow,column=2,sticky='ew') scriptButton = Button(frame, bd=1, command=self.chooseValidScript, text='Browse') scriptButton.grid(row=srow,column=3,sticky='ew') """ # # # # # # # # # # self.update(calcStore) self.administerNotifiers(application.registerNotify)
def body(self, guiParent): guiParent.grid_columnconfigure(3, weight=1) self.commentsEntry = Entry(self) self.priorityEntry = IntEntry(self) row = 0 label = Label(guiParent, text='Server location:') label.grid(row=row, column=0, sticky='w') location = '' uid = '' httpDir = '' subDir = '' version = 'None' if self.server: location, uid, httpDir, subDir = self.server.identity version = self.server.version or 'None' self.serverEntry = Entry(guiParent, text=location) self.serverEntry.grid(row=row, column=1, stick='w') label = Label(guiParent, text='User ID:') label.grid(row=row, column=2, sticky='w') self.uidEntry = Entry(guiParent, text=uid) self.uidEntry.grid(row=row, column=3, stick='w') row += 1 label = Label(guiParent, text='HTTP directory:') label.grid(row=row, column=0, sticky='w') self.httpDirEntry = Entry(guiParent, text=httpDir) self.httpDirEntry.grid(row=row, column=1, stick='w') label = Label(guiParent, text='Sub-directory:') label.grid(row=row, column=2, sticky='w') self.subDirEntry = Entry(guiParent, text=subDir) self.subDirEntry.grid(row=row, column=3, stick='w') row += 1 self.localVerLabel = Label(guiParent, text='Local version: %s' % self.version) self.localVerLabel.grid(row=row, column=0, sticky='w') self.serverLabel = Label(guiParent, text='Server version: %s' % version) self.serverLabel.grid(row=row, column=2, sticky='w') row += 1 guiParent.grid_rowconfigure(row, weight=1) headingList = [ 'File', 'Location', 'Date', 'Priority', 'Comments', 'StoredAs', ] editWidgets = [ None, None, None, self.priorityEntry, self.commentsEntry ] editGetCallbacks = [ None, None, None, self.getPriority, self.getComments ] editSetCallbacks = [ None, None, None, self.setPriority, self.setComments ] self.scrolledMatrix = ScrolledMatrix(guiParent, headingList=headingList, multiSelect=True, editWidgets=editWidgets, callback=self.selectCell, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks) self.scrolledMatrix.grid(row=row, column=0, columnspan=4, sticky='nsew') row += 1 texts = [ 'Add\nFiles', 'Remove\nFiles', 'Remove\nAll', 'Query\nServer', 'Commit\nSelected', 'Synchronise\nAll', 'Commit\nNew', 'Quit' ] commands = [ self.addFile, self.removeFile, self.removeAll, self.queryFiles, self.synchroniseSelected, self.synchroniseServer, self.updateServer, self.quit ] self.buttonList = ButtonList(guiParent, texts=texts, commands=commands, expands=1) self.buttonList.grid(row=row, column=0, columnspan=4, sticky='ew') self.update()
def createLink(self, role, clazz): title_label = Label(self.parent_frame) class_label = ToggleLabel(self.parent_frame, text=role.clazz.name, callback=self.gridWidgets, isArrowClosed=True) class_label.label.config(anchor=Tkinter.W) name_label = Label(self.parent_frame, text=role.name, anchor=Tkinter.W, bg=name_bg) value_label = Label(self.parent_frame) type_label = Label(self.parent_frame, text=clazz.name, anchor=Tkinter.W) card_label = Label(self.parent_frame, text=self.getCardinality(role), anchor=Tkinter.W) note_label = Label(self.parent_frame, text=self.getNote(role), anchor=Tkinter.W) link_frame = Frame(self.parent_frame) link_frame.grid_rowconfigure(0, weight=1) link_frame.grid_columnconfigure(table_col, weight=1) # table must be created first table = ObjectTable(link_frame, clazz, initialRows=3) texts = ['Goto'] commands = [lambda: self.gotoObject(table, clazz)] if (role.hierarchy == child_hierarchy): texts.extend(['Create', 'Delete']) commands.extend([ lambda: self.createChild(clazz), lambda: self.deleteChild(table) ]) elif (not role.isDerived and (not self.editMode or (role.changeability == changeable and (role.locard != role.hicard)))): if (role.hicard == 1): texts.extend(['Set', 'Unset']) commands.extend([ lambda: self.setLink(role, clazz), lambda: self.unsetLink(role) ]) else: texts.extend(['Add', 'Remove']) commands.extend([ lambda: self.addLink(role, clazz), lambda: self.removeLink(table, role) ]) buttons = ButtonList(link_frame, texts=texts, commands=commands, direction=Tkinter.VERTICAL) self.widget_dict[(role, clazz)] = (title_label, class_label, name_label, value_label, type_label, card_label, note_label, link_frame, buttons, table) table.callback = lambda obj, row, col: self.setButtonState( table, role, clazz, buttons)
def __init__(self, parent, project, closeButton=False, *args, **kw): self.parent = parent self.project = project self.nmrProject = (project.currentNmrProject or project.newNmrProject(name='PALES')) self.calcStore = None self.run = None self.inpStructure = None self.inpConstraintList = None self.workingDir = None self.waiting = False self.palesMode = None self.resetCalcStore() Frame.__init__(self, parent, *args, **kw) self.expandGrid(0, 0) options = ['Input Data', 'Extra Input', 'View Results'] tabbedFrame = TabbedFrame(self, options=options, grid=(0, 0)) frameA, frameX, frameB = tabbedFrame.frames self.tabbedFrame = tabbedFrame label = Label(tabbedFrame.sideFrame, text='Run Number:', grid=(0, 0), sticky='e') tipText = 'Selects which calculation job or "run" is currently being viewed or edited' self.runPulldown = PulldownList(tabbedFrame.sideFrame, callback=self.changeRun, grid=(0, 1), sticky='e', tipText=tipText) tipTexts = ['Delete the current calculation run settings'] texts = ['Delete Run'] commands = [self.deleteRun] if closeButton: ButtonListClass = UtilityButtonList else: ButtonListClass = ButtonList runButtons = ButtonListClass(tabbedFrame.sideFrame, texts=texts, tipTexts=tipTexts, commands=commands, sticky='e', grid=(0, 2)) # Input data frameA.expandGrid(2, 1) row = 0 label = Label(frameA, text='Pales mode:', grid=(row, 0), sticky='w') self.palesModePulldown = PulldownList(frameA, callback=self.changePalesMode, grid=(row, 1)) tipTexts = [ 'Make a setup for a new calculation run', 'Make a new calculation run by copying the current one', ] texts = ['New Run', 'Copy Run'] commands = [self.newRun, self.copyRun] if closeButton: ButtonListClass = UtilityButtonList else: ButtonListClass = ButtonList runButtons = ButtonList(frameA, texts=texts, tipTexts=tipTexts, commands=commands, sticky='e', grid=(row, 2)) runButtons.buttons[0].config(bg='#B0FFB0') row += 1 subframe1 = LabelFrame(frameA, text='Description', grid=(row, 0), gridSpan=(1, 3)) subframe1.expandGrid(0, 1) self.modeDescription = Label(subframe1, grid=(row, 0), sticky='w') row += 1 # setup generic table headings, justification and widget getters/setters self.inputMatrix = GenericDataMatrix(frameA, progParameters) self.inputMatrix.grid(row=row, column=0, columnspan=3, sticky='nsew') row += 1 label = Label(frameA, text='Comments:', grid=(row, 0)) self.detailsEntryIn = Entry(frameA, grid=(row, 1), gridSpan=(1, 2), sticky="ew") self.detailsEntryIn.bind('<Leave>', self.changeDetailsIn) row += 1 button = Button(frameA, text='Select working dir:', bd=1, command=self.selectWorkingDir, grid=(row, 0), sticky="ew") self.workingDirEntry = Entry(frameA, text='.', grid=(row, 1), gridSpan=(1, 2), width=48, sticky="ew", bd=1) row += 1 button = Button(frameA, text='Execute Pales:', bd=1, command=self.executePales, grid=(row, 0), gridSpan=(1, 3), sticky="new") # Extra input # setup generic table headings, justification and widget getters/setters frameX.expandGrid(0, 0) self.extraInputMatrix = GenericDataMatrix(frameX, progParameters) self.extraInputMatrix.grid(row=0, column=0, sticky='nsew') # View Results frameB.expandGrid(7, 1) row = 0 subframe1 = LabelFrame(frameB, text='Command Options:', grid=(row, 0), gridSpan=(1, 4)) # gridSpan=(1,2)) subframe1.expandGrid(0, 1) self.palesOptionsLabel = Label(subframe1, grid=(row, 0), sticky='w') row += 1 div = LabelDivider(frameB, text='Data', grid=(row, 0), gridSpan=(1, 4)) row += 1 self.outputMatrix = GenericDataMatrix(frameB, progParameters, initialRows=4) self.outputMatrix.grid(row=0, column=0, sticky='nsew') self.outputMatrix.grid(row=row, column=0, columnspan=(4), sticky='nsew') row += 1 button = Button(frameB, text='View Selected', bd=1, command=self.viewPalesData, grid=(row, 0), gridSpan=(1, 4), sticky="ew") row += 1 label = Label(frameB, text='Comments:', grid=(row, 0), sticky="w") self.detailsEntry = Entry(frameB, grid=(row, 1), gridSpan=(1, 3), sticky="ew") self.detailsEntry.bind('<Leave>', self.changeDetails) row += 1 subframe2 = LabelFrame(frameB, text='Calculated Order Matrix:', grid=(row, 0), gridSpan=(1, 4)) #subframe2.grid_columnconfigure(5, weight=1) subframe2.expandGrid(1, 5) label = Label(subframe2, text='Daxial', grid=(0, 0), sticky='ew') label = Label(subframe2, text='Drhombic', grid=(0, 1), sticky='ew') label = Label(subframe2, text='Psi', grid=(0, 2), sticky='ew') label = Label(subframe2, text='Phi', grid=(0, 3), sticky='ew') label = Label(subframe2, text='Theta', grid=(0, 4), sticky='ew') self.outputTensorLabels = ll = [] for ii in range(5): label = Label(subframe2, text='<None>', grid=(1, ii), sticky='ew') ll.append(label) row += 1 div = LabelDivider(frameB, text='Program Output', grid=(row, 0), gridSpan=(1, 4), sticky='sew') #textFrame1 = LabelFrame(frameB, text='Pales Output File', grid=(5,0), # gridSpan=(1,6), sticky='nsew') #textFrame1.expandGrid(0,0) row += 1 self.palesOutputText = ScrolledText(frameB, xscroll=False) self.palesOutputText.grid(row=row, column=0, columnspan=4, sticky='nsew') self.updateAfter() self.administerNotifiers(self.parent.registerNotify)
def __init__(self, parent, project, utilityButtons=False, *args, **kw): self.project = project self.waiting = False self.dataStore = None Frame.__init__(self, parent, *args, **kw) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) tipTexts = [ 'Row number', 'Location of the absolute path directory, that may contain multiple spectrum files', 'Location of spectrum file relative to its absolute path directory', 'Identity of the spectrum as experiment:spectrum' ] headingList = [ '#', 'Absolute Path', 'Relative Path\nand File', 'Spectrum / FID / Image' ] editWidgets = [None, None, None, None] editGetCallbacks = [None, self.getDataUrl, self.getDataPath, None] editSetCallbacks = [None, None, None, None] self.dataStoreTable = ScrolledMatrix( self, headingList=headingList, tipTexts=tipTexts, callback=self.selectDataStore, editWidgets=editWidgets, multiSelect=True, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, ###deleteFunc=self.deleteDataStores, grid=(0, 0)) texts = [ 'Propagate\nAbsolute Path', 'Shift Directory\nTo Absolute Path', 'Shift Directory\nTo Relative Path' ] tipTexts = [ 'Copy absolute path from last row selected to other selected spectra', 'Shift the top directory from the relative path to the absolute path', 'Shift the bottom directory from the absolute path to the relative path' ] commands = [ self.propagatePath, self.moveDirToAbsolute, self.moveDirToRelative ] isModal = False popup = getPopup(parent) if popup: isModal = popup.modal if utilityButtons: if isModal: texts = [ 'All Done!', ] + texts tipTexts = ['Close the popup, satisfied that paths are OK' ] + tipTexts commands = [ popup.close, ] + commands self.buttonList = UtilityButtonList(self, texts=texts, commands=commands, tipTexts=tipTexts, doClone=False, grid=(1, 0)) if isModal: self.buttonList.buttons[0].config(bg='#B0FFB0') else: self.buttonList = ButtonList(self, texts=texts, commands=commands, grid=(1, 0), tipTexts=tipTexts) self.updateAfter()
def __init__(self, parent, basePopup, *args, **kw): # # Variable initialisation # self.fcWrapper = basePopup.fcWrapper self.project = basePopup.project self.basePopup = basePopup # TODO necessary? if self.project: self.nmrProject = self.project.currentNmrProject self.entry = self.project.currentNmrEntryStore.findFirstEntry() if not self.entry: self.entry = self.project.currentNmrEntryStore.newEntry( name=self.project.name) else: self.nmrProject = None self.sequenceCoordinatesLoaded = False self.shiftsLoaded = False self.linkResDone = False self.currentShiftList = None self.shiftListChainPairs = [] self.moleculeList = [] self.moleculeDict = {} # # Frame setup # Frame.__init__(self, parent, **kw) self.grid_columnconfigure(1, weight=1) self.grid_rowconfigure(1, weight=1) options = ['Import', 'Deposition'] tabbedFrame = TabbedFrame(self, options=options, callback=self.selectTab) tabbedFrame.grid(row=1, column=0, columnspan=2, sticky='nsew') self.tabbedFrame = tabbedFrame frameA, frameD = tabbedFrame.frames # # Main # frameA.grid_columnconfigure(0, weight=1) #frameA.grid_columnconfigure(1, weight=1) # Change to 2 if want 2 columns frameA.grid_rowconfigure(12, weight=1) #frameA.grid_rowconfigure(12, weight=1) row = 0 div = LabelDivider( frameA, text= 'Select the full coordinate file or a sequence file (with info for a single molecule).', justify='center', grid=(row, 0), gridSpan=(1, 1)) row += 1 self.sequenceCoordinatesImport = Button( frameA, text=self.defaultSelectText, command=self.importSequenceOrCoords, foreground=self.fontDefaultColor) self.sequenceCoordinatesImport.grid(row=row, column=0, sticky='ew') row += 1 label = Label(frameA, text="") label.grid(row=row, column=0, sticky='ew') row += 1 div = LabelDivider( frameA, text='Select the molecule relevant for your chemical shift file.', justify='center', grid=(row, 0), gridSpan=(1, 1)) row += 1 self.moleculeSelect = Label( frameA, text="None available yet - import valid file first", foreground=self.fontBadColor) self.moleculeSelect.grid(row=row, column=0, sticky='ew') self.moleculeSelectRow = row row += 1 label = Label(frameA, text="") label.grid(row=row, column=0, sticky='ew') row += 1 div = LabelDivider( frameA, text= 'Select a chemical shift file with values only for the above molecule.', justify='center', grid=(row, 0), gridSpan=(1, 1)) row += 1 self.shiftImport = Button(frameA, text=self.defaultSelectText, command=self.importShifts, foreground=self.fontDefaultColor) self.shiftImport.grid(row=row, column=0, sticky='ew') row += 1 label = Label(frameA, text="") label.grid(row=row, column=0, sticky='ew') row += 1 div = LabelDivider( frameA, text='Consistency check between molecule and shift information.', justify='center', grid=(row, 0), gridSpan=(2, 1)) row += 1 self.linkResCheckInfo = Label(frameA, text='') self.linkResCheckInfo.grid(row=row, column=0, sticky='ew') row += 1 div = Separator(frameA, grid=(row, 0), gridSpan=(1, 1)) row += 1 texts = ['Import new sequence', 'Import new set of shifts'] commands = [self.resetSequenceImport, self.resetShiftImport] self.mainButtons = ButtonList(frameA, texts=texts, commands=commands) self.mainButtons.grid(row=row, column=0, columnspan=2, sticky='ew') self.mainButtons.buttons[0].config(foreground=self.fontDefaultColor) #print row self.frameA = frameA # # Not in use... # #frameX.grid_columnconfigure(0, weight=1) #frameX.grid_columnconfigure(1, weight=1) #frameX.grid_rowconfigure(1, weight=1) #frameX.grid_rowconfigure(3, weight=1) # # Deposition, is updated after each successful import run. # frameD.grid_columnconfigure(0, weight=1) frameD.grid_rowconfigure(5, weight=1) self.frameD = frameD row = 0 div = LabelDivider(frameD, text='Imported data.', justify='center', grid=(row, 0), gridSpan=(1, 2)) row += 1 self.depositionImportText = "\nImported %d shift list(s) for a total of %d shifts.\n\nImported %d molecule(s) and %d chain(s).\n\nImported %d model(s) for a total of %d atom coordinates.\n\nLinked %.2f%% of imported NMR information to %d chain(s)." self.depositionImportLoc = (row, 0) # These used for setting text above... self.depositionImportNums = [0, 0, 0, 0, 0, 0, 0.0, 0] self.importedShiftLists = [] self.connectedChains = [] self.depositionImportLabel = Label(frameD, text=self.depositionImportText % tuple(self.depositionImportNums), foreground=self.fontBadColor) self.depositionImportLabel.grid(row=row, column=0, sticky='ew') row += 1 label = Label(frameD, text="") label.grid(row=row, column=0, sticky='ew') # # Finalize the import part, proceed to ECI. # row += 1 div = LabelDivider( frameD, text= 'Import completed, save project and start Entry Completion Interface.', justify='center', grid=(row, 0), gridSpan=(1, 1)) row += 1 self.eciStart = Button(frameD, text="Finalise import", command=self.finaliseImport, foreground=self.fontBadColor) self.eciStart.grid(row=row, column=0, sticky='ew')
def body(self, guiFrame): guiFrame.grid_columnconfigure(0, weight=1) row = 0 frame = Frame(guiFrame, grid=(row, 0), sticky='ew') frame.grid_columnconfigure(6, weight=1) label = Label(frame, text='MolSystem:', grid=(0, 0)) tipText = 'Selects which molecular system to select a structure for' self.molSystemPulldown = PulldownList(frame, callback=self.setMolSystem, grid=(0, 1), tipText=tipText) label = Label(frame, text=' Ensemble:', grid=(0, 2)) tipText = 'Selects which structure ensemble to display, for the specified molecular system' self.structurePulldown = PulldownList(frame, callback=self.setStructure, grid=(0, 3), tipText=tipText) label = Label(frame, text=' Model:', grid=(0, 4)) tipText = 'Selects which conformational model of the selected structure/ensemble to display' self.modelPulldown = PulldownList(frame, callback=self.setModel, grid=(0, 5), tipText=tipText) label = Label(frame, text='Peak List:', grid=(0, 7), sticky='e') tipText = 'When using the "Show Peak" option, sets which peak list is used to display atom connectivities' self.peakListPulldown = PulldownList(frame, callback=self.setPeakList, grid=(0, 8), sticky='e', tipText=tipText) label = Label(frame, text=' Dist Method:', grid=(0, 9), sticky='e') tipText = 'Where the distances between sets of atoms are displayed, sets whether to use the NOE equivalent (sum r^-6 intensities) or minimum distance' self.distMethodPulldown = PulldownList(frame, callback=self.setDistMethod, texts=distanceMethods.keys(), grid=(0, 10), sticky='e', tipText=tipText) row += 1 guiFrame.grid_rowconfigure(row, weight=1) analysisProject = self.analysisProject getOption = lambda key, defaultValue: getPrintOption( analysisProject, key, defaultValue) setOption = lambda key, value: setPrintOption(analysisProject, key, value) self.structFrame = ViewStructureFrame(guiFrame, project=self.project, radiiScale=0.0, bondWidth=1, atomCallback=self.selectAtom, getPrintOption=getOption, setPrintOption=setOption, grid=(row, 0)) row += 1 frame = Frame(guiFrame) frame.grid(row=row, column=0, sticky='ew') frame.grid_columnconfigure(2, weight=1) tipTexts = [ 'Remove all highlights and connections from the structure display', 'For an ensemble, calculate the per-atom coordinate root mean square deviations and adjust atom size and colours accordingly', 'Display the selected structural parameters on the structure, adjusting atom labels, size and colours accordingly' ] texts = [ 'Reset', 'RMSDs', 'Display Params:', ] commands = [ self.clearConnections, self.displayAtomRmsds, self.displayStrucParams, ] self.paramButtons = ButtonList(frame, texts=texts, commands=commands, grid=(0, 0), tipTexts=tipTexts) tipText = 'Selects which structural parameters, from those calculated, to display on the structure' self.strucParamPulldown = PulldownList(frame, grid=(0, 1), tipText=tipText) tipTexts = [ 'In the stated peak list, display peak assignment connectivities between the highlighted atoms (left click to select atoms in the display)', ] texts = ['Show Peaks'] commands = [ self.showPeaks, ] self.bottomButtons = UtilityButtonList(frame, texts=texts, commands=commands, helpUrl=self.help_url, grid=(0, 3), tipTexts=tipTexts) self.updateMolSystems() self.updatePeakLists() self.administerNotifiers(self.registerNotify) self.structFrame.displayStructure()
def body(self, guiFrame): self.geometry('700x600') guiFrame.expandGrid(0, 0) tipTexts = [ 'A table of all of the reference isotope scheme definitions available to the project', 'A list of the residue isotopomers that comprise the selected isotope labelling scheme', 'A three-dimensional representation of residues and their isotopomer labelling' ] options = ['Reference Schemes', 'Isotopomers', 'Isotopomer Structure'] tabbedFrame = TabbedFrame(guiFrame, options=options, grid=(0, 0), tipTexts=tipTexts) self.tabbedFrame = tabbedFrame frameA, frameB, frameC = tabbedFrame.frames # # Schemes # frameA.expandGrid(0, 0) tipTexts = [ 'A short textual code that identifies the reference isotope scheme in graphical displays', 'The full name for the isotope scheme', 'A detailed description of the isotope scheme including user comments', 'The name of the CCPN data repository in which the isotope scheme is saved; "refData" is in the CCPn installation' ] headingList = ['Code', 'Name', 'Description', 'Save Location'] self.schemeNameEntry = Entry(self, text='', returnCallback=self.setSchemeName, width=20) self.schemeDetailsEntry = Entry(self, text='', returnCallback=self.setSchemeDetails, width=20) editWidgets = [ None, self.schemeNameEntry, self.schemeDetailsEntry, None ] editGetCallbacks = [ None, self.getSchemeName, self.getSchemeDetails, None ] editSetCallbacks = [ None, self.setSchemeName, self.setSchemeDetails, None ] self.schemeMatrix = ScrolledMatrix(frameA, headingList=headingList, callback=self.selectScheme, editWidgets=editWidgets, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, multiSelect=False, grid=(0, 0), tipTexts=tipTexts) self.schemeMatrix.doEditMarkExtraRules = self.schemeEditRules tipTexts = [ 'Make a new reference isotope scheme definition based on a copy of the scheme currently selected', 'Delete the selected isotope scheme', 'Make a new, blank isotope scheme' ] texts = ['Copy', 'Delete', 'New'] commands = [self.copyScheme, self.removeScheme, self.makeNewScheme] self.schemeButtons = ButtonList(frameA, texts=texts, commands=commands, grid=(1, 0), tipTexts=tipTexts) # # Isotopomers # frameB.expandGrid(3, 0) row = 0 frame = Frame(frameB, grid=(row, 0)) frame.expandGrid(0, 2) tipText = 'Selects which of the available isotope schemes to view/edit' label = Label(frame, text='Reference Scheme:', grid=(0, 0)) self.schemePulldown = PulldownList(frame, callback=self.setLabellingScheme, grid=(0, 1), tipText=tipText) row += 1 div = LabelDivider(frameB, text='Isotopomers', grid=(row, 0)) row += 1 frame = Frame(frameB, grid=(row, 0)) frame.expandGrid(1, 2) self.isotopomerFrame = frame self.abundanceWidget = MultiWidget(self, FloatEntry, relief='raised', borderwidth=2, callback=self.setDefaultAbundances, useImages=False) tipText = 'Opens a panel that allows you to set the basis/default abundances for C, H & N isotopes; used as the starting point for new isotopomer definitions' self.abundanceButton = Button(frame, text='Set Default\nAbundances', borderwidth=1, command=self.enterDefaultAbundances, grid=(0, 0), tipText=tipText) tipText = 'Sets the basis/default abundances for C, H & N isotopes to their natural abundance proportions' button = Button(frame, text='Set Natural\nAbundance Default', borderwidth=1, command=self.resetDefaultAbundance, grid=(0, 1), sticky='ew', tipText=tipText) label = Label(frame, text='Molecule Type:', grid=(0, 2), sticky='e') entries = standardResidueCcpCodes.keys() entries.sort() entries.reverse() tipText = 'Selects which type of bio-polymer to define residue isotopomer labelling for' self.molTypePulldown = PulldownList(frame, callback=self.setMolType, texts=entries, grid=(0, 3), tipText=tipText) row += 1 tipTexts = [ 'The CCPN code that identifies the kind of residue the isotopomer relates to', 'The number of the particular isotopomer (isotope pattern) within its residue type', 'The fraction of the total residues, of its kind, that the isotopomer make up' ] headingList = ['Ccp Code', 'Variant', 'Weight'] self.isotopomerWeightEntry = FloatEntry( self, text='', returnCallback=self.setIsotopomerWeight, width=6) editWidgets = [None, None, self.isotopomerWeightEntry] editGetCallbacks = [None, None, self.getIsotopomerWeight] editSetCallbacks = [None, None, self.setIsotopomerWeight] self.isotopomerMatrix = ScrolledMatrix( frameB, tipTexts=tipTexts, headingList=headingList, callback=self.selectIsotopomer, editWidgets=editWidgets, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, multiSelect=True, grid=(row, 0)) self.isotopomerMatrix.doEditMarkExtraRules = self.isotopomerEditRules row += 1 frame = Frame(frameB, grid=(row, 0), sticky='ew') frame.expandGrid(0, 0) tipTexts = [ 'Delete the selected residue isotopomers from the current isotope scheme', 'Make a new residue isotopomer definition by copying the details of the last selected isotopomer', 'Add a complete set of isotopomers to the isotope scheme, one for each residue type, based on the states default isotope abundances', 'For all residue isotopomers in the scheme, set the labelling of one kind of atom (the user is prompted) to its default isotopic incorporation ', 'Add a new residue isotopomer definition that uses the default isotopic incorporation' ] texts = [ 'Delete\nSelected', 'Copy\nSelected', 'Add Default\nAbundance Set', 'Set Atom Type\nTo Default', 'Add\nNew:' ] commands = [ self.removeIsotopomers, self.duplicateResidues, self.addDefaultIsotopomers, self.setAtomTypeDefault, self.addNewIsotopomer ] self.isotopomerButtons = ButtonList(frame, texts=texts, commands=commands, grid=(0, 0), tipTexts=tipTexts) tipText = 'Selects which kind of residue isotopomer may be added to the current isotope scheme' self.ccpCodePulldown = PulldownList(frame, callback=None, grid=(0, 1), sticky='e', tipText=tipText) row += 1 div = LabelDivider(frameB, text='Atom Labels', grid=(row, 0)) row += 1 frame = Frame(frameB, grid=(row, 0)) frame.expandGrid(1, 3) label = Label(frame, text='Chemical Element:', grid=(0, 0)) tipText = 'Selects which kind of atoms to select from the selected residue isotopomer; to display isotopic incorporation in the below table' self.elementPulldown = PulldownList(frame, callback=self.changeChemElement, grid=(0, 1), tipText=tipText) self.updateChemElements() label = Label(frame, text='Water Exchangeable Atoms:', grid=(0, 2)) tipText = 'Sets whether to show atoms considered as being "water exchangeable"; their isotopic labelling will rapidly equilibrate with aqueous solvent' self.exchangeCheck = CheckButton(frame, callback=self.updateAtomLabelsAfter, grid=(0, 3), selected=False, tipText=tipText) row += 1 # Tip texts set on update headingList = [ 'Atom\nName', 'Weighting\n13C' 'Weighting\n12C', '%12C', '%13C' ] self.atomLabelTupleWeightEntry = FloatEntry( self, text='', width=6, returnCallback=self.setAtomLabelWeight) self.atomsMatrix = ScrolledMatrix(frameB, headingList=headingList, callback=self.selectAtomLabel, multiSelect=True, grid=(row, 0)) self.atomsMatrix.doEditMarkExtraRules = self.atomsEditRules row += 1 tipTexts = [ 'For the selected atom sites, in the current isotopomer, set their isotopic incorporation to the default values', 'Spread the isotopic incorporation values from the last selected atom site to all selected atoms sites' ] texts = ['Reset Selected to Default Abundance', 'Propagate Abundances'] commands = [self.setAtomLabelsDefault, self.propagateAbundances] self.atomButtons = ButtonList(frameB, texts=texts, commands=commands, grid=(row, 0), tipTexts=tipTexts) # # View Frame # frameC.expandGrid(1, 0) row = 0 frame = Frame(frameC, grid=(row, 0), sticky='ew') frame.grid_columnconfigure(3, weight=1) label = Label(frame, text='Residue Type:', grid=(0, 0)) tipText = 'Selects which kind of residue, within the current isotope scheme, to show isotopomer structures for' self.viewCcpCodePulldown = PulldownList( frame, callback=self.selectViewCcpcode, grid=(0, 1), tipText=tipText) label = Label(frame, text='Isotopomer:', grid=(0, 2)) tipText = 'Selects which kind of isotopomer (labelling pattern) to display, from the selected residue type.' self.viewIsotopomerPulldown = PulldownList( frame, callback=self.selectViewIsotopomer, grid=(0, 3), tipText=tipText) row += 1 self.viewIsotopomerFrame = ViewIsotopomerFrame(frameC, None, grid=(row, 0)) # # Main # tipTexts = [ 'Save all changes to the reference isotope scheme to disk; the saves ALL changes to the CCPN installation for all projects to use', ] texts = ['Save Schemes'] commands = [self.saveSchemes] self.bottomButtons = UtilityButtonList(tabbedFrame.sideFrame, texts=texts, commands=commands, helpUrl=self.help_url, grid=(0, 0), sticky='e', tipTexts=tipTexts) self.updateChemElements() self.updateCcpCodes() self.updateSchemes() self.administerNotifiers(self.registerNotify)
def body(self, guiFrame): self.geometry('600x350') project = self.project analysisProject = self.analysisProject guiFrame.grid_columnconfigure(1, weight=1) row = 0 label = Label(guiFrame, text=' Window:', grid=(0,0)) self.windowPulldown = PulldownList(guiFrame, grid=(0,1), tipText='The window that will be printed out', callback=self.selectWindow) texts = [ 'Save Print File' ] tipTexts = [ 'Save the printout to the specified file' ] commands = [ self.saveFile ] buttons = UtilityButtonList(guiFrame, helpUrl=self.help_url, grid=(row,2), commands=commands, texts=texts, tipTexts=tipTexts) self.buttons = buttons buttons.buttons[0].config(bg='#B0FFB0') row += 1 guiFrame.grid_rowconfigure(row, weight=1) options = ['Options', 'Spectra', 'Peak Lists', 'Region'] tipTexts = ['Optional settings for spectra', 'Optional settings for peak lists', 'Optional settings for the region'] tabbedFrame = TabbedFrame(guiFrame, options=options, tipTexts=tipTexts) tabbedFrame.grid(row=row, column=0, columnspan=3, sticky='nsew') self.tabbedFrame = tabbedFrame optionFrame, spectrumFrame, peakListFrame, regionFrame = tabbedFrame.frames optionFrame.expandGrid(0, 0) getOption = lambda key, defaultValue: PrintBasic.getPrintOption(analysisProject, key, defaultValue) setOption = lambda key, value: PrintBasic.setPrintOption(analysisProject, key, value) self.printFrame = PrintFrame(optionFrame, getOption=getOption, grid=(0,0), gridSpan=(1,1), setOption=setOption, haveTicks=True, doOutlineBox=False) spectrumFrame.expandGrid(0, 0) frame = Frame(spectrumFrame, grid=(0,0), gridSpan=(1,1)) frame.expandGrid(1,0) self.overrideSpectrum = CheckButton(frame, text='Use below settings when printing', tipText='Use below settings when printing instead of the window values', grid=(0,0), sticky='w') tipText = 'Change the settings of the selected spectra back to their window values' button = Button(frame, text='Reset Selected', tipText=tipText, command=self.resetSelected, grid=(0,1), sticky='e') headings = ['Spectrum', 'Pos. Contours\nDrawn', 'Neg. Contours\nDrawn'] tipTexts = ['Spectrum in window', 'Whether the positive contours should be drawn', 'Whether the negative contours should be drawn'] editWidgets = [ None, None, None] editGetCallbacks = [ None, self.togglePos, self.toggleNeg] editSetCallbacks = [ None, None, None] self.spectrumTable = ScrolledMatrix(frame, headingList=headings, tipTexts=tipTexts, multiSelect=True, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, grid=(1,0), gridSpan=(1,2)) peakListFrame.expandGrid(0, 0) frame = Frame(peakListFrame, grid=(0,0), gridSpan=(1,3)) frame.expandGrid(1,0) self.overridePeakList = CheckButton(frame, text='Use below settings when printing', tipText='Use below settings when printing instead of the window values', grid=(0,0)) tipText = 'Change the settings of the selected peak lists back to their window values' button = Button(frame, text='Reset Selected', tipText=tipText, command=self.resetSelected, grid=(0,1), sticky='e') headings = [ 'Peak List', 'Symbols Drawn', 'Peak Font'] self.fontMenu = FontList(self, mode='Print', extraTexts=[no_peak_text]) editWidgets = [ None, None, self.fontMenu] editGetCallbacks = [ None, self.togglePeaks, self.getPeakFont ] editSetCallbacks = [ None, None, self.setPeakFont ] self.peakListTable = ScrolledMatrix(frame, headingList=headings, multiSelect=True, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, grid=(1,0), gridSpan=(1,2)) regionFrame.expandGrid(0, 0) frame = Frame(regionFrame, grid=(0,0), gridSpan=(1,3)) frame.expandGrid(3,0) tipText = 'Use the specified override region when printing rather than the window values' self.overrideButton = CheckButton(frame, text='Use override region when printing', tipText=tipText, callback=self.toggledOverride, grid=(0,0)) tipTexts = ('Use min and max to specify override region', 'Use center and width to specify override region') self.use_entry = USE_ENTRIES[0] self.useButtons = RadioButtons(frame, entries=USE_ENTRIES, tipTexts=tipTexts, select_callback=self.changedUseEntry, grid=(1,0)) texts = ('Set Region from Window', 'Set Center from Window', 'Set Width from Window') tipTexts = ('Set the override region to be the current window region', 'Set the center of the override region to be the center of the current window region', 'Set the width of the override region to be the width of the current window region') commands = (self.setRegionFromWindow, self.setCenterFromWindow, self.setWidthFromWindow) self.setRegionButton = ButtonList(frame, texts=texts, tipTexts=tipTexts, commands=commands, grid=(2,0)) self.minRegionWidget = FloatEntry(self, returnCallback=self.setMinRegion, width=10) self.maxRegionWidget = FloatEntry(self, returnCallback=self.setMaxRegion, width=10) headings = MIN_MAX_HEADINGS editWidgets = [ None, None, self.minRegionWidget, self.maxRegionWidget ] editGetCallbacks = [ None, None, self.getMinRegion, self.getMaxRegion ] editSetCallbacks = [ None, None, self.setMinRegion, self.setMaxRegion ] self.regionTable = RegionScrolledMatrix(frame, headingList=headings, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, grid=(3,0)) self.updateWindows() self.updateAfter() self.administerNotifiers(self.registerNotify)
def body(self, guiFrame): self.geometry('600x600') guiFrame.expandGrid(0, 0) tipTexts = [ 'A table of all the NMR measurement lists in the project, including shift lists, T1 lists, J-coupling lists etc.', 'A table listing all of the individual measurements within an NMR measurement list' ] options = ['Measurement Lists', 'Measurements Table'] tabbedFrame = TabbedFrame(guiFrame, options=options, grid=(0, 0), tipTexts=tipTexts) self.tabbedFrame = tabbedFrame frameA, frameB = tabbedFrame.frames # Measurement Lists frameA.expandGrid(1, 0) self.detailsEntry = Entry(self, text='', returnCallback=self.setDetails, width=12) self.nameEntry = Entry(self, text='', returnCallback=self.setName, width=12) row = 0 frame0 = Frame(frameA, grid=(row, 0), gridSpan=(1, 2)) frame0.grid_columnconfigure(2, weight=1) label = Label(frame0, text='Experiment:', grid=(0, 0), sticky='e') tipText = 'Selects an experiment, if required, to restrict the measurement list table display; showing only lists which were derived using the experiment' self.experimentPulldown = PulldownList(frame0, callback=self.setExperiment, grid=(0, 1), tipText=tipText) row += 1 tipTexts = [ 'The serial number of measurement list', 'The type of measurement list, e.g. shift list, T1 list, J coupling list', 'A short identifying name for the list, for graphical displays', 'The number of measurements contained within the list', 'The unit of measurement used for the values in the list', 'The names of the experiments which were used to derive the measurements', 'A user-specified textual comment for the measurement list' ] justifyList = [ 'center', 'center', 'center', 'center', 'center', 'left' ] #colHeadings = ['List Type','Name','Size','Unit','Experiments','Other Info','Details'] colHeadings = [ '#', 'List Type', 'Name', 'Size', 'Unit', 'Experiments', 'Details' ] editWidgets = [ None, None, self.nameEntry, None, None, None, None, self.detailsEntry ] editGetCallbacks = [ None, None, self.getName, None, None, None, None, self.getDetails ] editSetCallbacks = [ None, None, self.setName, None, None, None, None, self.setDetails ] self.listsMatrix = ScrolledMatrix( frameA, grid=(row, 0), gridSpan=(1, 2), justifyList=justifyList, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, headingList=colHeadings, callback=self.selectListCell, deleteFunc=self.deleteMeasurementList, tipTexts=tipTexts) row += 1 tipTexts = [ 'Show a table of the individual measurements within the selected measurement list', 'Make a new, blank chemical shift list within the project', 'Make a synthetic chemical shift list using random coil values, adjusting protein backbone values for sequence where approprate', 'Delete the selected measurement list' ] texts = [ 'Show Measurements', 'New Shift List', 'Make Random Coil Shift List', 'Delete' ] commands = [ self.showMeasurements, self.addShiftList, self.makeRandomCoilShiftList, self.deleteMeasurementList ] self.listButtons = ButtonList(frameA, texts=texts, commands=commands, grid=(row, 0), gridSpan=(1, 2), tipTexts=tipTexts) # Measurements self.measurementDetailsEntry = Entry( self, text='', returnCallback=self.setMeasurementDetails, width=12) self.measurementMeritEntry = FloatEntry( self, returnCallback=self.setMeasurementMerit, width=6) row = 0 frame0 = Frame(frameB, grid=(row, 0)) frame0.grid_columnconfigure(2, weight=1) label = Label(frame0, text='Measurement List:', grid=(0, 0), sticky='e') tipText = 'Selects the measurement list to display measurements for' self.listPulldown = PulldownList(frame0, callback=self.setMeasurementList, grid=(0, 1), tipText=tipText) row += 1 frameB.expandGrid(row, 0) tipTexts = [ 'The serial number of the measurement within its containing list', 'The number or assignment of the NMR resonance(s) to which the measurement applies', 'The numeric value of the NMR measurement on the specified resonance(s), and the unit of measurement', 'The standard deviation error in the measured value', 'The molecular chain, if any, to which the measurement relates by virtue of atom assigned resonances', 'The isotope type(s) of the measures resonance(s)', 'A figure-of-merit value for the measurement indicating its quality or reliability', 'The number of peaks in the CCPN project used to take the measurement', 'A user-defined textual comment for the measurement' ] justifyList = [ 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'center', 'left' ] colHeadings = [ '#', 'Resonance', 'Value', 'SD', 'Chain', 'Isotope', 'Fig of\nMerit', 'Peaks', 'Details' ] editWidgets = [ None, None, None, None, None, None, self.measurementMeritEntry, None, self.measurementDetailsEntry ] editGetCallbacks = [ None, None, None, None, None, None, self.getMeasurementMerit, self.showPeaks, self.getMeasurementDetails ] editSetCallbacks = [ None, None, None, None, None, None, self.setMeasurementMerit, None, self.setMeasurementDetails ] self.measurementsMatrix = ScrolledMatrix( frameB, grid=(row, 0), multiSelect=True, tipTexts=tipTexts, justifyList=justifyList, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, headingList=colHeadings, callback=self.selectMeasurementCell) row += 1 tipTexts = [ 'Show a table containing peaks that were used to derive the selected measurements', 'For some measurement lists (currently only shift lists) manually trigger a recalculation of values', 'Show a table containing the resonances that relate to the selected measurements', 'Delete the selected measurement records; cannot be done for chemical shift values still ties to peaks via assignment' ] texts = ['Show Peaks', 'Recalculate', 'Show Resonances', 'Delete'] commands = [ self.showPeaks, self.recalculateMeasurements, self.showResonances, self.deleteMeasurements ] self.measurementButtons = ButtonList(frameB, texts=texts, grid=(row, 0), commands=commands, tipTexts=tipTexts) # Main Frame self.bottomButtons = UtilityButtonList(tabbedFrame.sideFrame, helpUrl=self.help_url, grid=(0, 0), gridSpan=(1, 2), sticky='e') self.updateMeasurementListAfter() self.updateMeasurementsAfter() self.administerNotifiers(self.registerNotify)
def createDismissHelpButtonList(parent, texts = None, commands = None, direction=Tkinter.HORIZONTAL, dismiss_text = '', help_text = '', help_msg = '', help_url = '', buttonBorderwidth=True, expands=True, dismiss_cmd = None, webBrowser = None, tipTexts = None, *args, **kw): if texts is None: texts = [] if commands is None: commands = [] if not dismiss_text: dismiss_text = '' if not help_text: help_text = '' if not tipTexts: tipTexts = len(texts) * [None] texts = list(texts) + [dismiss_text, help_text] tipTexts = list(tipTexts) + [dismiss_text, help_text] popup = getPopup(parent) if not webBrowser: webBrowser = WebBrowser(popup.top, popup=popup) if (not dismiss_cmd): dismiss_cmd = popup.close if (help_url): help_cmd = lambda url=help_url: webBrowser.open(url) else: help_cmd = lambda top=popup.top, message=help_msg: memops.gui.HelpPopup.showHelpText(top, message, popup=popup) if type(commands) is types.DictType: commands = commands.copy() commands[dismiss_text] = dismiss_cmd commands[help_text] = help_cmd else: commands = list(commands) + [dismiss_cmd, help_cmd] button_list = ButtonList(parent, texts=texts, tipTexts=tipTexts, commands=commands, buttonBorderwidth=buttonBorderwidth, expands=expands, direction=direction, *args, **kw) if not dismiss_text: button_list.cancelIcon = Tkinter.PhotoImage(file=os.path.join(gfxDir,'cancel.gif')) button_list.buttons[-2].config(image=button_list.cancelIcon, activebackground=button_list.cget('bg')) if not help_text: button_list.helpIcon = Tkinter.PhotoImage(file=os.path.join(gfxDir,'help.gif')) button_list.buttons[-1].config(image=button_list.helpIcon, activebackground=button_list.cget('bg')) return button_list
def __init__(self, parent, project, path = None, molTypeEntries = None, chemCompEntries = None, selectedChemComps = None, selectLinking = None, *args, **kw): Frame.__init__(self, parent, *args, **kw) self.project = project self.molTypeEntries = molTypeEntries self.chemCompEntries = chemCompEntries self.selectLinking = selectLinking if (not path): path = getDataPath() self.path = path self.chemCompInfoDict = {} self.chemCompInfoList = [] self.chemCompDownload = False self.chem_comps_shown = {} for entry in chemCompList: self.chemCompClasses[entry] = getattr(ccp.api.molecule.ChemComp, entry) self.grid_columnconfigure(0, weight=1) row = 0 if (molTypeEntries is None): headerText = "Show residues (select molecular type(s)):" else: headerText = "Show %s residues:" % (str(molTypeEntries)) # # # TODO TODO: HERE need to do some niftier stuff for displaying! # # headerTextWidget = Label(self, text = headerText) headerTextWidget.grid(row=row, column=0, sticky=Tkinter.W) row = row + 1 if (molTypeEntries is None): self.mol_type_buttons = CheckButtons(self, entries=molTypeList, select_callback=self.updateTables) self.mol_type_buttons.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 else: self.mol_type_buttons = None # # The chemComps to display... # self.showLocalText = 'Show local' self.showWebText = 'Show available via web' self.display_buttons = CheckButtons(self, entries=[self.showLocalText,self.showWebText], select_callback=self.updateTables, selected = [True,False]) self.display_buttons.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 self.grid_rowconfigure(row, weight=2) headings = ('number', 'show details', 'molType', 'ccpCode', 'code1Letter', 'cifCode', 'name') editWidgets = 7 * [ None ] editGetCallbacks = [ None, self.toggleShow, None, None, None, None, None ] editSetCallbacks = 7 * [ None ] self.chem_comp_table = ScrolledMatrix(self, headingList=headings, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks) self.chem_comp_table.grid(row=row, column=0, sticky=Tkinter.NSEW) row = row + 1 texts = [ 'Show all in details window', 'Clear details window' ] commands = [ self.showAll, self.showNone ] buttons = ButtonList(self, texts=texts, commands=commands) buttons.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 separator = Separator(self,height = 3) separator.setColor('black', bgColor = 'black') separator.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 headerTextWidget = Label(self, text = "Select the residue variant:") headerTextWidget.grid(row=row, column=0, sticky=Tkinter.W) row = row + 1 if (chemCompEntries is None): self.chem_comp_buttons = CheckButtons(self, entries=chemCompList, selected=('ChemComp',), select_callback=self.updateChemCompVarTable) self.chem_comp_buttons.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 else: self.chem_comp_buttons = None self.grid_rowconfigure(row, weight=1) headings = ('number', 'molType', 'ccpCode', 'linking', 'descriptor', 'molecularMass', 'formula', 'nonStereoSmiles', 'stereoSmiles') self.chem_comp_var_table = ScrolledMatrix(self, headingList=headings) self.chem_comp_var_table.grid(row=row, column=0, sticky=Tkinter.NSEW) self.chem_comp_var_headings = headings[1:] if selectedChemComps: for chemComp in selectedChemComps: key = (chemComp.molType, chemComp.ccpCode) self.chem_comps_shown[key] = 1 self.updateTables()
def __init__(self, parent, dangleGui, project=None, *args, **kw): self.guiParent = parent self.dangleGui = dangleGui self.dangleDir = None self.dangleChain = None self.dangleResidue = None #self.outDir = OUTDIR self.row = None self.col = None self.project = project self.nmrProject = None self.colorScheme = 'red' self.chain = None self.shiftList = None self.dangleStore = False # Not None self.constraintSet = None self.ensemble = None Frame.__init__(self, parent=parent) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(1, weight=1) row = 0 # TOP LEFT FRAME frame = LabelFrame(self, text='Options') frame.grid(row=row, column=0, sticky='nsew') frame.columnconfigure(5, weight=1) label = Label(frame, text='Chain') label.grid(row=0, column=0, sticky='w') self.chainPulldown = PulldownList( frame, callback=self.changeChain, tipText='Choose the molecular system chain to make predictions for' ) self.chainPulldown.grid(row=0, column=1, sticky='w') label = Label(frame, text='Shift List') label.grid(row=0, column=2, sticky='w') self.shiftListPulldown = PulldownList( frame, callback=self.changeShiftList, tipText='Select the shift list to take input chemical shifts from') self.shiftListPulldown.grid(row=0, column=3, sticky='w') label = Label(frame, text='Max No. of Islands:') label.grid(row=0, column=4, sticky='w') sizes = range(10) texts = [str(s) for s in sizes] + [ 'Do not reject', ] self.rejectPulldown = PulldownList( frame, texts=texts, objects=sizes + [ None, ], tipText= 'Select the maximum allowed number of disontinuous prediction islands' ) self.rejectPulldown.set(DEFAULT_MAX_ISLANDS) # Actual value not index self.rejectPulldown.grid(row=0, column=5, sticky='w') label = Label(frame, text='Dangle Run:') label.grid(row=1, column=0, sticky='w') self.dangleStorePulldown = PulldownList( frame, callback=self.changeDangleStore, tipText='Select a run number to store DANGLE results within') self.dangleStorePulldown.grid(row=1, column=1, sticky='w') label = Label(frame, text='Ensemble:') label.grid(row=1, column=2, sticky='w') self.ensemblePulldown = PulldownList( frame, callback=self.changeEnsemble, tipText= 'Select the structure ensemble for superimposition of angle values on the GLE plots' ) self.ensemblePulldown.grid(row=1, column=3, sticky='w') label = Label(frame, text='Restraint Set:') label.grid(row=1, column=4, sticky='w') self.constrSetPulldown = PulldownList( frame, callback=self.changeConstraintSet, tipText= 'Select the CCPN restraint set to store DANGLE dihedral angle restraints in' ) self.constrSetPulldown.grid(row=1, column=5, sticky='w') # TOP RIGHT FRAME outerFrame = Frame(self) outerFrame.grid(row=row, column=1, rowspan=2, sticky='nsew') outerFrame.rowconfigure(0, weight=1) outerFrame.columnconfigure(0, weight=1) frame = LabelFrame(outerFrame, text='Global Likelihood Estimates') frame.grid(row=0, column=0, sticky='nsew') frame.rowconfigure(1, weight=1) frame.columnconfigure(2, weight=1) self.prevPlot = ViewRamachandranFrame(frame, relief='sunken', defaultPlot=False, width=180, height=180, bgColor=self.cget('bg'), nullColor='#000000', titleText='Previous', xTicks=False, yTicks=False, xLabel='', yLabel='', showCoords=False) self.prevPlot.grid(row=0, column=0, sticky='nsew') self.prevPlot.getPlotColor = self.getPlotColor self.nextPlot = ViewRamachandranFrame(frame, relief='sunken', defaultPlot=False, width=180, height=180, bgColor=self.cget('bg'), nullColor='#000000', titleText='Next', xTicks=False, yTicks=False, xLabel='', yLabel='', showCoords=False) self.nextPlot.grid(row=0, column=1, sticky='nsew') self.nextPlot.getPlotColor = self.getPlotColor self.plot = ViewRamachandranFrame(frame, relief='sunken', defaultPlot=False, width=360, height=360, bgColor=self.cget('bg'), nullColor='#000000') self.plot.grid(row=1, column=0, columnspan=2, sticky='nsew') self.plot.selectColor = '#FFB0B0' self.plot.getPlotColor = self.getPlotColor # BOTTOM RIGHT FRAME frame = Frame(outerFrame) frame.grid(row=1, column=0, sticky='nsew') frame.rowconfigure(0, weight=1) frame.columnconfigure(0, weight=1) texts = ('Previous', ' Next ') commands = (self.showPrevious, self.showNext) tipTexts = [ 'Show GLE plot of angle predictions for previous residue in chain', 'Show GLE plot of angle predictions for next residue in chain' ] buttonList = ButtonList(frame, texts, commands, tipTexts=tipTexts) buttonList.grid(row=0, column=0, sticky='nsew') row += 1 # BOTTOM LEFT FRAME frame = LabelFrame(self, text='Dihedral Angle Predictions') frame.grid(row=row, column=0, sticky='nsew') frame.grid_columnconfigure(0, weight=1) frame.grid_rowconfigure(0, weight=1) self.floatEntry = FloatEntry(self, text='', returnCallback=self.setFloatEntry, width=10, formatPlaces=9) tipTexts = [ 'Residue number in chain', 'Residue type code', 'Number of high scoring discontinuous angle predictions', 'Predicted secondary structure code', 'Predicted phi dihedral angle (CO-N-CA-CO)', 'Predicted psi dihedral angle (N-CA-CO-N)', 'Upper bound of phi angle prediction', 'Lower bound of phi angle prediction', 'Upper bound of psi angle prediction', 'Lower bound of phi angle prediction', 'Chemical shifts used in prediction' ] headingList = [ 'Res\nNum', 'Res\nType', 'No. of\nIslands', 'SS', 'Phi', 'Psi', 'Phi\nUpper', 'Phi\nLower', 'Psi\nUpper', 'Psi\nLower', 'Chemical Shifts' ] editWidgets = [ None, None, None, None, self.floatEntry, self.floatEntry, self.floatEntry, self.floatEntry, self.floatEntry, self.floatEntry ] editGetCallbacks = [ None, None, None, None, self.getFloatEntry, self.getFloatEntry, self.getFloatEntry, self.getFloatEntry, self.getFloatEntry, self.getFloatEntry ] editSetCallbacks = [ None, None, None, None, self.setFloatEntry, self.setFloatEntry, self.setFloatEntry, self.setFloatEntry, self.setFloatEntry, self.setFloatEntry ] self.predictionMatrix = ScrolledMatrix( frame, headingList=headingList, multiSelect=True, callback=self.selectCell, tipTexts=tipTexts, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks) # doubleCallback=self.loadGLEs) self.predictionMatrix.grid(row=0, column=0, sticky='nsew') row += 1 tipTexts = [ 'Remove the predictions for the selected residues', 'Run the DANGLE method to predict dihedral angles and secondary structure', 'Delete the DANGLE results stored under the current run number', 'Store the angle predictions and bounds in a new CCPN dihedral angle restraint list', 'Store the secondary structure predictions in the CCPN project' ] texts = [ 'Clear\nSelected', 'Run Prediction!', 'Delete\nCurrent Run', 'Commit\nRestraints', 'Commit\nSecondary Structure' ] commands = [ self.clearSelected, self.runDangle, self.deleteRun, self.storeDihedralConstraints, self.storeSecondaryStructure ] self.buttonList = createDismissHelpButtonList( self, texts=texts, commands=commands, # dismiss_text='Quit', dismiss_cmd=self.dangleGui.quit, help_url=self.dangleGui.help_url, expands=True, tipTexts=tipTexts) self.buttonList.grid(row=row, column=0, columnspan=2, sticky='ew') self.buttonList.buttons[1].config(bg='#C0FFFF') self.updateProject(project) self.notify(dangleGui.registerNotify)
def __init__(self, parent, objects=None, attributes=None, attributeHeadings=None, attributeLabel='Attribute', widgetClasses=None, constructorArg=None, constructorKw=None, tableHeading='Dimension', tableHeadingOffset=1, callback=None, attributeDirection=Tkinter.VERTICAL, includeResetUpdate=True, help_msg='', help_url='', *args, **kw): if (objects is None): objects = [] if (attributes is None): attributes = [] if (attributeHeadings is None): attributeHeadings = {} if (widgetClasses is None): widgetClasses = {} if (constructorArg is None): constructorArg = {} if (constructorKw is None): constructorKw = {} apply(Frame.__init__, (self, parent) + args, kw) self.ndim = len(objects) self.objects = objects self.attributes = attributes self.callback = callback topFrame = Frame(self) topFrame.grid(row=0, column=0, sticky=Tkinter.NSEW) bottomFrame = Frame(self) bottomFrame.grid(row=1, column=0, sticky=Tkinter.NSEW) if (attributeLabel): label = Label(topFrame, text=attributeLabel, relief=Tkinter.GROOVE) label.grid(row=0, column=0, sticky=Tkinter.EW) n = 0 for i in range(self.ndim): text = tableHeading + ' ' + str(i + tableHeadingOffset) label = Label(topFrame, text=text, relief=Tkinter.GROOVE) if (attributeDirection == Tkinter.VERTICAL): r = n c = i + 1 else: r = i + 1 c = n label.grid(row=r, column=c, sticky=Tkinter.EW) self.widgets = {} for attr in self.attributes: n = n + 1 text = attributeHeadings.get(attr, attr) label = Label(topFrame, text=text, relief=Tkinter.GROOVE) if (attributeDirection == Tkinter.VERTICAL): r = n c = 0 else: r = 0 c = n label.grid(row=r, column=c, sticky=Tkinter.EW) self.widgets[attr] = self.ndim * [0] for i in range(self.ndim): arg = constructorArg.get(attr, ()) kw = constructorKw.get(attr, {}) self.widgets[attr][i] = widgetClasses[attr](topFrame, *arg, **kw) if (attributeDirection == Tkinter.VERTICAL): r = n c = i + 1 else: r = i + 1 c = n self.widgets[attr][i].grid(row=r, column=c, sticky=Tkinter.EW) texts = [] commands = [] if (includeResetUpdate): texts.extend(['Reset', 'Update']) commands.extend([self.reset, self.update]) if (help_url or help_msg): import memops.gui.HelpPopup if (help_url): help_cmd = lambda top=self.parent.top, url=help_url: memops.gui.HelpPopup.showHelpUrl( top, url) else: help_cmd = lambda top=self.parent.top, message=help_msg: memops.gui.HelpPopup.showHelpText( top, message) texts.append('Help') commands.append(help_cmd) if (texts): buttons = ButtonList(bottomFrame, texts=texts, commands=commands) buttons.grid(row=0, column=0, sticky=Tkinter.EW) self.reset()
def body(self, guiFrame): self.geometry('550x600') guiFrame.grid_columnconfigure(0, weight=1) row = 0 frame = Frame(guiFrame, grid=(row, 0)) frame.expandGrid(0, 4) label = Label(frame, text='Peak List:', grid=(0, 0)) tipText = 'For spectra with (mostly) one peak per residue, selects which peak list to initialise; by adding anonymous resonance and spin system numbers' self.peakListPulldown = PulldownList(frame, self.changePeakList, grid=(0, 1), tipText=tipText) label = Label(frame, text='15N tolerance (ppm):', grid=(0, 2)) tipText = 'The upper limit in the difference between 15N ppm positions for two peaks to be considered as a potential amide' self.tolEntry = FloatEntry(frame, text=0.02, width=8, grid=(0, 3), sticky='ew', tipText=tipText) frame2 = Frame(frame, grid=(1, 0), gridSpan=(1, 4), sticky='ew') frame2.grid_columnconfigure(5, weight=1) label = Label(frame2, text='Follow Amides:', grid=(0, 0)) tipText = 'Sets whether to follow the H-N locations of potential amide peaks when clicking in rows of the table' self.followSelect = CheckButton(frame2, callback=None, grid=(0, 1), selected=True, tipText=tipText) self.windowLabel = Label(frame2, text='Window:', grid=(0, 2)) tipText = 'Selects the spectrum window in which to show positions of potential amide peaks' self.windowPulldown = PulldownList(frame2, self.selectWindowPane, grid=(0, 3), tipText=tipText) label = Label(frame2, text='Mark Amides:', grid=(0, 4)) tipText = 'Whether to put a multi-dimensional cross mark though the H-N positions of the selected peak pair' self.markSelect = CheckButton(frame2, callback=None, grid=(0, 5), selected=True, tipText=tipText) utilButtons = UtilityButtonList(guiFrame, grid=(row, 1), sticky='ne', helpUrl=self.help_url) row += 1 tipTexts = [ 'For the stated peak list, considering confirmed amide side chain peaks, add spin system and resonance numbers to all peaks', ] commands = [ self.initialisePeakList, ] texts = [ 'Initialise Peak List!', ] self.initButtons = ButtonList(guiFrame, commands=commands, grid=(row, 0), texts=texts, gridSpan=(1, 2), tipTexts=tipTexts) self.initButtons.buttons[0].config(bg='#B0FFB0') row += 1 div = LabelDivider(guiFrame, text='Amide Side Chain Peaks', gridSpan=(1, 2), grid=(row, 0)) row += 1 guiFrame.grid_rowconfigure(row, weight=1) frame = Frame(guiFrame, gridSpan=(1, 2), grid=(row, 0)) frame.expandGrid(0, 0) editSetCallbacks = [None] * 8 editGetCallbacks = [None] * 8 editWidgets = [None] * 8 editGetCallbacks[1] = self.toggleConfirm #self.userCodeEntry = Entry(self,text='', returnCallback=self.setResidueCode, width=6) tipTexts = [ 'Number of the peak pair for the table', 'Whether the peak pair is confirmed as being from an amide side chain; a common nitrogen by different hydrogens', 'The difference in 15N ppm position between the two peaks of the pair', 'The assignment annotation of the first peak in the pair', 'The assignment annotation of the second peak in the pair', 'The average 15N position of the peaks in the pair', 'The 1H chemical shift of the first peak in the pair', 'The 1H chemical shift of the second peak in the pair' ] headingList = [ '#', 'Confirmed?', u'15N\n\u0394ppm', 'Peak 1', 'Peak 2', 'Shift N', 'Shift H1', 'Shift H2' ] self.amidePairMatrix = ScrolledMatrix( frame, headingList=headingList, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, callback=self.selectAmidePair, multiSelect=True, grid=(0, 0), tipTexts=tipTexts) tipTexts = [ 'Confirm the selected peak pairs as being amide side chain peaks; a common nitrogen by different hydrogens', 'remove any conformation for the selected peak pairs being amide side chain peaks', 'Manually force an update the table of potential pairs of amide side chain peaks' ] commands = [ self.confirmAmidePairs, self.unconfirmAmidePairs, self.predictAmidePairs ] texts = ['Confirm\nSelected', 'Unconfirm\nSelected', 'Update\nTable'] self.amideButtons = ButtonList(frame, texts=texts, commands=commands, grid=(1, 0), tipTexts=tipTexts) self.updatePeakLists() self.administerNotifiers(self.registerNotify)
def body(self, mainFrame): mainFrame.grid_columnconfigure(1, weight=1, minsize=100) mainFrame.config(borderwidth=5, relief='solid') row = 0 label = Label(mainFrame, text="Frame (with sub-widgets):") label.grid(row=row, column=0, sticky=Tkinter.E) frame = Frame(mainFrame, relief='raised', border=2, background='#8080D0') # Frame expands East-West frame.grid(row=row, column=1, sticky=Tkinter.EW) # Last column expands => Widgets pusted to the West frame.grid_columnconfigure(3, weight=1) # Label is within the sub frame label = Label(frame, text='label ') label.grid(row=0, column=0, sticky=Tkinter.W) entry = Entry(frame, text='Entry', returnCallback=self.showWarning, tipText='Hint to user') entry.grid(row=0, column=1, sticky=Tkinter.W) self.check = CheckButton(frame, text='Checkbutton', selected=True, callback=self.updateObjects, tipText='Hint to user') self.check.grid(row=0, column=2, sticky=Tkinter.W) # stick a button to the East wall button = Button(frame, text='Button', command=self.pressButton, tipText='Hint to user') button.grid(row=0, column=3, sticky=Tkinter.E) row += 1 label = Label(mainFrame, text="Text:") label.grid(row=row, column=0, sticky=Tkinter.E) self.textWindow = Text(mainFrame, text='Initial Text\n', width=60, height=5) self.textWindow.grid(row=row, column=1, sticky=Tkinter.NSEW) row += 1 label = Label(mainFrame, text="CheckButtons:") label.grid(row=row, column=0, sticky=Tkinter.E) entries = ['Alpha','Beta','Gamma','Delta'] selected = (False, False, True, True) self.checkButtons = CheckButtons(mainFrame, entries, selected=selected, select_callback=self.changedCheckButtons) self.checkButtons.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="PartitionedSelector:") label.grid(row=row, column=0, sticky=Tkinter.E) labels = ['Bool','Int','Float','String'] objects = [type(0),type(1),type(1.0),type('a')] selected = [type('a')] self.partitionedSelector= PartitionedSelector(mainFrame, labels=labels, objects=objects, colors = ['red','yellow','green','#000080'], callback=self.toggleSelector,selected=selected) self.partitionedSelector.grid(row=row, column=1, sticky=Tkinter.EW) row += 1 label = Label(mainFrame, text="PulldownMenu") label.grid(row=row, column=0, sticky=Tkinter.E) entries = ['Frodo','Pipin','Merry','Sam','Bill','Gandalf','Strider','Gimli','Legolas'] self.pulldownMenu = PulldownMenu(mainFrame, callback=self.selectPulldown, entries=entries, selected_index=2, do_initial_callback=False, tipText='Hint to user') self.pulldownMenu.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="RadioButtons in a\nScrolledFrame.frame:") label.grid(row=row, column=0, sticky=Tkinter.EW) frame = ScrolledFrame(mainFrame, yscroll = False, doExtraConfig = True, width=100) frame.grid(row=row, column=1, sticky=Tkinter.EW) frame.grid_columnconfigure(0, weight=1) self.radioButtons = RadioButtons(frame.frame, entries=entries, select_callback=self.checkRadioButtons, selected_index=1, relief='groove') self.radioButtons.grid(row=0, column=0, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="LabelFrame with\nToggleLabels inside:") label.grid(row=row, column=0, sticky=Tkinter.E) labelFrame = LabelFrame(mainFrame, text='Frame Title') labelFrame.grid(row=row, column=1, sticky=Tkinter.NSEW) labelFrame.grid_rowconfigure(0, weight=1) labelFrame.grid_columnconfigure(3, weight=1) self.toggleLabel1 = ToggleLabel(labelFrame, text='ScrolledMatrix', callback=self.toggleFrame1) self.toggleLabel1.grid(row=0, column=0, sticky=Tkinter.W) self.toggleLabel1.arrowOn() self.toggleLabel2 = ToggleLabel(labelFrame, text='ScrolledGraph', callback=self.toggleFrame2) self.toggleLabel2.grid(row=0, column=1, sticky=Tkinter.W) self.toggleLabel3 = ToggleLabel(labelFrame, text='ScrolledCanvas', callback=self.toggleFrame3) self.toggleLabel3.grid(row=0, column=2, sticky=Tkinter.W) row += 1 mainFrame.grid_rowconfigure(row, weight=1) label = Label(mainFrame, text="changing/shrinking frames:") label.grid(row=row, column=0, sticky=Tkinter.E) self.toggleRow = row self.toggleFrame = Frame(mainFrame) self.toggleFrame.grid(row=row, column=1, sticky=Tkinter.NSEW) self.toggleFrame.grid_rowconfigure(0, weight=1) self.toggleFrame.grid_columnconfigure(0, weight=1) # option 1 self.intEntry = IntEntry(self, returnCallback = self.setNumber, width=8) self.multiWidget = MultiWidget(self, Entry, options=None, values=None, callback=self.setKeywords, minRows=3, maxRows=5) editWidgets = [None, None, self.intEntry, self.multiWidget] editGetCallbacks = [None, None, self.getNumber, self.getKeywords] editSetCallbacks = [None, None, self.setNumber, self.setKeywords] tipTexts = ['Name of the whatsit','Colour of the whatsit', 'The whatsit\'s number','The whatsit\'s keywords'] headingList = ['Name','Colour','Number','Keywords'] self.scrolledMatrix = ScrolledMatrix(self.toggleFrame, headingList=headingList, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, tipTexts=tipTexts, callback=self.selectObject, multiSelect=False) self.scrolledMatrix.grid(row=0, column=0, sticky=Tkinter.NSEW) # option 2 self.scrolledGraph = ScrolledGraph(self.toggleFrame, width=400, height=300, symbolSize=5, symbols=['square','circle'], dataColors=['#000080','#800000'], lineWidths=[0,1] ) self.scrolledGraph.setZoom(1.3) dataSet1 = [[0,0],[1,1],[2,4],[3,9],[4,16],[5,25]] dataSet2 = [[0,0],[1,3],[2,6],[3,9],[4,12],[5,15]] self.scrolledGraph.update(dataSets=[dataSet1,dataSet2], xLabel = 'X axis label', yLabel = 'Y axis label', title = 'Main Title') self.scrolledGraph.draw() # option 3 self.scrolledCanvas = ScrolledCanvas(self.toggleFrame,relief = 'groove', borderwidth = 2, resizeCallback=None) canvas = self.scrolledCanvas.canvas font = 'Helvetica 10' box = canvas.create_rectangle(10,10,150,200, outline='grey', fill='grey90') line = canvas.create_line(0,0,200,200,fill='#800000', width=2) text = canvas.create_text(120,50, text='Text', font=font, fill='black') circle = canvas.create_oval(30,30,50,50,outline='#008000',fill='#404040',width=3) row += 1 label = Label(mainFrame, text="FloatEntry:") label.grid(row=row, column=0, sticky=Tkinter.E) self.floatEntry = FloatEntry(mainFrame, text=3.14159265, tipText='Hint to user', returnCallback=self.floatEntryReturn) self.floatEntry.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="Scale:") label.grid(row=row, column=0, sticky=Tkinter.E) self.scale = Scale(mainFrame, from_=10, to=90, value=50, orient=Tkinter.HORIZONTAL) self.scale.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="Value Ramp:") label.grid(row=row, column=0, sticky=Tkinter.E) self.valueRamp = ValueRamp(mainFrame, self.valueRampCallback, speed = 1.5, delay = 50) self.valueRamp.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="ButtonList:") label.grid(row=row, column=0, sticky=Tkinter.E) texts = ['Select File','Close','Quit'] commands = [self.selectFile, self.close, self.quit] bottomButtons = ButtonList(mainFrame, texts=texts, commands=commands, expands=True) bottomButtons.grid(row=row, column=1, sticky=Tkinter.EW) self.protocol('WM_DELETE_WINDOW', self.quit)
def body(self, guiFrame): guiFrame.grid_columnconfigure(3, weight=1) self.progressBar = TypingEnsemblePopup(self,total=100) self.progressBar.close() row = 0 label = Label(guiFrame, text=' Chain: ', grid=(row,0)) tipText = 'Selects which molecular chain the spin system residue types will be predicted for; determines which range of types are available' self.chainPulldown = PulldownList(guiFrame, self.changeChain, grid=(row,1), tipText=tipText) tipText = 'Selects which shift list will be used as the source of chemical shift information to make the residue type predictions' label = Label(guiFrame, text='Shift List: ', grid=(row,2)) self.shiftListPulldown = PulldownList(guiFrame, callback=self.setShiftList, grid=(row,3), tipText=tipText) utilButtons = UtilityButtonList(guiFrame, helpUrl=self.help_url) utilButtons.grid(row=row, column=4, sticky='w') row += 1 frame = LabelFrame(guiFrame, text='Options', grid=(row,0), gridSpan=(1,5)) frame.grid_columnconfigure(3, weight=1) frow = 0 label = Label(frame, text='Keep existing types?', grid=(frow,0), sticky='e') tipText = 'Whether any existing residue type information should be preserved, when predicting the type of others' self.preserveTypesSelect = CheckButton(frame, grid=(frow,1), selected=False, callback=self.selectPreserveTypes, tipText=tipText) label = Label(frame, text='Assignment threshold: ', grid=(frow,2), sticky='e') tipText = 'The lower limit for the predicted residue type to be set with "Assign Types"; needs to be adjusted according to result statistics and amount of shift data' self.thresholdEntry = FloatEntry(frame, text=self.threshold, width=8, grid=(frow,3), tipText=tipText) frow += 1 label = Label(frame, text='Ensemble size: ', grid=(frow,0), sticky='e') tipText = 'The number of best scoring residue type mappings, from the Monte Carlo search, to use un the prediction' self.ensembleEntry = IntEntry(frame,text=20,width=4, grid=(frow,1), tipText=tipText) label = Label(frame, text='Num Search Steps: ', grid=(frow,2), sticky='e') tipText = 'The number of iterative steps that will be used in the Monte Carlo search of best spin system to residue type mappings' self.stepsEntry = IntEntry(frame, text=100000, width=8, tipText=tipText, grid=(frow,3)) frow += 1 label = Label(frame, text='Isotope shifts to consider:', grid=(frow,0), gridSpan=(1,4)) frow += 1 self.isotopes = ['1H','13C'] isos = ['1H','13C','15N'] colors = [COLOR_DICT[x] for x in isos] tipText = 'Selects which kinds of resonances, in terms of isotope, the residue type predictions will be made with' self.isotopeCheckButtons = PartitionedSelector(frame, labels=isos, objects=isos, colors=colors, callback=self.toggleIsotope, selected=self.isotopes, grid=(frow,0), gridSpan=(1,4), tipText=tipText) row += 1 guiFrame.grid_rowconfigure(row, weight=1) labelFrame = LabelFrame(guiFrame, text='Spin Systems', grid=(row,0), gridSpan=(1,5)) labelFrame.expandGrid(0,0) tipTexts = ['The spin system serial number', 'The residue to which the spin system may currently be assigned', 'Set whether to include a particular spin system in the type predictions', 'The spin system to residue type match score for a prediction; higher (less negative) is better', 'The predicted types of residue that the spin system may be', 'The chemical shifts in the spin system that will be used in the analysis'] headingList = ['#','Residue','Use?','Score','Types','Shifts'] justifyList = ['center','center','center','center','center','left'] editWidgets = [None, None, None, None, None, None] editGetCallbacks = [None, None, self.toggleInclude, None, None, None] editSetCallbacks = [None, None, None, None, None, None] self.scrolledMatrix = ScrolledMatrix(labelFrame, headingList=headingList, justifyList=justifyList, editSetCallbacks=editSetCallbacks, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, callback=self.selectCell, grid=(0,0), tipTexts=tipTexts) row += 1 tipTexts = ['Execute the Monte Carlo search that will make the residue type predictions for the spin systems', 'Assign the residue type of spin systems with a unique type prediction and prediction score above the stated threshold', 'Show a residue type prediction for the selected spin system alone; only considers that spin system of shifts, not how all spin systems fit to the sequence', 'Show a table of peaks that are assigned to the resonances of the selected spin system'] texts = ['Run\nTyping','Assign\nTypes', 'Show Individual\nClassification', 'Show\nPeaks'] commands = [self.run, self.assign, self.individualScore, self.showPeaks] bottomButtons = ButtonList(guiFrame, texts=texts, commands=commands, grid=(row,0), gridSpan=(1,5), tipTexts=tipTexts) self.runButton = bottomButtons.buttons[0] self.assignButton = bottomButtons.buttons[1] self.scoreButton = bottomButtons.buttons[2] self.peaksButton = bottomButtons.buttons[2] self.runButton.config(bg='#B0FFB0') for func in ('__init__','delete'): self.registerNotify(self.updateChains, 'ccp.molecule.MolSystem.Chain', func) self.registerNotify(self.updateShiftLists, 'ccp.nmr.Nmr.ShiftList', func) for func in ('__init__','delete','setCcpCode', 'setResidue','addResonance', 'setName', 'removeResonance','setResonances'): self.registerNotify(self.updateSpinSystemsAfter, 'ccp.nmr.Nmr.ResonanceGroup', func) self.updateChains() self.updateShiftLists() self.updateSpinSystems()
def __init__(self, parent, project, closeButton=False, tempFiles=False, *args, **kw): ########################################################################### # INIT VARIABLES self.parent = parent self.project = project try: self.nmrProject = (project.currentNmrProject or project.newNmrProject(name='BLACKLEDGE_MODULE')) except: print '&&& Running MODULE popup from outside CCPN Analysis - debug only - no NmrCalc' self.nmrProject = None if self.nmrProject: self.calcStore = project.findFirstNmrCalcStore(name=MODULE, nmrProject=self.nmrProject) or \ project.newNmrCalcStore(name=MODULE, nmrProject=self.nmrProject) else: self.calcStore = None self.run = None self.inputStructure = None self.inputRdcConstraintList = None self.inputDistanceConstraintList = [None] self.inputUserDescriptionText = None # path to the module executable modPath = subprocess.Popen( ['which', 'module'], stdout=subprocess.PIPE).communicate()[0].strip() self.moduleExePath = modPath or ' NB. MODULE executable not found ' self.waiting = False # for debug this could be False if tempFiles: self.useTempFiles = True else: self.useTempFiles = False # create temp files for MODULE if self.useTempFiles: self.moduleTempDir = tempfile.mkdtemp(prefix='MODULE-') else: self.moduleTempDir = os.getcwd() #djo35# self.calcStore = self.resetCalcStore(name='BLACKLEDGE_MODULE') # END INIT OF VARIABLES ########################################################################### ########################################################################### # START GUI CODE Frame.__init__(self, parent, *args, **kw) self.expandGrid(0, 0) ## Single Frame # frame = Frame(self, grid=(0,0)) # or with Tabs? options = ['Launch', 'Output', 'Runs'] tabbedFrame = TabbedFrame(self, options=options, grid=(0, 0)) frameA, frameB, frameC = tabbedFrame.frames self.tabbedFrame = tabbedFrame frameA.expandGrid(14, 2) row = 0 div = LabelDivider(frameA, text='MODULE Setup', grid=(row, 0), gridSpan=(1, 4)) row += 1 # allow the user to choose MODULE if either the one in PATH is incorrect or not found button = Button(frameA, text='Select MODULE executable:',bd=1, \ command=self.selectExecutable, grid=(row,0), sticky="ew") self.moduleExeEntry = Entry(frameA, text=self.moduleExePath, grid=(row,1), gridSpan=(1,3), \ width=32, sticky="ew", bd=1) self.moduleExePath = self.moduleExeEntry.get() # separator "MODULE input" row += 1 div = LabelDivider(frameA, text='MODULE input', grid=(row, 0), gridSpan=(1, 5)) row += 1 label = Label(frameA, text='Structure:', grid=(row, 1)) self.inputStructurePulldown = PulldownList(frameA, self.changeInputStructure, \ grid=(row,2)) # self.constraintsFileEntry.bind('<Leave>', self.updateEntryParams) row += 1 label = Label(frameA, text='RDC constraints:', grid=(row, 1)) self.inputRdcConstraintsPulldown = PulldownList(frameA, self.changeInputRdcConstraintList, \ grid=(row,2)) #self.constraintsFileEntry.bind('<Leave>', self.updateEntryParams) row += 1 label = Label(frameA, text='(Optional input)', grid=(row, 0)) label = Label(frameA, text='Distance constraints:', \ grid=(row,1)) self.inputDistanceConstraintsPulldown = PulldownList(frameA, self.changeInputDistanceConstraintList, \ grid=(row,2)) #self.constraintsFileEntry.bind('<Leave>', self.updateEntryParams) row += 1 subFrameDepth = 4 subframe = LabelFrame(frameA, text='MODULE User Notes (store notes about how MODULE was run here)', \ grid=(row,0), gridSpan=(1,4)) subframe.expandGrid(subFrameDepth, 0) self.moduleUserText = ScrolledText(subframe) self.moduleUserText.grid(row=subFrameDepth, column=0, columnspan=4, sticky='nsew') # View Results row += subFrameDepth # row += 1 # div = LabelDivider(frameA, text='MODULE launch', grid=(row,0), gridSpan=(1,4)) row += 1 button = Button(frameA, text='Run MODULE', bd=1, command=self.executeModule, \ grid=(row,0), gridSpan=(1,4), sticky="ew", bg=MODULE_GREEN) # grid=(row,0), gridSpan=(1,2), sticky="ew", bg=MODULE_GREEN) ########################################################################### # Frame B (tab 2) Ouput frameB.expandGrid(4, 1) row = 0 subFrameDepth = 6 subframe = LabelFrame(frameB, text='MODULE Output', \ grid=(row,0), gridSpan=(1,5)) #subframe.grid_columnconfigure(2, weight=1) subframe.expandGrid(subFrameDepth, 0) self.moduleOutputText = ScrolledText(subframe) self.moduleOutputText.setState(state=Tkinter.DISABLED) self.moduleOutputText.grid(row=subFrameDepth, column=0, columnspan=4, sticky='nsew') # separator "MODULE input" row += 1 div = LabelDivider(frameB, text='MODULE RDC Back Values', grid=(row, 0), gridSpan=(1, 5)) row += 1 button = Button(frameB, text='Import MODULE Back Values file', bd=1, command=self.importModuleBackValues, \ grid=(row,0), gridSpan=(1,4), sticky="ew", bg=MODULE_BLUE) # grid=(row,0), gridSpan=(2,4), sticky="ew", bg=MODULE_BLUE) row += 1 self.rdcOutputTable = None frameB.grid_rowconfigure(row, weight=1) headings = ('#', 'Resonances', 'Value', 'Back Value', 'Diff.', 'Error') editWidgets = [None, None, None, None, None, None] editGetCallbacks = [None, None, None, None, None, None] editSetCallbacks = [None, None, None, None, None, None] self.rdcOutputTable = ScrolledMatrix(frameB, headingList=headings, multiSelect=False, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, initialRows=4) self.rdcOutputTable.grid(row=row, column=0, columnspan=4, sticky='nsew') row += 1 button = Button(frameB, text='Import MODULE Structure', bd=1, command=self.importModuleStructure, \ grid=(row,0), gridSpan=(1,4), sticky="ew", bg=MODULE_BLUE) # grid=(row,0), gridSpan=(2,4), sticky="ew", bg=MODULE_BLUE) ########################################################################### # Frame C (tab 3) NMR Calc display bits frameC.expandGrid(4, 1) row = 0 div = LabelDivider(frameC, text='Stored MODULE Runs', grid=(row, 0), gridSpan=(1, 5)) # NmrCalc Run scrolled matrix row += 1 self.runTable = None frameC.grid_rowconfigure(row, weight=1) headings = ('Run ID', 'notes', 'Status') # self.editRunNotes = DataEntry.askString('Run Notes', 'Edit notes about Run', tipText='Notes about Run', parent=self) # editWidgets = [None, self.editRunNotes, None] editWidgets = [None, None, None] editGetCallbacks = [None, None, None] editSetCallbacks = [None, None, None] self.runTable = ScrolledMatrix(frameC, headingList=headings, multiSelect=False, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, initialRows=4) self.runTable.grid(row=row, column=0, columnspan=4, sticky='nsew') row += 4 tipTexts = ['Load Selected Run', 'Delete Selected Run'] texts = ['Load Selected Run', 'Delete Selected'] commands = [self.loadRun, self.deleteRun] colours = [MODULE_GREEN, MODULE_RED] self.runButtons = ButtonList(frameC, texts=texts, tipTexts=tipTexts, commands=commands, grid=(row, 0), gridSpan=(1, 4)) self.runButtons.buttons[0].config(bg=MODULE_GREEN) self.runButtons.buttons[1].config(bg=MODULE_RED) ########################################################################### # Keep GUI up to date self.updateAfter() self.administerNotifiers(self.parent.registerNotify)
def __init__(self, parent, application, *args, **kw): project = application.project simStore = project.findFirstNmrSimStore(application=APP_NAME) or \ project.newNmrSimStore(application=APP_NAME, name=APP_NAME) self.application = application self.residue = None self.structure = None self.serverCredentials = None self.iCingBaseUrl = DEFAULT_URL self.resultsUrl = None self.chain = None self.nmrProject = application.nmrProject self.serverDone = False NmrSimRunFrame.__init__(self, parent, project, simStore, *args, **kw) # # # # # # New Structure Frame # # # # # self.structureFrame.grid_forget() tab = self.tabbedFrame.frames[0] frame = Frame(tab, grid=(1,0)) frame.expandGrid(2,1) div = LabelDivider(frame, text='Structures', grid=(0,0), gridSpan=(1,2)) label = Label(frame, text='Ensemble: ', grid=(1,0)) self.structurePulldown = PulldownList(frame, callback=self.changeStructure, grid=(1,1)) headingList = ['Model','Use'] editWidgets = [None,None] editGetCallbacks = [None,self.toggleModel] editSetCallbacks = [None,None,] self.modelTable = ScrolledMatrix(frame, grid=(2,0), gridSpan=(1,2), callback=self.selectStructModel, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, headingList=headingList) texts = ['Activate Selected','Inactivate Selected'] commands = [self.activateModels, self.disableModels] buttons = ButtonList(frame, texts=texts, commands=commands, grid=(3,0), gridSpan=(1,2)) # # # # # # Submission frame # # # # # # tab = self.tabbedFrame.frames[1] tab.expandGrid(1,0) frame = LabelFrame(tab, text='Server Job Submission', grid=(0,0)) frame.expandGrid(None,2) srow = 0 label = Label(frame, text='iCing URL:', grid=(srow, 0)) urls = [DEFAULT_URL,] self.iCingBaseUrlPulldown = PulldownList(frame, texts=urls, objects=urls, index=0, grid=(srow,1)) srow +=1 label = Label(frame, text='Results File:', grid=(srow, 0)) self.resultFileEntry = Entry(frame, bd=1, text='', grid=(srow,1), width=50) self.setZipFileName() button = Button(frame, text='Choose File', bd=1, sticky='ew', command=self.chooseZipFile, grid=(srow, 2)) srow +=1 label = Label(frame, text='Results URL:', grid=(srow, 0)) self.resultUrlEntry = Entry(frame, bd=1, text='', grid=(srow,1), width=50) button = Button(frame, text='View Results HTML', bd=1, sticky='ew', command=self.viewHtmlResults, grid=(srow, 2)) srow +=1 texts = ['Submit Project!', 'Check Run Status', 'Purge Server Result', 'Download Results'] commands = [self.runCingServer, self.checkStatus, self.purgeCingServer, self.downloadResults] self.buttonBar = ButtonList(frame, texts=texts, commands=commands, grid=(srow, 0), gridSpan=(1,3)) for button in self.buttonBar.buttons[:1]: button.config(bg=CING_BLUE) # # # # # # Residue frame # # # # # # frame = LabelFrame(tab, text='Residue Options', grid=(1,0)) frame.expandGrid(1,1) label = Label(frame, text='Chain: ') label.grid(row=0,column=0,sticky='w') self.chainPulldown = PulldownList(frame, callback=self.changeChain) self.chainPulldown.grid(row=0,column=1,sticky='w') headingList = ['#','Residue','Linking','Decriptor','Use?'] editWidgets = [None,None,None,None,None] editGetCallbacks = [None,None,None,None,self.toggleResidue] editSetCallbacks = [None,None,None,None,None,] self.residueMatrix = ScrolledMatrix(frame, headingList=headingList, multiSelect=True, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, callback=self.selectResidue) self.residueMatrix.grid(row=1, column=0, columnspan=2, sticky = 'nsew') texts = ['Activate Selected','Inactivate Selected'] commands = [self.activateResidues, self.deactivateResidues] self.resButtons = ButtonList(frame, texts=texts, commands=commands,) self.resButtons.grid(row=2, column=0, columnspan=2, sticky='ew') """ # # # # # # Validate frame # # # # # # frame = LabelFrame(tab, text='Validation Options', grid=(2,0)) frame.expandGrid(None,2) srow = 0 self.selectCheckAssign = CheckButton(frame) self.selectCheckAssign.grid(row=srow, column=0,sticky='nw' ) self.selectCheckAssign.set(True) label = Label(frame, text='Assignments and shifts') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckResraint = CheckButton(frame) self.selectCheckResraint.grid(row=srow, column=0,sticky='nw' ) self.selectCheckResraint.set(True) label = Label(frame, text='Restraints') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckQueen = CheckButton(frame) self.selectCheckQueen.grid(row=srow, column=0,sticky='nw' ) self.selectCheckQueen.set(False) label = Label(frame, text='QUEEN') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckScript = CheckButton(frame) self.selectCheckScript.grid(row=srow, column=0,sticky='nw' ) self.selectCheckScript.set(False) label = Label(frame, text='User Python script\n(overriding option)') label.grid(row=srow,column=1,sticky='nw') self.validScriptEntry = Entry(frame, bd=1, text='') self.validScriptEntry.grid(row=srow,column=2,sticky='ew') scriptButton = Button(frame, bd=1, command=self.chooseValidScript, text='Browse') scriptButton.grid(row=srow,column=3,sticky='ew') """ # # # # # # # # # # self.update(simStore) self.administerNotifiers(application.registerNotify)
def __init__(self, parent, file_types = None, directory = None, single_callback = None, double_callback = None, prompt = None, show_file = True, file = '', multiSelect=False, default_dir = None, getRowColor = None, getExtraCell = None, extraHeadings = None, extraJustifies = None, displayExtra = True, *args, **kw): if file_types is None: file_types = [ FileType("All", ["*"]) ] if directory is None: directory = normalisePath(os.getcwd()) if extraHeadings is None: extraHeadings = () else: extraHeadings = tuple(extraHeadings) if extraJustifies is None: extraJustifies = () else: extraJustifies = tuple(extraJustifies) if extraHeadings or extraJustifies: assert len(extraHeadings) == len(extraJustifies) assert getExtraCell self.extraHeadings = extraHeadings self.extraJustifies = extraJustifies self.displayExtra = displayExtra Frame.__init__(self, parent, *args, **kw) self.file_types = file_types self.fileType = file_types[0] self.single_callback = single_callback self.double_callback = double_callback self.show_file = show_file self.directory = None self.historyBack = [] self.historyFwd = [] self.determineDir(directory) self.default_dir = default_dir self.getRowColor = getRowColor self.getExtraCell = getExtraCell self.grid_columnconfigure(0, weight=1) row = 0 if prompt: label = Label(self, text=prompt, grid=(row,0)) row += 1 self.grid_rowconfigure(row, weight=1) if show_file: headings = ('Name', 'Size', 'Date') justifies = ('left','right','right') else: headings = ('Directory',) justifies = ('left',) self.normalHeadings = headings self.normalJustifies = justifies headings = headings + extraHeadings justifies = justifies + extraJustifies self.fileList = ScrolledMatrix(self, headingList=headings, justifyList=justifies, initialRows=10, callback=self.singleCallback, doubleCallback=self.doubleCallback, multiSelect=multiSelect, grid=(row,0)) row += 1 texts = ['Back', 'Up', 'Forward', 'Top', 'Home', 'New', 'Refresh'] commands = [self.backDir, self.fwdDir, self.upDir, self.topDir, self.homeDir, self.createDir, self.updateFileList ] if self.default_dir: texts.append('Default') commands.append(self.setDefaultDir) self.icons = [] for name in ICON_NAMES: icon = Tkinter.PhotoImage(file=os.path.join(GFX_DIR,name+'.gif')) self.icons.append(icon) self.buttons = ButtonList(self, texts=texts, commands=commands, images=self.icons, grid=(row,0)) if show_file: row += 1 self.file_entry = LabeledEntry(self, label='File name', label_width=10, entry_width=40, returnCallback=self.setSelectedFile) self.file_entry.grid(row=row, column=0, sticky=Tkinter.EW) else: self.file_entry = None row += 1 self.directory_entry = LabeledEntry(self, label='Directory', entry = directory, label_width=10, entry_width=40, returnCallback=self.entryDir) self.directory_entry.grid(row=row, column=0, sticky=Tkinter.EW) row += 1 subFrame = Frame(self, grid=(row,0)) subFrame.expandGrid(None,6) if show_file: label = Label(subFrame, text='File type:', grid=(0,0)) type_labels = self.determineTypeLabels() self.fileType_menu = PulldownList(subFrame, callback=self.typeCallback, texts=type_labels, objects=self.file_types, grid=(0,1)) label = Label(subFrame, text=' Show hidden:', grid=(0,2)) self.hidden_checkbutton = CheckButton(subFrame, text='', selected=False, callback=self.updateFileList, grid=(0,3)) label = Label(subFrame, text='Dir path:', grid=(0,4)) self.pathMenu = PulldownList(subFrame, callback=self.dirCallback, objects=range(len(self.dirs)), texts=self.dirs, index=len(self.dirs)-1, indent=' ', prefix=dirsep, grid=(0,5)) self.updateFileList() self.updateButtons() if file: self.setFile(file)
def body(self, guiFrame): self.geometry('450x500') guiFrame.grid_rowconfigure(0, weight=1) guiFrame.grid_columnconfigure(0, weight=1) options = ['Peak Separator', 'Advanced Settings'] tabbedFrame = TabbedFrame(guiFrame, options=options) tabbedFrame.grid(row=0, column=0, sticky='nsew') buttons = UtilityButtonList(tabbedFrame.sideFrame, helpUrl=self.help_url) buttons.grid(row=0, column=0, sticky='e') self.tabbedFrame = tabbedFrame frameA, frameB = tabbedFrame.frames # # FrameA : Main Settings # frameA.grid_columnconfigure(1, weight=1) row = 0 # Label row row += 1 div = LabelDivider(frameA, text='Peak Separator Parameters') div.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 label = Label(frameA, text='Min. number of peaks:') label.grid(row=row, column=0, sticky='w') self.minPeaksEntry = IntEntry(frameA, returnCallback=self.applyChange, width=10, \ tipText='Minimum number of peaks to find (must be > 0)') self.minPeaksEntry.grid(row=row, column=1, sticky='n') self.minPeaksEntry.bind('<Leave>', self.applyChange, '+') row += 1 label = Label(frameA, text='Max. number of peaks:') label.grid(row=row, column=0, sticky='w') self.maxPeaksEntry = IntEntry(frameA, returnCallback=self.applyChange, width=10, \ tipText='Maximum number of peaks to find (0 is unlimited - not recommended)') self.maxPeaksEntry.grid(row=row, column=1, sticky='n') self.maxPeaksEntry.bind('<Leave>', self.applyChange, '+') row += 1 label = Label(frameA, text='Only pick positive peaks:') label.grid(row=row, column=0, sticky='w') entries = ['False', 'True'] self.posPeaksButtons = RadioButtons( frameA, entries=entries, select_callback=self.applyChange, direction='horizontal', tipTexts=[ 'Search for both positive and negative intensity peaks', 'Limit search to only positive peaks' ]) self.posPeaksButtons.grid(row=row, column=1, sticky='n') row += 1 label = Label(frameA, text='Peak Model:') label.grid(row=row, column=0, sticky='w') ### G/L Mixture works, but volume calculation involves Gamma function # entries = ['Gaussian', 'Lorentzian', 'G/L Mixture'] entries = ['Gaussian', 'Lorentzian'] self.shapeButtons = RadioButtons( frameA, entries=entries, select_callback=self.applyChange, direction='horizontal', tipTexts=[ 'Choose a Gaussian model peak shape to fit to peaks', 'Choose a Lorentzian model peak shape to fit to peaks' ]) self.shapeButtons.grid(row=row, column=1, sticky='n') row += 1 div = LabelDivider(frameA, text='Region', tipText='Region that search will limit itself to') div.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 label = Label(frameA, text='Peak List:') label.grid(row=row, column=0, sticky='nw') self.peakListPulldown = PulldownList( frameA, callback=self.setManuallyPickPeakList, tipText='Select which peak list new peaks are to be added to') self.peakListPulldown.grid(row=row, column=1, sticky='nw') # tricky scrolled matrix row += 1 self.regionTable = None frameA.grid_rowconfigure(row, weight=1) headings = ('dim.', 'start (ppm)', 'end (ppm)', 'actual size') self.editDimEntry = IntEntry(self, returnCallback=self.applyChange, width=5, tipText='Dimension number') self.editStartEntry = FloatEntry(self, returnCallback=self.applyChange, width=5, tipText='Search area lower bound') self.editEndEntry = FloatEntry(self, returnCallback=self.applyChange, width=5, tipText='Search area upper bound') editWidgets = [ self.editDimEntry, self.editStartEntry, self.editEndEntry, None ] editGetCallbacks = [None, None, None, None] editSetCallbacks = [None, None, None, None] self.regionTable = ScrolledMatrix(frameA, headingList=headings, multiSelect=False, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, initialRows=5) self.regionTable.grid(row=row, column=0, columnspan=2, sticky='nsew') # Run Button row += 1 texts = ['Add Region'] commands = [self.updateFromRegion] self.addResetButtons = ButtonList( frameA, texts=texts, commands=commands, tipTexts=['Add selected specrtral region']) self.addResetButtons.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 texts = ['Separate Peaks'] commands = [self.runPeakSeparator] self.runButton = ButtonList(frameA, texts=texts, commands=commands, expands=True, tipTexts=['Run peak search now']) self.runButton.grid(row=row, column=0, columnspan=2, sticky='nsew') # # FrameB : Further Settings # frameB.grid_columnconfigure(0, weight=1) row = 0 div = LabelDivider(frameB, text='Rate:') div.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 label = Label(frameB, text='Rate of MCMC step size change') label.grid(row=row, column=0, columnspan=1, sticky='w') self.rateEntry = FloatEntry(frameB, returnCallback=self.applyChange, width=10, \ tipText='Rate effects speed of run, smaller values take longer but may produce better results') self.rateEntry.grid(row=row, column=1, sticky='n') self.rateEntry.bind('<Leave>', self.applyChange, '+') self.rateEntry.set(self.params.rate) # tricky scrolled matrix for line width row += 2 div = LabelDivider(frameB, text='Line Width (Hz):') div.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 label = Label(frameB, text="Descr.") label.grid(row=row, rowspan=2, column=0, sticky='w') row += 1 self.lineWidthTable = None frameB.grid_rowconfigure(row, weight=1) lineWidthHeadings = ('dim.', 'min. σ (Hz)', 'max. σ (Hz)') self.editMinSigmaEntry = FloatEntry(self, returnCallback=self.applyChange, width=5, tipText='Minimum line width (Hz)') self.editMaxSigmaEntry = FloatEntry(self, returnCallback=self.applyChange, width=5, tipText='Maximum line width (Hz)') # self.editDimEntry is also from regionTable initialWidthRows = 4 editLineWidthWidgets = [ None, self.editMinSigmaEntry, self.editMaxSigmaEntry ] editLineWidthGetCallbacks = [None, self.getSigmaMin, self.getSigmaMax] editLineWidthSetCallbacks = [None, self.setSigmaMin, self.setSigmaMax] self.lineWidthTable = ScrolledMatrix( frameB, headingList=lineWidthHeadings, multiSelect=False, editWidgets=editLineWidthWidgets, editGetCallbacks=editLineWidthGetCallbacks, editSetCallbacks=editLineWidthSetCallbacks, initialRows=initialWidthRows) self.lineWidthTable.grid(row=row, column=0, columnspan=2, sticky='nsew') # option to 'repick' exisiting peak list row += initialWidthRows div = LabelDivider(frameB, text='(optional - repick entire peak list)') div.grid(row=row, column=0, columnspan=2, sticky='ew') row += 1 self.repickListPulldown = PulldownList( frameB, callback=self.setRePickPeakList, tipText= 'Select which peak list to repick (new peaks will be put into a new peak list)' ) self.repickListPulldown.grid(row=row, column=0, sticky='nw') texts = ['Repick Peak List'] commands = [self.runRepickPeaks] self.runButton = ButtonList( frameB, texts=texts, commands=commands, expands=True, tipTexts=['Repick selected peak list into a new peak list.']) self.runButton.grid(row=row, column=1, columnspan=1, sticky='nsew') row += 1 div = LabelDivider(frameB) row += 1 texts = ['Separate Peaks'] commands = [self.runPeakSeparator] self.runButton = ButtonList(frameB, texts=texts, commands=commands, expands=True, tipTexts=['Run peak search now']) self.runButton.grid(row=row, column=0, columnspan=2, sticky='nsew') self.setWidgetEntries() self.administerNotifiers(self.registerNotify)
def body(self, guiFrame): self.geometry('700x840') guiFrame.expandGrid(1,0) # Top frame frame = Frame(guiFrame, grid=(0,0)) frame.expandGrid(None,8) label = Label(frame, text=u' %s List:' % T1, grid=(0,0)) self.t1Pulldown = PulldownList(frame, callback=self.selectT1List, grid=(0,1)) label = Label(frame, text=u' %s List:' % T2, grid=(0,2)) self.t2Pulldown = PulldownList(frame, callback=self.selectT2List, grid=(0,3)) label = Label(frame, text=' NOE List:', grid=(0,4)) self.noePulldown = PulldownList(frame, callback=self.selectNoeList, grid=(0,5)) label = Label(frame, text=' Spectrometer Freq (MHz):', grid=(0,6)) self.sfEntry = FloatEntry(frame, grid=(0,7), text=600.00, width=6) UtilityButtonList(frame, grid=(0,9), sticky='e') # Tabs options = [u'%s vs %s Scatter' % (T1, T2), u'%s,%s & NOE Graphs' % (T1, T2) , u'%s/%s Graph' % (T1, T2), u'%s Estimate Graph' % S2, 'Options'] self.tabbedFrame = TabbedFrame(guiFrame, options=options, callback=self.toggleTab, grid=(1,0)) frameA, frameD, frameC, frameE, frameB = self.tabbedFrame.frames # T1 vs T2 Graph frameA.expandGrid(0,0) self.t1t2Graph = T1VersesT2Plot(frameA, grid=(0,0)) # T1 & T2 Graph frameD.expandGrid(0,0) frameD.expandGrid(1,0) frameD.expandGrid(2,0) self.t1Graph = MeasurementPlot(frameD, T1, grid=(0,0)) self.t2Graph = MeasurementPlot(frameD, T2, grid=(1,0)) self.noeGraph = NoePlot(frameD, 'NOE', grid=(2,0)) # T1 over T2 Graph frameC.expandGrid(0,0) self.t1t2GraphB = T1OverT2Plot(frameC, grid=(0,0)) # Order params graph frameE.expandGrid(0,0) frameE.expandGrid(1,0) frameE.expandGrid(2,0) self.s2Graph = ScrolledGraph(frameE, title=u'%s vs Residue Sequence' % S2, xLabel='Residue number', yLabel=S2, width=500, height=150, graphType='histogram', xGrid=True, yGrid=False, grid=(0,0), dataColors=['#0000A0','#808000'], dataNames=['Isotropic',]) self.teGraph = ScrolledGraph(frameE, title=u'%s vs Residue Sequence' % Te, xLabel='Residue number', yLabel=u'%s (ps)' % Te, width=500, height=150, graphType='histogram', xGrid=True, yGrid=False, grid=(1,0), dataColors=['#008000',]) self.rexGraph = ScrolledGraph(frameE, title=u'%s vs Residue Sequence' % 'Rex', xLabel='Residue number', yLabel='Rex', width=500, height=150, graphType='histogram', xGrid=True, yGrid=False, grid=(2,0), dataColors=['#900000',]) # Options frameB.expandGrid(4,2) frame = LabelFrame(frameB, text='Physical Params', grid=(0,0)) frame.expandGrid(None,3) label = Label(frame, text=u'N-H bond length (\u00C5)', grid=(0,0)) self.lenNhEntry = FloatEntry(frame, text=1.015, grid=(0,1), width=8) label = Label(frame, text=u'Internal correlation\ntime, \u03C4e (ps)', grid=(1,0)) self.ictEntry = FloatEntry(frame, text=50.0, grid=(1,1), width=8) label = Label(frame, text=u'15N Chemical Shift\nAnisotopy,\u0394N (ppm)', grid=(2,0)) self.csaNEntry = FloatEntry(frame, text=-160.0, grid=(2,1), width=8) frame = LabelFrame(frameB, text=u'%s vs %s Scatter' % (T1, T2), grid=(1,0)) label = Label(frame, text='Max cluster difference (ms):', grid=(0,0)) self.clusterDictEntry = FloatEntry(frame, text=20.0, grid=(0,1), width=8) label = Label(frame, text='Min cluster size:', grid=(1,0)) self.clusterSizeEntry = FloatEntry(frame, text=5, grid=(1,1), width=8) label = Label(frame, text=u'Min graph %s (ms):' % T1, grid=(2,0)) self.minT1Entry = FloatEntry(frame, text=300.0, grid=(2,1), width=8) label = Label(frame, text=u'Max graph %s (ms):' % T1, grid=(3,0)) self.maxT1Entry = FloatEntry(frame, text=1000.0, grid=(3,1), width=8) label = Label(frame, text=u'Min graph %s (ms):' % T2, grid=(4,0)) self.minT2Entry = FloatEntry(frame, text=0.0, grid=(4,1), width=8) label = Label(frame, text=u'Max graph %s (ms):' % T2, grid=(5,0)) self.maxT2Entry = FloatEntry(frame, text=600.0, grid=(5,1), width=8) frame = LabelFrame(frameB, text=u'%s Contours' % S2, grid=(0,1)) frame.expandGrid(4,3) label = Label(frame, text='(Order Parameter Lines)', grid=(0,0), gridSpan=(1,2)) label = Label(frame, text='Min value:', grid=(1,0)) self.minS2Entry = FloatEntry(frame, text=0.3, grid=(1,1), width=8) label = Label(frame, text='Max value:', grid=(2,0)) self.maxS2Entry = FloatEntry(frame, text=1.0, grid=(2,1), width=8) label = Label(frame, text='Step:', grid=(3,0)) self.stepS2Entry = FloatEntry(frame, text=0.1, grid=(3,1), width=8) frame = LabelFrame(frameB, text=u'\u03C4m Contours', grid=(1,1)) frame.expandGrid(4,3) label = Label(frame, text='(Rotational Correlation Time Lines)', grid=(0,0), gridSpan=(1,2)) label = Label(frame, text='Min value (ns):', grid=(1,0)) self.minRctEntry = FloatEntry(frame, text=5.0, grid=(1,1), width=8) label = Label(frame, text='Max value (ns):', grid=(2,0)) self.maxRctEntry = FloatEntry(frame, text=14.0, grid=(2,1), width=8) label = Label(frame, text='Step (ns):', grid=(3,0)) self.stepRctEntry = FloatEntry(frame, text=1.0, grid=(3,1), width=8) # Bottom frame texts = [u'Show %s Table' % T1,u'Show %s Table' % T2, u'Estimate %s' % S2] commands = [self.showT1List, self.showT2List, self.mc] buttonList = ButtonList(guiFrame, grid=(2,0), texts=texts, commands=commands) # Update self.updateRelaxationLists() self.drawAfter() self.administerNotifiers(self.registerNotify)