def __init__(self, parent, startUrlCallback=None, endUrlCallback=None, enterLinkCallback=None, leaveLinkCallback=None, *args, **kw): self.startUrlCallback = startUrlCallback self.endUrlCallback = endUrlCallback self.enterLinkCallback = enterLinkCallback self.leaveLinkCallback = leaveLinkCallback self.initTags() self.protocol = '' self.location = '' self.path = '' self.dir = '' formatter.NullWriter.__init__(self) self.formatter = formatter.AbstractFormatter(self) htmllib.HTMLParser.__init__(self, self.formatter) ScrolledText.__init__(self, parent, *args, **kw) self.text_area.config(font=(font_family, default_size)) self.bind('<Enter>', lambda event: self.focus()) self.bind('<KeyPress-Prior>', lambda event: self.pageChange(-1)) self.bind('<KeyPress-Next>', lambda event: self.pageChange(1))
class TextOutputPopup(BasePopup): help_url = joinPath(getHelpUrlDir(), 'TextOutput.html') def __init__(self, parent, title='Text output'): BasePopup.__init__(self, parent=parent, title=title, modal=False, transient=False) def body(self, master): self.text = ScrolledText(master) self.text.pack(side=Tkinter.TOP, expand=Tkinter.YES, fill=Tkinter.BOTH) texts = ['Save text'] commands = [self.saveText] buttons = createHelpButtonList(master, texts=texts, commands=commands, help_url=self.help_url) buttons.pack() def saveText(self): fileSelectPopup = FileSelectPopup( self, file_types=[ FileType('Text', ['*.txt', '*.out', '*.text']), FileType('All', ['*']) ], title='Select text output save file') fileName = fileSelectPopup.getFile() if fileName: writeFile = 1 if os.path.exists(fileName): if not showYesNo('Overwrite file', 'Overwrite existing file %s?' % fileName): writeFile = 0 if writeFile: fout = open(fileName, 'w') fout.write(self.text.text_area.getText()) fout.close() def apply(self): return True
def body(self, master): self.text = ScrolledText(master) self.text.pack(side=Tkinter.TOP, expand=Tkinter.YES, fill=Tkinter.BOTH) texts = ['Save text'] commands = [self.saveText] buttons = createHelpButtonList(master, texts=texts, commands=commands, help_url=self.help_url) buttons.pack()
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 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)
class CingGui(BasePopup): def __init__(self, parent, options, *args, **kw): # Fill in below variable once run generates some results self.haveResults = None # store the options self.options = options BasePopup.__init__(self, parent=parent, title='CING Setup', **kw) # self.setGeometry(850, 750, 50, 50) self.project = None # self.tk_strictMotif( True) self.updateGui() # end def __init__ 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) # end for # end def body def getGuiOptions(self): projectName = self.projEntry.get() index = self.projOptionsSelect.getIndex() if index > 0: makeNewProject = True projectImport = None if index > 1: i = index-2 format = ['PDB','CCPN','CYANA'][i] file = [self.pdbEntry, self.ccpnEntry, self.cyanaEntry][i].get() if not file: showWarning('Failure','No %s file selected' % format) return # end if projectImport = (format, file) # end if else: # Chould also check that any old project file exists makeNewProject = False projectImport = None # end if doValidation = self.selectDoValidation.get() checks = [] if doValidation: if self.selectCheckAssign.get(): checks.append('assignments') # end if if self.selectCheckResraint.get(): checks.append('restraints') # end if if self.selectCheckStructure.get(): checks.append('structural') # end if if self.selectMakeHtml.get(): checks.append('HTML') # end if if self.selectCheckScript.get(): script = self.validScriptEntry.get() if script: checks.append( ('script',script) ) # end if # end if if self.selectCheckQueen.get(): checks.append('queen') # end if # end if exports = [] if self.selectExportXeasy.get(): exports.append('Xeasy') # end if if self.selectExportCcpn.get(): exports.append('CCPN') # end if if self.selectExportQueen.get(): exports.append('QUEEN') # end if if self.selectExportRefine.get(): exports.append('refine') # end if miscScript = None if self.selectMiscScript.get(): script = self.miscScriptEntry.get() if script: miscScript = script # end if # end if return projectName, makeNewProject, projectImport, doValidation, checks, exports, miscScript # end def getGuiOptions def runCing(self): options = self.getGuiOptions() if options: projectName, makeNewProject, projectImport, doValidation, checks, exports, miscScript = options print 'Project name:', projectName print 'Make new project?', makeNewProject print 'Import source:', projectImport print 'Do vailidation?', doValidation print 'Validation checks:', ','.join(checks) print 'Export to:', ','.join(exports) print 'User script:', miscScript # end if # end def runCing # else there was already an error message def chooseOldProjectFile(self): fileTypes = [ FileType('CING', ['project.xml']), FileType('All', ['*']) ] popup = FileSelectPopup(self, file_types = fileTypes, title = 'Select CING project file', dismiss_text = 'Cancel', selected_file_must_exist = True) fileName = popup.getFile() # dirName = popup.getDirectory() if len(fileName) > 0: # Put text into entry,name widgets dummy,name = cing.Project.rootPath(fileName) self.projEntry.configure(state='normal') self.projEntry.set(fileName) self.nameEntry.configure(state='normal') self.nameEntry.set(name) self.nameEntry.configure(state='disabled') # choose the correct radiobutton self.projOptionsSelect.setIndex(0) self.updateGui() # end if #nd if popup.destroy() # end def chooseOldProjectFile def choosePdbFile(self): fileTypes = [ FileType('PDB', ['*.pdb']), FileType('All', ['*'])] popup = FileSelectPopup(self, file_types = fileTypes, title = 'PDB file', dismiss_text = 'Cancel', selected_file_must_exist = True) fileName = popup.getFile() if len(fileName)>0: # Put text into entry widget self.pdbEntry.configure(state='normal') self.pdbEntry.set(fileName) # Put text into name widget _dir,name,dummy = nTpath( fileName ) self.nameEntry.configure(state='normal') self.nameEntry.set(name) # choose the correct radiobutton self.projOptionsSelect.setIndex(1) self.updateGui() #end if popup.destroy() # end def choosePdbFile def chooseCcpnFile(self): fileTypes = [ FileType('XML', ['*.xml']), FileType('All', ['*'])] popup = FileSelectPopup(self, file_types = fileTypes, title = 'CCPN project XML file', dismiss_text = 'Cancel', selected_file_must_exist = True) fileName = popup.getFile() if len(fileName)>0: self.pdbEntry.configure(state='normal') self.pdbEntry.set(fileName) self.projOptionsSelect.setIndex(1) _dir,name,dummy = nTpath( fileName ) self.nameEntry.set(name) #end if self.ccpnEntry.set(fileName) self.projOptionsSelect.setIndex(2) popup.destroy() # end def chooseCcpnFile def chooseCyanaFile(self): # Prepend default Cyana file extension below fileTypes = [ FileType('All', ['*']), ] popup = FileSelectPopup(self, file_types = fileTypes, title = 'CYANA fproject file', dismiss_text = 'Cancel', selected_file_must_exist = True) fileName = popup.getFile() self.cyanaEntry.set(fileName) self.projOptionsSelect.setIndex(3) popup.destroy() # end def chooseCyanaFile def chooseValidScript(self): # Prepend default Cyana file extension below fileTypes = [ FileType('All', ['*']), ] popup = FileSelectPopup(self, file_types = fileTypes, title = 'Script file', dismiss_text = 'Cancel', selected_file_must_exist = True) fileName = popup.getFile() self.validScriptEntry.set(fileName) popup.destroy() # end def chooseValidScript def chooseMiscScript(self): # Prepend default Cyana file extension below fileTypes = [ FileType('All', ['*']), ] popup = FileSelectPopup(self, file_types = fileTypes, title = 'Script file', dismiss_text = 'Cancel', selected_file_must_exist = True) fileName = popup.getFile() self.miscScriptEntry.set(fileName) popup.destroy() # end def chooseMiscScript def openProject(self ): projOption = self.projOptionsSelect.get() if projOption == self.projectOptions[0]: self.openOldProject() elif projOption == self.projectOptions[1]: self.initPdb() # end if if self.project: self.project.gui = self # end if self.updateGui() #end def def openOldProject(self ): fName = self.projEntry.get() if not os.path.exists( fName ): nTerror('Error: file "%s" does not exist\n', fName) #end if if self.project: self.closeProject() # end if self.project = cing.Project.open( name=fName, status='old', verbose=False ) #end def def initPdb(self ): fName = self.pdbEntry.get() if not os.path.exists( fName ): nTerror('Error: file "%s" does not exist\n', fName) #end if self.project = cing.Project.open( self.nameEntry.get(), status='new' ) self.project.initPDB( pdbFile=fName, convention = 'PDB' ) #end def def closeProject(self): if self.project: self.project.close() # end if self.project = None self.updateGui() #end def def updateGui(self, event=None): projOption = self.projOptionsSelect.get() buttons = self.buttonBar.buttons # Disable entries for e in [self.projEntry, self.pdbEntry, self.ccpnEntry, self.cyanaEntry, self.nameEntry]: e.configure(state='disabled') #end for if projOption == self.projectOptions[0]: # Enable entries self.projEntry.configure(state='normal') if (len(self.projEntry.get()) > 0): self.openProjectButton.enable() self.runButton.enable() else: self.openProjectButton.disable() self.runButton.disable() #end if elif projOption == self.projectOptions[1]: # Enable entries self.pdbEntry.configure(state='normal') self.nameEntry.configure(state='normal') if (len(self.pdbEntry.get()) > 0 and len(self.nameEntry.get()) > 0): buttons[0].enable() buttons[1].enable() else: buttons[0].disable() buttons[1].disable() #end if #end if elif projOption == self.projectOptions[2]: # Enable entries self.ccpnEntry.configure(state='normal') self.nameEntry.configure(state='normal') if (len(self.ccpnEntry.get()) > 0 and len(self.nameEntry.get()) > 0): buttons[0].enable() buttons[1].enable() else: buttons[0].disable() buttons[1].disable() #end if #end if elif projOption == self.projectOptions[3]: # Enable entries self.cyanaEntry.configure(state='normal') self.nameEntry.configure(state='normal') if (len(self.cyanaEntry.get()) > 0 and len(self.nameEntry.get()) > 0): buttons[0].enable() buttons[1].enable() else: buttons[0].disable() buttons[1].disable() #end if #end if self.projectStatus.clear() if not self.project: self.projectStatus.setText('No open project') self.closeProjectButton.setText('Close Project') self.closeProjectButton.disable() else: self.projectStatus.setText(self.project.format()) self.closeProjectButton.enable() self.closeProjectButton.setText(sprintf('Close Project "%s"', self.project.name)) #end if #end def def redirectConsole(self): #pipe = TextPipe(self.inputTextBox.text_area) #sys.stdin = pipe pipe = TextPipe(self.outputTextBox.text_area) sys.stdout = pipe nTmessage.stream = pipe # end def redirectConsole # sys.stderr = pipe def resetConsole(self): #sys.stdin = stdin nTmessage.stream = stdout sys.stdout = stdout sys.stderr = stderr # end def resetConsole def open(self): self.redirectConsole() BasePopup.open(self) # end def open def close(self): geometry = self.getGeometry() self.resetConsole() BasePopup.close(self) print 'close:',geometry sys.exit(0) # remove later # end def close def destroy(self): geometry = self.getGeometry() self.resetConsole() BasePopup.destroy(self) print 'destroy:',geometry sys.exit(0) # remove later
class CingGui(BasePopup): def __init__(self, parent, options, *args, **kw): # Fill in below variable once run generates some results self.haveResults = None # store the options self.options = options BasePopup.__init__(self, parent=parent, title='CING Setup', **kw) # self.setGeometry(850, 750, 50, 50) self.project = None # self.tk_strictMotif( True) self.updateGui() # end def __init__ 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) # end for # end def body def getGuiOptions(self): projectName = self.projEntry.get() index = self.projOptionsSelect.getIndex() if index > 0: makeNewProject = True projectImport = None if index > 1: i = index - 2 format = ['PDB', 'CCPN', 'CYANA'][i] file = [self.pdbEntry, self.ccpnEntry, self.cyanaEntry][i].get() if not file: showWarning('Failure', 'No %s file selected' % format) return # end if projectImport = (format, file) # end if else: # Chould also check that any old project file exists makeNewProject = False projectImport = None # end if doValidation = self.selectDoValidation.get() checks = [] if doValidation: if self.selectCheckAssign.get(): checks.append('assignments') # end if if self.selectCheckResraint.get(): checks.append('restraints') # end if if self.selectCheckStructure.get(): checks.append('structural') # end if if self.selectMakeHtml.get(): checks.append('HTML') # end if if self.selectCheckScript.get(): script = self.validScriptEntry.get() if script: checks.append(('script', script)) # end if # end if if self.selectCheckQueen.get(): checks.append('queen') # end if # end if exports = [] if self.selectExportXeasy.get(): exports.append('Xeasy') # end if if self.selectExportCcpn.get(): exports.append('CCPN') # end if if self.selectExportQueen.get(): exports.append('QUEEN') # end if if self.selectExportRefine.get(): exports.append('refine') # end if miscScript = None if self.selectMiscScript.get(): script = self.miscScriptEntry.get() if script: miscScript = script # end if # end if return projectName, makeNewProject, projectImport, doValidation, checks, exports, miscScript # end def getGuiOptions def runCing(self): options = self.getGuiOptions() if options: projectName, makeNewProject, projectImport, doValidation, checks, exports, miscScript = options print 'Project name:', projectName print 'Make new project?', makeNewProject print 'Import source:', projectImport print 'Do vailidation?', doValidation print 'Validation checks:', ','.join(checks) print 'Export to:', ','.join(exports) print 'User script:', miscScript # end if # end def runCing # else there was already an error message def chooseOldProjectFile(self): fileTypes = [FileType('CING', ['project.xml']), FileType('All', ['*'])] popup = FileSelectPopup(self, file_types=fileTypes, title='Select CING project file', dismiss_text='Cancel', selected_file_must_exist=True) fileName = popup.getFile() # dirName = popup.getDirectory() if len(fileName) > 0: # Put text into entry,name widgets dummy, name = cing.Project.rootPath(fileName) self.projEntry.configure(state='normal') self.projEntry.set(fileName) self.nameEntry.configure(state='normal') self.nameEntry.set(name) self.nameEntry.configure(state='disabled') # choose the correct radiobutton self.projOptionsSelect.setIndex(0) self.updateGui() # end if #nd if popup.destroy() # end def chooseOldProjectFile def choosePdbFile(self): fileTypes = [FileType('PDB', ['*.pdb']), FileType('All', ['*'])] popup = FileSelectPopup(self, file_types=fileTypes, title='PDB file', dismiss_text='Cancel', selected_file_must_exist=True) fileName = popup.getFile() if len(fileName) > 0: # Put text into entry widget self.pdbEntry.configure(state='normal') self.pdbEntry.set(fileName) # Put text into name widget _dir, name, dummy = nTpath(fileName) self.nameEntry.configure(state='normal') self.nameEntry.set(name) # choose the correct radiobutton self.projOptionsSelect.setIndex(1) self.updateGui() #end if popup.destroy() # end def choosePdbFile def chooseCcpnFile(self): fileTypes = [FileType('XML', ['*.xml']), FileType('All', ['*'])] popup = FileSelectPopup(self, file_types=fileTypes, title='CCPN project XML file', dismiss_text='Cancel', selected_file_must_exist=True) fileName = popup.getFile() if len(fileName) > 0: self.pdbEntry.configure(state='normal') self.pdbEntry.set(fileName) self.projOptionsSelect.setIndex(1) _dir, name, dummy = nTpath(fileName) self.nameEntry.set(name) #end if self.ccpnEntry.set(fileName) self.projOptionsSelect.setIndex(2) popup.destroy() # end def chooseCcpnFile def chooseCyanaFile(self): # Prepend default Cyana file extension below fileTypes = [ FileType('All', ['*']), ] popup = FileSelectPopup(self, file_types=fileTypes, title='CYANA fproject file', dismiss_text='Cancel', selected_file_must_exist=True) fileName = popup.getFile() self.cyanaEntry.set(fileName) self.projOptionsSelect.setIndex(3) popup.destroy() # end def chooseCyanaFile def chooseValidScript(self): # Prepend default Cyana file extension below fileTypes = [ FileType('All', ['*']), ] popup = FileSelectPopup(self, file_types=fileTypes, title='Script file', dismiss_text='Cancel', selected_file_must_exist=True) fileName = popup.getFile() self.validScriptEntry.set(fileName) popup.destroy() # end def chooseValidScript def chooseMiscScript(self): # Prepend default Cyana file extension below fileTypes = [ FileType('All', ['*']), ] popup = FileSelectPopup(self, file_types=fileTypes, title='Script file', dismiss_text='Cancel', selected_file_must_exist=True) fileName = popup.getFile() self.miscScriptEntry.set(fileName) popup.destroy() # end def chooseMiscScript def openProject(self): projOption = self.projOptionsSelect.get() if projOption == self.projectOptions[0]: self.openOldProject() elif projOption == self.projectOptions[1]: self.initPdb() # end if if self.project: self.project.gui = self # end if self.updateGui() #end def def openOldProject(self): fName = self.projEntry.get() if not os.path.exists(fName): nTerror('Error: file "%s" does not exist\n', fName) #end if if self.project: self.closeProject() # end if self.project = cing.Project.open(name=fName, status='old', verbose=False) #end def def initPdb(self): fName = self.pdbEntry.get() if not os.path.exists(fName): nTerror('Error: file "%s" does not exist\n', fName) #end if self.project = cing.Project.open(self.nameEntry.get(), status='new') self.project.initPDB(pdbFile=fName, convention='PDB') #end def def closeProject(self): if self.project: self.project.close() # end if self.project = None self.updateGui() #end def def updateGui(self, event=None): projOption = self.projOptionsSelect.get() buttons = self.buttonBar.buttons # Disable entries for e in [ self.projEntry, self.pdbEntry, self.ccpnEntry, self.cyanaEntry, self.nameEntry ]: e.configure(state='disabled') #end for if projOption == self.projectOptions[0]: # Enable entries self.projEntry.configure(state='normal') if (len(self.projEntry.get()) > 0): self.openProjectButton.enable() self.runButton.enable() else: self.openProjectButton.disable() self.runButton.disable() #end if elif projOption == self.projectOptions[1]: # Enable entries self.pdbEntry.configure(state='normal') self.nameEntry.configure(state='normal') if (len(self.pdbEntry.get()) > 0 and len(self.nameEntry.get()) > 0): buttons[0].enable() buttons[1].enable() else: buttons[0].disable() buttons[1].disable() #end if #end if elif projOption == self.projectOptions[2]: # Enable entries self.ccpnEntry.configure(state='normal') self.nameEntry.configure(state='normal') if (len(self.ccpnEntry.get()) > 0 and len(self.nameEntry.get()) > 0): buttons[0].enable() buttons[1].enable() else: buttons[0].disable() buttons[1].disable() #end if #end if elif projOption == self.projectOptions[3]: # Enable entries self.cyanaEntry.configure(state='normal') self.nameEntry.configure(state='normal') if (len(self.cyanaEntry.get()) > 0 and len(self.nameEntry.get()) > 0): buttons[0].enable() buttons[1].enable() else: buttons[0].disable() buttons[1].disable() #end if #end if self.projectStatus.clear() if not self.project: self.projectStatus.setText('No open project') self.closeProjectButton.setText('Close Project') self.closeProjectButton.disable() else: self.projectStatus.setText(self.project.format()) self.closeProjectButton.enable() self.closeProjectButton.setText( sprintf('Close Project "%s"', self.project.name)) #end if #end def def redirectConsole(self): #pipe = TextPipe(self.inputTextBox.text_area) #sys.stdin = pipe pipe = TextPipe(self.outputTextBox.text_area) sys.stdout = pipe nTmessage.stream = pipe # end def redirectConsole # sys.stderr = pipe def resetConsole(self): #sys.stdin = stdin nTmessage.stream = stdout sys.stdout = stdout sys.stderr = stderr # end def resetConsole def open(self): self.redirectConsole() BasePopup.open(self) # end def open def close(self): geometry = self.getGeometry() self.resetConsole() BasePopup.close(self) print 'close:', geometry sys.exit(0) # remove later # end def close def destroy(self): geometry = self.getGeometry() self.resetConsole() BasePopup.destroy(self) print 'destroy:', geometry sys.exit(0) # remove later
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)
class BlackledgeModuleFrame(Frame): """ Frame for handling MODULE calculation. Note that the frame uses (or creates) an NmrCalcStore named 'BLACKLEDGE_MODULE' and linked to the current NmrProject. """ 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) # END GUI CODE ########################################################################### ########################################################################### # FUNCTIONS CALLED FROM GUI ################ # OS interaction def selectExecutable(self): """ Choose the MODULE executable appropriate for your system. """ popup = FileSelectPopup(self, show_file=True) executable = popup.getFile() if executable: self.moduleExeEntry.set(executable) popup.destroy() def executeModule(self): """ Execute MODULE with all given parameters Yeah it's a big function, bite me :-P """ # check that all params have been set if not os.path.isfile(self.moduleExePath): popup = showWarning('MODULE', 'Cannot find MODULE executable.', parent=self) return if self.inputStructure is None: popup = showWarning( 'MODULE', 'MODULE cannot run with out a structure for input.', parent=self) return if self.inputRdcConstraintList is None: popup = showWarning( 'MODULE', 'MODULE cannot run with out an RDC constraint list for input.', parent=self) return # write temp PDB file strucTempFile = tempfile.NamedTemporaryFile(mode='w', suffix='.pdb', dir=self.moduleTempDir, delete=False) strucTempFile.close() makePdbFromStructure(strucTempFile.name, self.inputStructure.structureEnsemble, model=self.inputStructure) # write temp RDC file rdcTempFile = tempfile.NamedTemporaryFile(mode='w', suffix='.tab', dir=self.moduleTempDir, delete=False) moduleIo.writeConstraintList(rdcTempFile, self.inputRdcConstraintList) rdcTempFile.close() # command to be executed (to start MODULE) moduleCommands = [ self.moduleExePath, strucTempFile.name, rdcTempFile.name ] # if user has set Distance constraint list then fill add this (user optional) if self.inputDistanceConstraintList: distanceTempFile = tempfile.NamedTemporaryFile( mode='w', suffix='.tab', dir=self.moduleTempDir, delete=False) moduleIo.writeConstraintList(distanceTempFile, self.inputDistanceConstraintList) distanceTempFile.close() moduleCommands.append(distanceTempFile.name) # execute MODULE moduleOutput = subprocess.Popen( moduleCommands, stdout=subprocess.PIPE).communicate()[0] # clean out the blank lines for line in moduleOutput: if line == '': moduleOutput.pop(line) # send the output to our screen self.moduleOutputText.setState(state=Tkinter.NORMAL) self.moduleOutputText.setText(text=moduleOutput) self.moduleOutputText.setState(state=Tkinter.DISABLED) # clean up temp files (delete has been set to False) for tempFile in [strucTempFile.name, rdcTempFile.name]: if os.path.isfile(tempFile): os.unlink(tempFile) if self.inputDistanceConstraintList: if os.path.isfile(distanceTempFile.name): os.unlink(distanceTempFile.name) # create new run and store inputs self.newRun() self.updateRunInputs() ############################################################################ # Outputs: ############################ # Import MODULE PDB def findModuleExportPdbFile(self): """ Find the MODULE PDB export file, typically called temp%s.pdb unless user has renamed it. """ modulePdbFileGood = False def yes(): modulePdbFileGood = True def cancel(): modulePdbFileGood = False # MODULE writes pdb files to CWD no matter where you or it is possibleFiles = glob.glob(os.path.join(os.getcwd(), 'temp*')) # debug # possibleFiles = glob.glob( os.path.join( os.getcwd(), 'module', 'temp*' ) ) if len(possibleFiles) == 1: if os.path.isfile(possibleFiles[0]): texts = ['Yes', 'No, choose another PDB file', 'Cancel'] objects = [yes, self.selectModulePdbExport, cancel] func = showMulti('MODULE', 'Is this the PDB strcture you exported from MODULE?\n%s' % possibleFiles[0], \ texts=texts, objects=objects, parent=self) func() if modulePdbFileGood == True: modulePdbFile = possibleFiles[0] else: return None else: modulePdbFile = self.selectModulePdbExport() elif len(possibleFiles) > 1: texts = ['%s' % fileName for fileName in possibleFiles] objects = ['%s' % fileName for fileName in possibleFiles] modulePdbFile = showMulti('MODULE', 'Multiple possible MODULE export\nfiles found, please select one:' % possibleFiles, \ texts=texts, objects=objects, parent=self) if os.path.isfile(modulePdbFile): modulePdbFile = modulePdbFile else: modulePdbFile = self.selectModulePdbExport() return modulePdbFile def selectModulePdbExport(self): """ Choose the PDB file that was exported from MODULE. """ file_types = [ FileType("PDB structure files", ["*.pdb"]), FileType("All files", ["*"]) ] popup = FileSelectPopup(self, file_types, dismiss_text='Cancel', show_file=True) chosenPdbFile = popup.getFile() if os.path.isfile(chosenPdbFile): modulePdbFile = chosenPdbFile else: warnPopup = showWarning('MODULE', 'File %s not found.' % chosenPdbFile, parent=self) return None popup.destroy() return modulePdbFile def importModuleStructure(self): """ Find MODULE structure file and import into Analysis (or attempt to, this will probably barf as MODULE pdb files are not good) """ modulePdbFile = self.findModuleExportPdbFile() if not modulePdbFile: return # this stores the re-hacked MODULE pdb file and then removes it on close tempPdb = tempfile.NamedTemporaryFile(mode='w', suffix='.pdb', dir=self.moduleTempDir, delete=False) tempPdb.close() # if file found then add to project if os.path.isfile(modulePdbFile): moduleIo.BlackledgeToPdbConverter(modulePdbFile, tempPdb) structure = getStructureFromFile( self.inputStructure.parent.molSystem, tempPdb) os.unlink(tempPdb) ############################ # Import MODULE Back Values def findModuleExportBackValuesFile(self): """ Find the Back Values file that the User hopefully exported from MODULE """ def yes(): moduleBvFileGood = True def cancel(): moduleBvFileGood = False # back value files are helpfully appended '*.back' possibleFiles = glob.glob(os.path.join(os.getcwd(), '*.back')) possibleFiles += glob.glob(os.path.join(self.moduleTempDir, '*.back')) if len(possibleFiles) == 1: if os.path.isfile(possibleFiles[0]): texts = [ 'Yes', 'No, choose another Back Values file', 'Cancel' ] objects = [yes, self.selectModuleBvExport, cancel] func = showMulti('MODULE', 'Is this the Back Values file that you exported from MODULE?\n%s' % possibleFiles[0], \ texts=texts, objects=objects, parent=self) func() if moduleBvFileGood == True: moduleBackValueFile = possibleFiles[0] else: return None else: moduleBackValueFile = self.selectModuleBvExport() elif len(possibleFiles) > 1: texts = ['%s' % fileName for fileName in possibleFiles] objects = ['%s' % fileName for fileName in possibleFiles] chosenBvFile = showMulti('MODULE', 'Multiple possible MODULE Back Value\nfiles found, please select one:' % possibleFiles, \ texts=texts, objects=objects, parent=self) if os.path.isfile(modulePdbFile): moduleBackValueFile = chosenBvFile else: moduleBackValueFile = self.selectModuleBvExport() return moduleBackValueFile def selectModuleBvExport(self): """ Choose the Back Value file that was exported from MODULE. """ file_types = [ FileType("Back Value files", ["*.back"]), FileType("All files", ["*"]) ] popup = FileSelectPopup(self, file_types, dismiss_text='Cancel', show_file=True) chosenBvFile = popup.getFile() if os.path.isfile(chosenBvFile): moduleBackValueFile = chosenBvFile else: warnPopup = showWarning('MODULE', 'File %s not found.' % chosenBvFile, parent=self) return None popup.destroy() return moduleBackValueFile def importModuleBackValues(self): """ Attempt to find the Back Values file and then import it ... """ # find the Back Values file or ask user backValFile = self.findModuleExportBackValuesFile() if not backValFile: return # create a new RDC list if self.project: nmrConstraintStore = self.project.newNmrConstraintStore( nmrProject=self.project.findFirstNmrProject()) if self.inputStructure: chain = self.inputStructure.parent.molSystem.findFirstChain() else: chain = None if nmrConstraintStore and chain: rdcList = moduleIo.getBackValuesListFromFile( backValFile, chain, nmrConstraintStore) # rdcRawData = moduleIo.getRawBackValuesFromFile( backValFile ) # # for run in runs: # runText.append( [run.getSerial(), run.getDetails(), run.getStatus()] ) self.rdcOutputTable.update(objectList=None, textMatrix=None) # end OS interaction #################### ################################## # get, set and update menu options def changeInputRun(self, run): self.run = run def changeInputStructure(self, structure): self.inputStructure = structure def changeInputRdcConstraintList(self, constraintList): self.inputRdcConstraintList = constraintList def changeInputDistanceConstraintList(self, constraintList): self.inputDistanceConstraintList = constraintList def changeInputConstraintList(self, constraintList, className): if className == 'RdcConstraintList': self.changeInputRdcConstraintList(constraintList) elif className == 'DistanceConstraintList': self.changeInputDistanceConstraintList(constraintList) def getInputConstraintList(self, className): if className == 'RdcConstraintList': return self.inputRdcConstraintList elif className == 'DistanceConstraintList': return self.inputDistanceConstraintList # end get and set ################################## #################### # NMR Calc runs etc. def loadRun(self): pass def deleteRun(self): pass def changeRun(self): pass def newRun(self): if self.calcStore: self.run = self.calcStore.newRun(status='provisional') def updateRunInputs(self, event=None): self.inputUserDescriptionText = self.moduleUserText.getText() or None # store input parameters in run if self.run: # set the path to the MODULE executable used setRunTextParameter(self.run, MODULE_EXE, self.moduleExePath) # set the input structure sent to MODULE sEnsemble = self.inputStructure.StructureEnsemble self.run.newStructureEnsembleData(sEnsemble.ensembleId, sEnsemble.molSystem.code, name=STRUCTURE_DATA, ioRole=INPUT) # set the input RDC constraint list rdcConst = self.inputRdcConstraintList self.run.newConstraintStoreData(rdcConst.nmrConstraintStore.serial, name=RDC_CONSTRAINT_DATA, ioRole=INPUT) # set the input RDC constraint list (optional) distConst = self.inputDistanceConstraintList if distConst: self.run.newConstraintStoreData( distConst.nmrConstraintStore.serial, name=DIST_CONSTRAINT_DATA, ioRole=INPUT) # set the input user data (if any) setRunTextParameter(self.run, USER_DESCRIPTION_DATA, self.inputUserDescriptionText) def editRunNotes(self): pass # end NMR calc stuff #################### ###################### # update and noitfiers def administerNotifiers(self, notifyFunc): for func in ['__init__', 'delete']: for clazz in ['RdcConstraintList', 'DistanceConstraintList']: notifyFunc(self.updateAfter, 'ccp.nmr.NmrConstraint.' + clazz, func) notifyFunc(self.updateAfter, 'ccp.nmr.NmrCalc.Run', func) def destroy(self): self.administerNotifiers(self.parent.unregisterNotify) Frame.destroy(self) def updateAll(self): # tab A self.updateModuleExecutablePath() self.updateInputStructure() self.updateInputRdcConstraintList() self.updateInputDistanceConstraintList() # tab C self.updateInputRuns() self.waiting = False def updateAfter(self, obj=None): if self.waiting: return else: self.waiting = True self.after_idle(self.updateAll) def updateInputRuns(self): if self.calcStore: runs = [ r for r in self.calcStore.sortedRuns() if r.status == PROVISIONAL ] if not runs: self.newRun() runs = [self.run] runText = [] for run in runs: runText.append( [run.getSerial(), run.getDetails(), run.getStatus()]) self.runTable.update(objectList=runs, textMatrix=runText) def updateModuleExecutablePath(self): self.moduleExePath = self.moduleExeEntry.get() def updateInputStructure(self): index = None # names = ['<None>'] # structures = [None] names = [] structures = [] for molSystem in self.project.sortedMolSystems(): for ensemble in molSystem.sortedStructureEnsembles(): for structure in ensemble.sortedModels(): structures.append(structure) if structures: for i, model in enumerate(structures): if model is None: continue ee = model.structureEnsemble name = '%s:%d:%d' % (ee.molSystem.code, ee.ensembleId, model.serial) names.append(name) if self.inputStructure not in structures: self.changeInputStructure(structures[0]) index = structures.index(self.inputStructure) else: self.inputStructure = None self.inputStructurePulldown.setup(names, structures, index or -1) def updateInputConstraintList(self, className, obj=None): index = None # if DistanceConstraintList then None must be an option # names = ['<None>'] # constraintLists = [None] if className == 'DistanceConstraintList': names = ['<None>'] constraintLists = [None] else: names = [] constraintLists = [] for nmrConstraintStore in self.parent.project.sortedNmrConstraintStores( ): for constraintList in nmrConstraintStore.sortedConstraintLists(): if not className or constraintList.className == className: constraintLists.append(constraintList) if constraintLists: for constList in constraintLists: if constList is None: continue store = constList.nmrConstraintStore name = '%d:%d' % (store.serial, constList.serial) names.append(name) if self.getInputConstraintList(className) not in constraintLists: self.changeInputConstraintList(constraintLists[0], className) index = constraintLists.index( self.getInputConstraintList(className)) else: self.changeInputConstraintList(None, className) if className == 'RdcConstraintList': self.inputRdcConstraintsPulldown.setup(names, constraintLists, index or -1) elif className == 'DistanceConstraintList': self.inputDistanceConstraintsPulldown.setup( names, constraintLists, index or -1) def updateInputRdcConstraintList(self): self.updateInputConstraintList('RdcConstraintList') def updateInputDistanceConstraintList(self): self.updateInputConstraintList('DistanceConstraintList')
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)
class PalesFrame(Frame): """ Frame for handling PALES calculation. Note that the frame uses (or creates) an NmrCalcStore named 'PALES' and linked to the current NmrProject. """ 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 updatePalesOptions(self): palesMode = self.palesMode dd = palesModes.get(palesMode) # NBNB TBD def resetCalcStore(self, calcStore=None): """ Reset self.calcStore if missing or deleted """ if calcStore is None or calcStore is self.calcStore: nmrProject = self.nmrProject calcStore = self.project.findFirstNmrCalcStore( nmrProject=nmrProject, name='PALES') if calcStore is None: calcStore = self.project.newNmrCalcStore( nmrProject=self.nmrProject, name='PALES') if self.calcStore is not calcStore: self.calcStore = calcStore if self.run is not None: self.run = None self.updateAfter() def selectWorkingDir(self): popup = FileSelectPopup(self, show_file=False) directory = popup.getDirectory() if directory: self.workingDirEntry.set(directory) popup.destroy() self.updateAfter() def changeDetails(self, event): if self.run: value = self.detailsEntry.get().strip() or None if value != self.run.details: self.run.details = value def changeDetailsIn(self, event): if self.run: value = self.detailsEntryIn.get().strip() or None if value != self.run.details: self.run.details = value def updateDetails(self): if self.run: text = self.run.details else: text = '' self.detailsEntry.set(text) self.detailsEntryIn.set(text) def changePalesMode(self, mode): if mode and (mode is not self.palesMode): run = self.run if runIsEditable(run): palesModeObj = run.findFirstRunParameter(name='Pales Mode') if palesModeObj is None: palesModeObj = run.newRunParameter(name='Pales Mode', ioRole='input') palesModeObj.textValue = mode self.palesMode = mode self.initialiseRun() self.updateAfter() def updatePalesModes(self, obj=None): names = [] index = 0 modes = [] for tag in palesModeList: modeInfo = palesModes[tag] names.append(modeInfo['text']) modes.append(tag) if obj is not None: mode = obj else: mode = self.palesMode try: index = modes.index(mode) except ValueError: index = 0 self.palesMode = modes[index] self.palesModePulldown.setup(names, modes, index) tag = modes[index] self.modeDescription.set(palesModes[tag].get('info')) def copyRun(self): # TBD: Inputs only? if self.run: self.configure(cursor="watch") run = copySubTree(self.run, self.calcStore) run.status = 'provisional' # remove output for data in run.findAllData(ioRole='output'): data.delete() for parObj in run.findAllRunParameters(ioRole='output'): parObj.delete() self.run = run self.updateAfter() self.after_idle(lambda: self.configure(cursor="")) def newRun(self): if self.calcStore: self.run = self.calcStore.newRun(status='provisional') self.initialiseRun() self.updateAfter() def initialiseRun(self): """ Create objects for known parameters """ print '### initialiseRun', self.run and runIsEditable(self.run) run = self.run if run is None or not runIsEditable(run): return # set up tag = self.palesMode modeData = palesModes[tag] currentTags = set(modeData['fixedpar'] + modeData['mandatories'] + modeData['optionals']) # set palesMode if missing self.updatePalesModes() # remove parameters no longer needed for obj in run.runParameters: if obj.name not in currentTags: obj.delete() for obj in run.data: if obj.name not in currentTags: obj.delete() self.inputMatrix.updateGeneric(run=run, paramList=(modeData['fixedpar'] + modeData['mandatories'])) self.extraInputMatrix.updateGeneric(run=run, paramList=modeData['optionals']) for ii, name in enumerate(modeData['fixedpar']): value = modeData['fixedvalues'][ii] code, parType, default, info = progParameters[name] self.inputMatrix.setupRunObject(run, name, code, parType, default, info, value=value) def getPalesOptions(self): run = self.run if run is None: return palesMode = self.palesMode return 'NBNB TBD' def changeRun(self, run): print '### changeRun', self.run, run if run and (run is not self.run): self.run = run self.updateAfter() def deleteRun(self): if self.run: msg = 'Really delete calculation run %d?' % self.run.serial if showOkCancel('Query', msg, parent=self): self.run.delete() self.run = None self.updateAfter() def updateRunsAfter(self, obj=None): print '### updateRunsAfter', obj, self.waiting if self.waiting: return else: self.waiting = True self.after_idle(self.updateRuns) def updateRunDataAfter(self, obj=None): print '### updateRunDataAfter', obj if obj is None: run = None else: run = obj.run self.updateRunAfter(run=run) def updateRunAfter(self, run=None): """ update all if run is curent run, otherwise update run pulldown only """ print '### updateRunAfter', run, self.waiting if self.waiting: return elif run is None: return elif run is self.run: self.waiting = True self.after_idle(self.update) else: self.waiting = True self.after_idle(self.updateRuns) def updateAfter(self, obj=None): if self.waiting: return self.waiting = True self.configure(cursor="watch") self.after_idle(self.update) def updateRuns(self, run=None): """ Update run pulldown only """ print '### updateRuns', run names = [] index = 0 runs = [] run = self.run if self.calcStore is None or self.calcStore.isDeleted: self.resetCalcStore() runs = self.calcStore.sortedRuns() if runs: if run not in runs: run = runs[-1] index = runs.index(run) names = [] for r in runs: if runIsEditable(r): names.append('%d' % r.serial) else: names.append('%d (uneditable)' % r.serial) else: run = None if run is not self.run: self.changeRun(run) print '###', names, runs, index self.runPulldown.setup(names, runs, index) self.waiting = False def update(self, obj=None): print '### update', self.run self.updateRuns(obj) run = self.run if run is None: palesMode = self.palesMode = None self.palesOptionsLabel.set('') for label in self.outputTensorLabels: label.set('<None>') self.palesOutputText.setText() else: # Pales command NBNB TBD #valueObj = run.findFirstRunParameter(code='command') #if valueObj is None: # self.palesCommandLabel.set('') #else: # self.palesCommandLabel.set(valueObj.textValue) palesModeObj = run.findFirstRunParameter(ioRole='input', name='Pales Mode') if palesModeObj is None: palesMode = None else: palesMode = palesModeObj.textValue # Output orientation matrix keywords = ('dAxialOut', 'dRhombicOut', 'psiOut', 'phiOut', 'thetaOut') for ii, label in enumerate(self.outputTensorLabels): keyword = keywords[ii] valueObj = run.findFirstRunParameter(code=keyword, ioRole='output') if valueObj is None: label.set('<None>') else: label.set(valueObj.floatValue) # Pales output text valueObj = run.findFirstRunParameter(ioRole='output', name='Output Text') if valueObj: self.palesOutputText.setText(valueObj.textValue) else: self.palesOutputText.setText() self.updatePalesModes(palesMode) self.palesOptionsLabel.set(self.getPalesOptions()) #self.updateInputMatrix() #self.updateExtraInputMatrix() #self.updateOutputMatrix() self.inputMatrix.updateGeneric() self.extraInputMatrix.updateGeneric() self.outputMatrix.updateGeneric() self.updateDetails() self.after_idle(lambda: self.configure(cursor="")) self.waiting = False def administerNotifiers(self, notifyFunc): notifyFunc(self.updateRunsAfter, 'ccp.nmr.NmrCalc.NmrCalcStore', 'delete') notifyFunc(self.updateRunsAfter, 'ccp.nmr.NmrCalc.Run', '__init__') notifyFunc(self.updateRunAfter, 'ccp.nmr.NmrCalc.Run', 'delete') notifyFunc(self.updateRunAfter, 'ccp.nmr.NmrCalc.Run', 'setDetails') NC = 'ccp.nmr.NmrCalc.' nmrCalcClasses = [ 'RunParameter', 'EnergyTerm', 'ConstraintStoreData', 'ViolationListData', 'MolSystemData', 'MolResidueData', 'SpectrumData', 'PeakListData', 'SpinSystemData', 'StructureEnsembleData', 'ExternalData', 'FloatMatrixData', 'TensorData', 'MeasurementListData', 'DerivedListData', ] for clazz in nmrCalcClasses: notifyFunc(self.updateRunDataAfter, NC + clazz, '') def destroy(self): self.administerNotifiers(self.parent.unregisterNotify) Frame.destroy(self) def executePales(self): # NBNB TBD pass def viewPalesData(self): # NBNB TBD valueObj = self.outputMatrix if isinstance(valueObj, NmrCalc.ExternalData): dataStore = valueObj.dataStore if dataStore is not None: wb = WebBrowser(self, name='PalesData') wb.open(dataStore.fullPath) elif isinstance(valueObj, NmrCalc.MeasurementListData): mm = valueObj.measurementList if mm is not None: popup = self.parent.editMeasurementLists() popup.tabbedFrame.select(1) popup.setMeasurementList(mm) elif isinstance(valueObj, NmrCalc.StructureEnsembleData): models = valueObj.models if len(models) == 1: popup = self.parent.editStructures() popup.tabbedFrame.select(3) popup.changeModel(models[0]) popup.changeTab(3) elif isinstance(valueObj, NmrCalc.ConstraintStoreData): constraintLists = valueObj.constraintLists if len(constraintLists) == 1: popup = self.parent.browseConstraints() popup.tabbedFrame.select(2) popup.changeRestraintList(constraintLists[0])