def __init__(self, parent, toggledDict, untoggledDict, command=None, toggled=False, docKey=None, tipText=None, *args, **kw): Button.__init__(self, parent, docKey=docKey, tipText=tipText, *args, **kw) self.parent = parent self.toggledDict = toggledDict self.untoggledDict = untoggledDict self.command = command self.toggled = toggled self.config(command=self.callback) self.callback(True)
def __init__(self, guiParent, basePopup, borderRelief='raised', text=' ', justify='left', width=None, font=None, height=None, *args, **kw): # Base popup required to handle notification of data model changes # e.g. new peak lists, so that the GUI can update to the latest # state self.basePopup = basePopup self.guiParent = guiParent self.borderRelief = borderRelief self.text = text self.justify = justify self.width = width self.font = font self.height = height self.registerNotify = basePopup.registerNotify self.unregisterNotify = basePopup.unregisterNotify LabelFrame.__init__(self, guiParent, borderRelief, text, justify, width, font, height, *args, **kw) # set up the grid self.grid_columnconfigure(0, weight=0, minsize=20) self.grid_rowconfigure(0, weight=0, minsize=5) self.grid_rowconfigure(1, weight=0, minsize=10) self.grid_rowconfigure(2, weight=0, minsize=10) self.grid_rowconfigure(3, weight=0, minsize=10) # build up the body. self.nameLabel = Label(self, text='Exp Type:') self.nameLabel.grid(row=1, column=0, padx=2, sticky='nw') self.nameText = Text(self, width=15, height=1) self.nameText.grid(row=1, column=1, sticky='nw') self.clearButton = Button(self, text='Clear', command=self.clear_filter, width=7, height=1) self.clearButton.grid(row=2, column=0, columnspan=2, sticky='nw') self.filterButton = Button(self, text='Go', command=self.tmpCall, width=7, height=1) self.filterButton.grid(row=2, column=1, columnspan=2, sticky='ne')
def __init__(self, parent, peakList): apply(Frame.__init__, (self, parent) ) #parent.grid_columnconfigure(0, weight=1) #parent.grid_rowconfigure(1, weight=1) #self.grid_columnconfigure(1, weight=1) #self.grid_columnconfigure(2, weight=1) self.parent = parent self.peakList = peakList self.specLabel = Label(self, text='Spectrum: ' ) self.listLabel = Label(self, text='Peak List: ' ) self.dimLabel = Label(self, text='Dimension' ) self.adjustLabel = Label(self, text='Adjustment') self.specLabel.grid(row = 0, column = 0, columnspan=2, sticky='nsew') self.listLabel.grid(row = 0, column = 2, columnspan=1, sticky='nsew') self.dimLabel.grid(row = 1, column = 0, columnspan=1, sticky='nsew') self.adjustLabel.grid(row = 1, column = 1, columnspan=2, sticky='nsew') self.goButton = Button(self, text='Go!', command=self.go, tipText='Commit the re-referencing adjustment') self.clearButton = Button(self, text='Clear', command=self.update, tipText='Clear the input re-referencing values') self.cancelButton = Button(self, text='Cancel', command=self.close, tipText='Abort operation without making any changes') self.update()
def body(self, master): self.geometry('600x130') master.grid_columnconfigure(1, weight=1) for n in range(5): master.grid_rowconfigure(n, weight=1) row = 0 label = Label(master, text='Spectrum: ') label.grid(row=row, column=0, sticky='e') tipText = 'The spectrum for which the contour file is being added' self.expt_spectrum = PulldownList(master, callback=self.updateContourDir, tipText=tipText) self.expt_spectrum.grid(row=row, column=1, sticky='w') row = row + 1 tipText = 'The location of the directory where contour files are stored on disk' label = Label(master, text='Contour dir: ') label.grid(row=row, column=0, sticky='e') self.dir_label = Label(master, text='', tipText=tipText) self.dir_label.grid(row=row, column=1, sticky='w') row = row + 1 label = Label( master, text= '(file will be copied into Contour dir if it is not already in there)' ) label.grid(row=row, column=1, sticky='w') row = row + 1 tipText = 'Browse for a file store contour data' button = Button(master, text='File name: ', command=self.selectFile, tipText=tipText) button.grid(row=row, column=0, sticky='e') tipText = 'Enter the name of the file to store contour data' self.file_entry = Entry(master, tipText=tipText) self.file_entry.grid(row=row, column=1, sticky='ew') row = row + 1 texts = ['Add File'] commands = [self.addFile] tipTexts = [ 'Use the selected contour file in the current project, copying it to the contour directory if required', ] self.buttons = UtilityButtonList(master, texts=texts, doClone=False, tipTexts=tipTexts, commands=commands, helpUrl=self.help_url) self.buttons.grid(row=row, column=0, columnspan=2, sticky='ew') self.curateNotifiers(self.registerNotify) self.updateSpectrum()
def __init__(self, guiParent, basePopup): # Base popup required to handle notification of data model changes # e.g. new peak lists, so that the GUI can update to the latest # state self.basePopup = basePopup self.guiParent = guiParent self.registerNotify=basePopup.registerNotify self.unregisterNotify=basePopup.unregisterNotify Frame.__init__(self, guiParent) # set up the grid self.grid_columnconfigure(0, weight=1, minsize=10) self.grid_columnconfigure(1, weight=0, minsize=10) self.grid_columnconfigure(2, weight=0, minsize=20) self.grid_columnconfigure(3, weight=1, minsize=10) self.grid_rowconfigure(0, weight=1, minsize=5) self.grid_rowconfigure(1, weight=0, minsize=10) self.grid_rowconfigure(2, weight=0, minsize=10) self.grid_rowconfigure(3, weight=0, minsize=10) self.grid_rowconfigure(4, weight=1, minsize=5) # build up the body. # Column headers self.user_label = Label(self,text='Username:'******'w') self.user_value = Text(self, width=20, height=1, text="") self.user_value.grid(row=1, column=2, padx=5, pady=5, sticky='w') self.pswd_label = Label(self,text='Password:'******'w') self.pswd_value = Text(self, width=20, height=1, text="") self.pswd_value.grid(row=2, column=2, padx=5, pady=5, sticky='w') self.cancel_button = Button(self, width=10, height=1, text="Cancel", command=self.quit ) self.cancel_button.grid(row=3, column=1, padx=5, pady=5, sticky='e') self.login_botton = Button(self, width=10, height=1, text="Login", command=self.login ) self.login_botton.grid(row=3, column=2, padx=5, pady=5, sticky='w')
def body(self, guiParent): guiParent.grid_columnconfigure(0, weight=1) row = 0 guiParent.grid_rowconfigure(row, weight=1) inputFrame = LabelFrame(guiParent, text='Inputs:') inputFrame.grid(row=row, column=0, sticky=Tkinter.NSEW) label = Label(inputFrame, text='NOESY:') label.grid(row=0, column=0, sticky=Tkinter.NW) self.hNoesyPulldown = PulldownMenu(inputFrame,callback=self.setHNoesy) self.hNoesyPulldown.grid(row=0, column=1, sticky=Tkinter.NW) label = Label(inputFrame, text='15N NOESY:') label.grid(row=1, column=0, sticky=Tkinter.NW) self.nNoesyPulldown = PulldownMenu(inputFrame,callback=self.setNNoesy) self.nNoesyPulldown.grid(row=1, column=1, sticky=Tkinter.NW) label = Label(inputFrame, text='13C NOESY:') label.grid(row=2, column=0, sticky=Tkinter.NW) self.cNoesyPulldown = PulldownMenu(inputFrame,callback=self.setCNoesy) self.cNoesyPulldown.grid(row=2, column=1, sticky=Tkinter.NW) label = Label(inputFrame, text='Shift List:') label.grid(row=3, column=0, sticky=Tkinter.NW) self.shiftListPulldown = PulldownMenu(inputFrame,callback=self.setShiftList) self.shiftListPulldown.grid(row=3, column=1, sticky=Tkinter.NW) label = Label(inputFrame, text='2d BACUS executable:') label.grid(row=4, column=0, sticky=Tkinter.NW) self.executableEntry = Entry(inputFrame, text='/home/tjs23/clouds/justin/SpiBacusMidge/bacus/bacus_tjs.exe') self.executableEntry.grid(row=4, column=1, sticky=Tkinter.NW) self.executableButton = Button(inputFrame, text='Choose file', command=self.chooseExecutable) self.executableButton.grid(row=5, column=1, sticky=Tkinter.EW) row += 1 outputFrame = LabelFrame(guiParent, text='Output:') outputFrame.grid(row=row, column=0, sticky=Tkinter.NSEW) row += 1 texts = ['Run BACUS 2d','Run BACUS 3d'] commands = [self.runBacus,self.runBacus3d] self.bottomButtons = createDismissHelpButtonList(guiParent,texts=texts,commands=commands,expands=0,help_url=None) self.bottomButtons.grid(row=row, column=0, sticky=Tkinter.EW) self.update()
def __init__(self, parent, arrowSize = 12, outline='#5050b0', fill='#a0a0ff', font=None, isArrowClosed = True, callback = None, text = '', *args, **kw): apply(Frame.__init__, (self, parent) + args, kw) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(1, weight=1) self.arrow = ToggleArrow(self, arrowSize=arrowSize, outline=outline, fill=fill, isArrowClosed=isArrowClosed, callback=callback) self.arrow.grid(row=0, column=0, sticky=Tkinter.W) if font: self.label = Button(self, relief='flat',borderwidth=0, padx=1, pady=1, text=text, font=font, command=self.arrow.flipState) else: self.label = Button(self, relief='flat',borderwidth=0, padx=1, pady=1, text=text, command=self.arrow.flipState) self.label.grid(row=0, column=1, sticky=Tkinter.W)
def __init__(self, parent, *args, **kw): apply(Frame.__init__, (self, parent) + args, kw) button = Button(self, text='close', command=parent.close) button.pack(side=Tkinter.LEFT) button = Button(self, text='iconify', command=parent.iconify) button.pack(side=Tkinter.LEFT)
def body(self, master): master.grid_columnconfigure(2, weight=1) row = 0 label = Label(master, text='Data to export:') label.grid(row=row, column=0, columnspan=3, sticky=Tkinter.W) self.check_buttons = {} i = 0 for heading in self.headings: row = row + 1 isSelected = self.exportSelection.get(row, True) self.check_buttons[i] = c = CheckButton( master, selected=isSelected, callback=self.toggleCheckButton) c.grid(row=row, column=1) label = Label(master, text=heading) label.grid(row=row, column=2, sticky=Tkinter.W) i += 1 row = row + 1 button = Button(master, text='File:', command=self.findFile) button.grid(row=row, column=0, sticky=Tkinter.W) self.file_entry = Entry(master, text=self.file, width=30) self.file_entry.grid(row=row, column=1, columnspan=2, sticky=Tkinter.EW) row = row + 1 label = Label(master, text='Format:') label.grid(row=row, column=0, sticky=Tkinter.W) self.format_menu = PulldownMenu(master, entries=exportFormats) self.format_menu.grid(row=row, column=1, columnspan=2, sticky=Tkinter.W) row = row + 1 master.grid_rowconfigure(row, weight=1) texts = ['Save'] commands = [self.ok] buttons = createDismissHelpButtonList(master, texts=texts, commands=commands, dismiss_text='Cancel') buttons.grid(row=row, column=0, columnspan=3, sticky=Tkinter.EW)
def body(self, master): label = Tkinter.Label(master, text='label 1') label.grid(row=0, column=0, sticky=Tkinter.EW) label = Tkinter.Label(master, text='label 2') label.grid(row=1, column=0, sticky=Tkinter.EW) button = Button(master, text='ok', command=self.ok) button.grid(row=2, column=0, sticky=Tkinter.EW) button = Button(master, text='cancel', command=self.close) button.grid(row=2, column=1, sticky=Tkinter.EW)
class ToggleLabel(Frame): def __init__(self, parent, arrowSize = 12, outline='#5050b0', fill='#a0a0ff', font=None, isArrowClosed = True, callback = None, text = '', *args, **kw): apply(Frame.__init__, (self, parent) + args, kw) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(1, weight=1) self.arrow = ToggleArrow(self, arrowSize=arrowSize, outline=outline, fill=fill, isArrowClosed=isArrowClosed, callback=callback) self.arrow.grid(row=0, column=0, sticky=Tkinter.W) if font: self.label = Button(self, relief='flat',borderwidth=0, padx=1, pady=1, text=text, font=font, command=self.arrow.flipState) else: self.label = Button(self, relief='flat',borderwidth=0, padx=1, pady=1, text=text, command=self.arrow.flipState) self.label.grid(row=0, column=1, sticky=Tkinter.W) def arrowOn(self): if self.arrow.isArrowClosed: self.arrow.isArrowClosed = 0 self.arrow.drawArrow() def arrowOff(self): if not self.arrow.isArrowClosed: self.arrow.isArrowClosed = 1 self.arrow.drawArrow() def __getattr__(self, name): # dispatch everything not defined by ToggleLabel to arrow widget try: return getattr(self.__dict__['arrow'], name) except: raise AttributeError, "%s instance has no attribute '%s'" % (self.__class__.__name__, name)
def __init__(self, title, message, texts, objects=None, parent=None): if parent is None: parent = Tkinter.Tk() #parent.withdraw() self.root = parent parent.protocol('WM_DELETE_WINDOW', self.destroy) else: self.root = None Tkinter.Toplevel.__init__(self, parent) self.resizable(0, 0) self.parent = parent self.title(title) self.var = Tkinter.IntVar() self.objects = objects or range(len(texts)) assert len(self.objects) == len(texts) x = parent.winfo_rootx() + parent.winfo_width() / 2 y = parent.winfo_rooty() + parent.winfo_height() / 2 location = '+%d+%d' % (x, y) if hasattr(parent, 'font'): self.font = parent.font else: self.font = None Tkinter.Toplevel.geometry(self, location) Tkinter.Toplevel.lift(self, parent) self.update_idletasks() self.transient(parent) self.protocol('WM_DELETE_WINDOW', self._null) self.focus_force() self.grab_set() self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(1, weight=1) label = Label(self, text=message, grid=(0, 0)) self.config(bg=label.cget('bg')) frame = Frame(self, grid=(1, 0)) _buttons = [] for i, text in enumerate(texts): button = Button(frame, text=text, command=lambda j=i: self._click(j)) button.grid(row=i + 1, column=0, padx=2, pady=2, sticky='ew') if objects[i] is None: button.config(bg='#B0FFB0') _buttons.append(button) self._wait()
def createFindFrame(self, master): frame = Frame(master) frame.grid(row=0, column=0, sticky=Tkinter.W) arrow = ToggleArrow(frame, callback=self.toggleFindFrame) arrow.grid(row=0, column=0) button = Button(frame, text='find:', command=self.findPhrase) button.grid(row=0, column=1) self.find_entry = Entry(frame, width=20, returnCallback=self.findPhrase) self.find_entry.grid(row=0, column=2) self.find_frame = frame = Frame(master) entries = ('search forwards', 'search backwards') self.direction_buttons = PulldownMenu(frame, entries=entries) self.direction_buttons.grid(row=0, column=0, sticky=Tkinter.W, padx=5) self.forwards_entries = entries = ('wrap search', 'stop at end') self.backwards_entries = ('wrap search', 'stop at beginning') self.wrap_buttons = PulldownMenu(frame, entries=entries) self.wrap_buttons.grid(row=0, column=1, sticky=Tkinter.W, padx=5) self.direction_buttons.callback = self.setWrapText entries = ('case insensitive', 'case sensitive') self.case_buttons = PulldownMenu(frame, entries=entries) self.case_buttons.grid(row=0, column=2, sticky=Tkinter.W, padx=5) entries = ('literal search', 'regex search') self.pattern_buttons = PulldownMenu(frame, entries=entries) self.pattern_buttons.grid(row=0, column=3, sticky=Tkinter.W, padx=5) self.countVar = Tkinter.IntVar()
def createQuitButton(parent, text=''): if not text: text = '' b = Button(parent, text=text, command=sys.exit) if not text: b.cancelIcon = Tkinter.PhotoImage(file=os.path.join(gfxDir,'cancel.gif')) b.config(image=b.cancelIcon, activebackground=b.cget('bg')) return b
def createDismissButton(parent, dismiss_text = '', dismiss_cmd = None): if (not dismiss_text): dismiss_text = '' if (not dismiss_cmd): popup = parent while (not hasattr(popup, 'top')): popup = popup.parent dismiss_cmd = popup.close b = Button(parent, text=dismiss_text, command=dismiss_cmd) if not dismiss_text: b.cancelIcon = Tkinter.PhotoImage(file=os.path.join(gfxDir,'cancel.gif')) b.config(image=b.cancelIcon, activebackground=b.cget('bg')) return b
if (__name__ == '__main__'): from memops.gui.Button import Button from memops.gui.Util import createQuitButton def getText(): print 'getText:', text.getText() root = Tkinter.Tk() frame = Frame(root) frame.pack(side=Tkinter.TOP) button = Button(frame, text='get text', command=getText) button.pack(side=Tkinter.LEFT) button = createQuitButton(frame) button.pack(side=Tkinter.LEFT) text = ScrolledText( root, width=60, height=10, #text='in the beginning') text='in the beginning', xscroll=False) text.pack(side=Tkinter.TOP, expand=Tkinter.YES, fill=Tkinter.BOTH) root.mainloop()
def __init__(self, guiParent, basePopup, borderRelief='raised', text=' ', justify='left', width=None, font=None, height=None, *args, **kw): # Base popup required to handle notification of data model changes # e.g. new peak lists, so that the GUI can update to the latest # state self.basePopup = basePopup self.guiParent = guiParent self.borderRelief = borderRelief self.text = text self.justify = justify self.width = width self.font = font self.height = height # get a port proxy instance # this should probably belong to the repository directly loc = SharedBeanServiceLocator() self.port = loc.getSharedBean() self.registerNotify = basePopup.registerNotify self.unregisterNotify = basePopup.unregisterNotify LabelFrame.__init__(self, guiParent, borderRelief, text, justify, width, font, height, *args, **kw) # set up the grid self.grid_columnconfigure(0, weight=0, minsize=20) self.grid_rowconfigure(0, weight=0, minsize=5) self.grid_rowconfigure(1, weight=0, minsize=10) self.grid_rowconfigure(2, weight=0, minsize=10) self.grid_rowconfigure(3, weight=0, minsize=10) # build up the body. self.nameLabel = Label(self, text='Name:') self.nameLabel.grid(row=1, column=0, padx=2, sticky='nw') self.nameText = Text(self, width=20, height=1) self.nameText.grid(row=1, column=1, sticky='nw') self.dateLabel = Label(self, text='Date:') self.dateLabel.grid(row=2, column=0, padx=2, sticky='nw') self.dateText = Text(self, width=20, height=1) self.dateText.grid(row=2, column=1, sticky='nw') self.userLabel = Label(self, text='User:'******'nw') self.userText = Text(self, width=20, height=1) self.userText.grid(row=3, column=1, sticky='nw') self.clearButton = Button(self, text='Clear', command=self.clear_filter, width=10, height=1) self.clearButton.grid(row=4, column=0, columnspan=2, sticky='nw') self.filterButton = Button(self, text='Go', command=self.tmpCall, width=10, height=1) self.filterButton.grid(row=4, column=1, columnspan=2, sticky='ne')
class FilterFrame(LabelFrame): def __init__(self, guiParent, basePopup, borderRelief='raised', text=' ', justify='left', width=None, font=None, height=None, *args, **kw): # Base popup required to handle notification of data model changes # e.g. new peak lists, so that the GUI can update to the latest # state self.basePopup = basePopup self.guiParent = guiParent self.borderRelief = borderRelief self.text = text self.justify = justify self.width = width self.font = font self.height = height # get a port proxy instance # this should probably belong to the repository directly loc = SharedBeanServiceLocator() self.port = loc.getSharedBean() self.registerNotify = basePopup.registerNotify self.unregisterNotify = basePopup.unregisterNotify LabelFrame.__init__(self, guiParent, borderRelief, text, justify, width, font, height, *args, **kw) # set up the grid self.grid_columnconfigure(0, weight=0, minsize=20) self.grid_rowconfigure(0, weight=0, minsize=5) self.grid_rowconfigure(1, weight=0, minsize=10) self.grid_rowconfigure(2, weight=0, minsize=10) self.grid_rowconfigure(3, weight=0, minsize=10) # build up the body. self.nameLabel = Label(self, text='Name:') self.nameLabel.grid(row=1, column=0, padx=2, sticky='nw') self.nameText = Text(self, width=20, height=1) self.nameText.grid(row=1, column=1, sticky='nw') self.dateLabel = Label(self, text='Date:') self.dateLabel.grid(row=2, column=0, padx=2, sticky='nw') self.dateText = Text(self, width=20, height=1) self.dateText.grid(row=2, column=1, sticky='nw') self.userLabel = Label(self, text='User:'******'nw') self.userText = Text(self, width=20, height=1) self.userText.grid(row=3, column=1, sticky='nw') self.clearButton = Button(self, text='Clear', command=self.clear_filter, width=10, height=1) self.clearButton.grid(row=4, column=0, columnspan=2, sticky='nw') self.filterButton = Button(self, text='Go', command=self.tmpCall, width=10, height=1) self.filterButton.grid(row=4, column=1, columnspan=2, sticky='ne') def clear_filter(self): self.nameText.xlear() self.dateText.clear() self.userText.clear() def tmpCall(self, event=None): pass def administerNotifiers(self, notifyFunc): for func in ('__init__', 'delete', 'setName'): notifyFunc(self.updateAllAfter, 'ccp.nmr.Nmr.Experiment', func) notifyFunc(self.updateAllAfter, 'ccp.nmr.Nmr.DataSource', func) def updateAllAfter(self, obj): self.after_idle(self.updateAll) def updateAll(self, project=None): return def quit(self): self.guiParent.parent.destroy() def destroy(self): self.administerNotifiers(self.basePopup.unregisterNotify) Frame.destroy(self)
else: self.var.set(0) def toggle(self): self.setSelected(not self.getSelected()) if __name__ == '__main__': from memops.gui.Button import Button def get_me(): print 'get_me:', c.getSelected() def toggle_me(): c.toggle() def my_callback(selected): print 'my_callback:', selected root = Tkinter.Tk() c = CheckButton(root, 'check button', callback=my_callback) c.grid() b = Button(root, text='get me', command=get_me) b.grid() b = Button(root, text='toggle me', command=toggle_me) b.grid() root.mainloop()
class AnnealingSettingsTab(object): '''This class describes the tab in the GUI where the user can change setting that govern the monte carlo / annleaing procedure. This also includes which information from the ccpn analysis project is used and which information is ignored. This includes: * present sequential assignments * tentative assignments * amino acid type information * whether to include untyped spin systems * assignments to peak dimensions ALso the chain can be selected here. Furthermore the user can set the temperature regime of the annealing, the amount of times the procedure is repeated to obtain statistics. The fraction of peaks that is left out in each run to diversify the results, the treshhold score for amino acid typing and the treshhold collabelling for a peak to be expected. ''' def __init__(self, parent, frame): '''Init. args: parent: the guiElement that this tab is part of. frame: the frame this part of the GUI lives in. ''' self.guiParent = parent self.frame = frame self.project = parent.project self.nmrProject = parent.nmrProject self.minIsoFrac = 0.1 self.leavePeaksOutFraction = 0.0 self.minTypeScore = 1.0 self.chain = None self.amountOfRepeats = 10 self.amountOfSteps = 10000 self.acceptanceConstantList = [0.0, 0.01, 0.015, 0.022, 0.033, 0.050, 0.075, 0.113, 0.170, 0.256, 0.384, 0.576, 0.864, 1.297, 1.946, 2.919, 4.378, 6.568, 9.852, 14.77, 22.16, 33.25] self.energyDataSets = [[]] self.residues = [] self.body() def body(self): '''describes the body of this tab. It bascically consists of some field to fill out for the user at the top and a ScrolledGraph that shows the progess of the annealing procedure a the bottom. ''' frame = self.frame # frame.expandGrid(13,0) frame.expandGrid(15, 1) row = 0 text = 'Calculate Assignment Suggestions' command = self.runCalculations self.startButton = Button(frame, command=command, text=text) self.startButton.grid(row=row, column=0, sticky='nsew', columnspan=2) row += 1 Label(frame, text='Amount of runs: ', grid=(row, 0)) tipText = 'The amount of times the whole optimization procedure is performed, each result is safed' self.repeatEntry = IntEntry(frame, grid=(row, 1), width=7, text=10, returnCallback=self.updateRepeatEntry, tipText=tipText, sticky='nsew') self.repeatEntry.bind('<Leave>', self.updateRepeatEntry, '+') row += 1 Label(frame, text='Temperature regime: ', grid=(row, 0)) tipText = 'This list of numbers govern the temperature steps during the annealing, every number represents 1/(kb*t), where kb is the Boltzmann constant and t the temperature of one step.' self.tempEntry = Entry(frame, text=map(str, self.acceptanceConstantList), width=64, grid=(row, 1), isArray=True, returnCallback=self.updateAcceptanceConstantList, tipText=tipText, sticky='nsew') row += 1 Label(frame, text='Amount of attempts per temperature:', grid=(row, 0)) tipText = 'The amount of attempts to switch the position of two spinsystems in the sequence are performed for each temperature point' self.NAStepEntry = IntEntry(frame, grid=(row, 1), width=7, text=10000, returnCallback=self.updateStepEntry, tipText=tipText, sticky='nsew') self.NAStepEntry.bind('<Leave>', self.updateStepEntry, '+') row += 1 Label(frame, text='Fraction of peaks to leave out:', grid=(row, 0)) tipText = 'In each run a fraction of the peaks can be left out of the optimization, thereby increasing the variability in the outcome and reducing false negatives. In each run this will be different randomly chosen sub-set of all peaks. 0.1 (10%) can be a good value.' self.leaveOutPeaksEntry = FloatEntry(frame, grid=(row, 1), width=7, text=0.0, returnCallback=self.updateLeavePeaksOutEntry, tipText=tipText, sticky='nsew') self.leaveOutPeaksEntry.bind( '<Leave>', self.updateLeavePeaksOutEntry, '+') row += 1 Label(frame, text='Minmal amino acid typing score:', grid=(row, 0)) tipText = 'If automatic amino acid typing is selected, a cut-off value has to set. Every amino acid type that scores higher than the cut-off is taken as a possible type. This is the same score as can be found under resonance --> spin systems --> predict type. Value should be between 0 and 100' self.minTypeScoreEntry = FloatEntry(frame, grid=(row, 1), width=7, text=1.0, returnCallback=self.updateMinTypeScoreEntry, tipText=tipText, sticky='nsew') self.minTypeScoreEntry.bind( '<Leave>', self.updateMinTypeScoreEntry, '+') row += 1 Label(frame, text='Minimal colabelling fraction:', grid=(row, 0)) tipText = 'The minimal amount of colabelling the different nuclei should have in order to still give rise to a peak.' self.minLabelEntry = FloatEntry(frame, grid=(row, 1), width=7, text=0.1, returnCallback=self.updateMinLabelEntry, tipText=tipText, sticky='nsew') self.minLabelEntry.bind('<Leave>', self.updateMinLabelEntry, '+') row += 1 Label(frame, text='Use sequential assignments:', grid=(row, 0)) tipText = 'When this option is select the present sequential assignments will be kept in place' self.useAssignmentsCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Use tentative assignments:', grid=(row, 0)) tipText = 'If a spin system has tentative assignments this can be used to narrow down the amount of possible sequential assignments.' self.useTentativeCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Use amino acid types:', grid=(row, 0)) tipText = 'Use amino acid types of the spin systems. If this option is not checked the spin systems are re-typed, only resonance names and frequencies are used' self.useTypeCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Include untyped spin systems:', grid=(row, 0)) tipText = 'Also include spin system that have no type information. Amino acid typing will be done on the fly.' self.useAlsoUntypedSpinSystemsCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Use dimensional assignments:', grid=(row, 0)) tipText = 'If one or more dimensions of a peak is already assigned, assume that this assignment is the only option. If not the check the program will consider all possibilities for the assignment of the dimension.' self.useDimensionalAssignmentsCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Chain:', grid=(row, 0)) self.molPulldown = PulldownList( frame, callback=self.changeMolecule, grid=(row, 1)) self.updateChains() row += 1 Label(frame, text='Residue ranges: ', grid=(row, 0)) tipText = 'Which residues should be included. Example: "10-35, 62-100, 130".' self.residueRangeEntry = Entry(frame, text=None, width=64, grid=(row, 1), isArray=True, returnCallback=self.updateResidueRanges, tipText=tipText, sticky='nsew') self.updateResidueRanges(fromChain=True) row += 1 self.energyPlot = ScrolledGraph(frame, symbolSize=2, width=600, height=200, title='Annealing', xLabel='temperature step', yLabel='energy') self.energyPlot.grid(row=row, column=0, columnspan=2, sticky='nsew') def runCalculations(self): '''Run all calculations. Also triggers the disabling of some buttons and fields. ''' self.startButton.disable() self.disableIllegalButtonsAfterPrecalculations() self.guiParent.connector.runAllCalculations() self.startButton.configure(text='More runs') self.startButton.enable() def disableIllegalButtonsAfterPrecalculations(self): '''Disable buttons and field the user can not alter any longer after the model is set up and the 'pre-calculations' have finished. This is done because this part of the calculation should only be run once. All settings that would be changed after this point will not have any influence. ''' illegalButtons = [self.minTypeScoreEntry, self.minLabelEntry, self.useAlsoUntypedSpinSystemsCheck, self.useAssignmentsCheck, self.useTypeCheck, self.useDimensionalAssignmentsCheck, self.useTentativeCheck] for illegalButton in illegalButtons: illegalButton.configure(state='disabled') self.molPulldown.disable() def getChainName(self, chain): '''Get the name for a chain. args: chain: ccpn analysis chain object returns: chain name ''' return '%s:%s (%s)' % (chain.molSystem.code, chain.code, chain.molecule.molType) def getChains(self): '''Get all chains present in the project. returns: list of ccpn analysis chain objects ''' chains = [] if self.project: for molSystem in self.project.sortedMolSystems(): for chain in molSystem.sortedChains(): if chain.residues: chains.append(chain) return chains def updateChains(self, *opt): '''Updates the list of chains if a new one is added to or deleted from the project. Updates the pull down list where a chain can be selected. ''' index = 0 texts = [] chains = self.getChains() chain = self.chain if chains: if chain not in chains: chain = chains[0] texts = [self.getChainName(c) for c in chains] index = chains.index(chain) else: chain = None self.molPulldown.setup(texts, chains, index) if chain is not self.chain: self.chain = chain def changeMolecule(self, chain): '''Select a molecular chain.''' if chain is not self.chain: self.chain = chain self.updateResidueRanges(fromChain=True) def updateStepEntry(self, event=None): '''Update the value and entry that sets the amount of steps per temperature point. ''' value = self.NAStepEntry.get() if value == self.amountOfSteps: return if value < 1: self.NAStepEntry.set(1) self.amountOfSteps = 1 else: self.amountOfSteps = value self.NAStepEntry.set(value) def updateRepeatEntry(self, event=None): '''Update the value and entry of that sets the amount of times the whole annealing procedure is repeated in order to obtain statistics. ''' value = self.repeatEntry.get() if value == self.amountOfRepeats: return if value < 1: self.repeatEntry.set(1) self.amountOfRepeats = 1 else: self.amountOfRepeats = value self.repeatEntry.set(value) def updateMinTypeScoreEntry(self, event=None): '''Updates the value and the entry for the treshhold value for amino acid typing. ''' value = self.minTypeScoreEntry.get() if value == self.minTypeScore: return if value < 0: self.minTypeScoreEntry.set(0.0) self.minTypeScore = 0.0 elif value > 100: self.minTypeScoreEntry.set(100.0) self.minTypeScore = 100.0 else: self.minTypeScoreEntry.set(value) self.minTypeScore = value def updateMinLabelEntry(self, event=None): '''Updates the minimum colabelling fraction for which a peak is expected to be present in the spectra. ''' value = self.minLabelEntry.get() if value == self.minIsoFrac: return if value < 0: self.minIsoFrac = 0.0 self.minLabelEntry.set(0.0) elif value > 1: self.minIsoFrac = 1.0 self.minLabelEntry.set(1.0) else: self.minIsoFrac = value self.minLabelEntry.set(value) def updateLeavePeaksOutEntry(self, event=None): '''Updates the value and entry of the fraction of peaks that should be left out in each run in order to diversify the results. ''' value = self.leaveOutPeaksEntry.get() if value == self.leavePeaksOutFraction: return if value < 0: self.leavePeaksOutFraction = 0.0 self.leaveOutPeaksEntry.set(0.0) elif value > 1: self.leavePeaksOutFraction = 1.0 self.leaveOutPeaksEntry.set(1.0) else: self.leavePeaksOutFraction = value self.leaveOutPeaksEntry.set(value) def updateAcceptanceConstantList(self, event=None): '''Updates the list with constants that are used during the monte carlo procedure to decide whether a changed is accepted or not. ''' acList = self.tempEntry.get() newList = [] for constant in acList: try: number = float(constant) newList.append(number) except ValueError: string = constant + \ ' in temperature constants is not a number.' showWarning('Not A Number', string, parent=self.guiParent) return False self.acceptanceConstantList = newList return True def updateResidueRanges(self, event=None, fromChain=False): self.residues = set() subRanges = self.residueRangeEntry.get() if not subRanges or fromChain: self.residues = set(self.chain.residues) residues = self.chain.sortedResidues() text = '{}-{}'.format(residues[0].seqCode, residues[-1].seqCode) self.residueRangeEntry.set(text=text) return for subRange in subRanges: indeces = subRange.split('-') start = int(indeces[0]) stop = int(indeces[-1]) + 1 for seqCode in range(start, stop): residue = self.chain.findFirstResidue(seqCode=seqCode) if not residue: showWarning('Residue out of range.', 'There is no residue at position {}'.format(seqCode), parent=self.guiParent) self.residues = set() return self.residues.add(residue) def addEnergyPoint(self, energy, time): '''Adds a point to the graph that shows the progress of the annealling procedure. args: energy: the y-value time: the x-value ''' point = (time, energy * -1) # This means one run has finished if len(self.energyDataSets[-1]) / (len(self.acceptanceConstantList) + 1): self.energyDataSets.append([point]) else: self.energyDataSets[-1].append(point) colors = colorSeries Ncolors = len(colors) NdataSets = len(self.energyDataSets) colorList = (NdataSets / Ncolors) * colors + \ colors[:NdataSets % Ncolors] self.energyPlot.update(dataSets=self.energyDataSets, dataColors=colorList) # Forcing the graph to draw, eventhough calculations # are still running. Only do this with high numbers of # steps, otherwise drawing takes longer than annealling. if self.amountOfSteps >= 100000: self.energyPlot.draw()
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
return self.var.get() def set(self, text = ''): self.var.set(text) if (__name__ == '__main__'): from memops.gui.Button import Button msg = 'hello world' count = 0 def func(): global count count = count + 1 label.set(msg + ' ' + str(count)) print label.get() root = Tkinter.Tk() label = Label(root, text='hello world') label.grid() button = Button(root, text='hit me', command=func) button.grid() root.mainloop()
def updateButtons(self): row = 1 col = 0 if self.widgetType != 'CheckButton': if (self.maxRows is None) or (self.numRows < self.maxRows): if not self.addButton: if self.plusImage: self.addButton = Button(self, image=self.plusImage, command=self.addRow, borderwidth=1) else: self.addButton = Button(self, text='+', command=self.addRow, borderwidth=1, bg=blueColor) self.addButton.grid(row=row, column=col, sticky=Tkinter.EW) col += 1 elif self.addButton: self.addButton.grid_forget() if self.numRows > self.minRows: if not self.removeButton: if self.minusImage: self.removeButton = Button(self, image=self.minusImage, command=self.removeRow, borderwidth=1) else: self.removeButton = Button(self, text='-', command=self.removeRow, borderwidth=1, bg=blueColor) self.removeButton.grid(row=row, column=col, sticky=Tkinter.EW) col += 1 elif self.removeButton: self.removeButton.grid_forget() if self.callback: if not self.commitButton: if self.tickImage: self.commitButton = Button(self, image=self.tickImage, command=self.commit, borderwidth=1) else: self.commitButton = Button(self, text='OK', command=self.commit, borderwidth=1, bg=blueColor) self.commitButton.grid(row=row, column=col, sticky=Tkinter.EW) self.grid_columnconfigure(col, weight=1) col += 1 if not self.cancelButton: if self.crossImage: self.cancelButton = Button(self, image=self.crossImage, command=self.cancel, borderwidth=1) else: self.cancelButton = Button(self, text='Cancel', command=self.cancel, borderwidth=1, bg=blueColor) self.cancelButton.grid(row=row, column=col, sticky=Tkinter.EW) self.grid_columnconfigure(col, weight=1)
def body(self, guiFrame): self.geometry('600x350') project = self.project analysisProject = self.analysisProject guiFrame.grid_columnconfigure(1, weight=1) row = 0 frame = Frame(guiFrame, grid=(0,0)) label = Label(frame, text=' Window:', grid=(0,0)) self.windowPulldown = PulldownList(frame, grid=(0,1), tipText='The window that will be printed out', callback=self.selectWindow) tipTexts = ['For the window pulldown, show all of the spectrum windows in the current project, irrespective of the active group', 'For the window pulldown, show only spectrum windows that are in the currently active window group'] self.whichWindows = RadioButtons(frame, grid=(0,2), entries=ACTIVE_OPTIONS, tipTexts=tipTexts, select_callback=self.updateWindows) texts = [ 'Save Print File' ] tipTexts = [ 'Save the printout to the specified file' ] commands = [ self.saveFile ] buttons = UtilityButtonList(guiFrame, helpUrl=self.help_url, grid=(row,2), commands=commands, texts=texts, tipTexts=tipTexts) self.buttons = buttons buttons.buttons[0].config(bg='#B0FFB0') row += 1 guiFrame.grid_rowconfigure(row, weight=1) options = ['Options', 'Spectra', 'Peak Lists', 'Region'] tipTexts = ['Optional settings for spectra', 'Optional settings for peak lists', 'Optional settings for the region'] tabbedFrame = TabbedFrame(guiFrame, options=options, tipTexts=tipTexts) tabbedFrame.grid(row=row, column=0, columnspan=3, sticky='nsew') self.tabbedFrame = tabbedFrame optionFrame, spectrumFrame, peakListFrame, regionFrame = tabbedFrame.frames optionFrame.expandGrid(0, 0) getOption = lambda key, defaultValue: PrintBasic.getPrintOption(analysisProject, key, defaultValue) setOption = lambda key, value: PrintBasic.setPrintOption(analysisProject, key, value) self.printFrame = PrintFrame(optionFrame, getOption=getOption, grid=(0,0), gridSpan=(1,1), setOption=setOption, haveTicks=True, doOutlineBox=False) spectrumFrame.expandGrid(0, 0) frame = Frame(spectrumFrame, grid=(0,0), gridSpan=(1,1)) frame.expandGrid(1,0) self.overrideSpectrum = CheckButton(frame, text='Use below settings when printing', tipText='Use below settings when printing instead of the window values', grid=(0,0), sticky='w') tipText = 'Change the settings of the selected spectra back to their window values' button = Button(frame, text='Reset Selected', tipText=tipText, command=self.resetSelected, grid=(0,1), sticky='e') self.posColorPulldown = PulldownList(self, callback=self.setPosColor) self.negColorPulldown = PulldownList(self, callback=self.setNegColor) headings = ['Spectrum', 'Pos. Contours\nDrawn', 'Neg. Contours\nDrawn', 'Positive\nColours', 'Negative\nColours'] tipTexts = ['Spectrum in window', 'Whether the positive contours should be drawn', 'Whether the negative contours should be drawn', 'Colour scheme for positive contours (can be a single colour)', 'Colour scheme for negative contours (can be a single colour)'] editWidgets = [ None, None, None, self.posColorPulldown, self.negColorPulldown] editGetCallbacks = [ None, self.togglePos, self.toggleNeg, self.getPosColor, self.getNegColor] editSetCallbacks = [ None, None, None, self.setPosColor, self.setNegColor] self.spectrumTable = ScrolledMatrix(frame, headingList=headings, tipTexts=tipTexts, multiSelect=True, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, grid=(1,0), gridSpan=(1,2)) peakListFrame.expandGrid(0, 0) frame = Frame(peakListFrame, grid=(0,0), gridSpan=(1,3)) frame.expandGrid(1,0) self.overridePeakList = CheckButton(frame, text='Use below settings when printing', tipText='Use below settings when printing instead of the window values', grid=(0,0)) tipText = 'Change the settings of the selected peak lists back to their window values' button = Button(frame, text='Reset Selected', tipText=tipText, command=self.resetSelected, grid=(0,1), sticky='e') colors = Color.standardColors self.peakColorPulldown = PulldownList(self, callback=self.setPeakColor, texts=[c.name for c in colors], objects=[c.hex for c in colors], colors=[c.hex for c in colors]) headings = [ 'Peak List', 'Symbols Drawn', 'Peak Font', 'Peak Colour'] self.fontMenu = FontList(self, mode='Print', extraTexts=[no_peak_text]) editWidgets = [ None, None, self.fontMenu, self.peakColorPulldown] editGetCallbacks = [ None, self.togglePeaks, self.getPeakFont, self.getPeakColor ] editSetCallbacks = [ None, None, self.setPeakFont, self.setPeakColor ] self.peakListTable = ScrolledMatrix(frame, headingList=headings, multiSelect=True, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, grid=(1,0), gridSpan=(1,2)) regionFrame.expandGrid(0, 0) frame = Frame(regionFrame, grid=(0,0), gridSpan=(1,3)) frame.expandGrid(3,0) tipText = 'Use the specified override region when printing rather than the window values' self.overrideButton = CheckButton(frame, text='Use override region when printing', tipText=tipText, callback=self.toggledOverride, grid=(0,0)) tipTexts = ('Use min and max to specify override region', 'Use center and width to specify override region') self.use_entry = USE_ENTRIES[0] self.useButtons = RadioButtons(frame, entries=USE_ENTRIES, tipTexts=tipTexts, select_callback=self.changedUseEntry, grid=(1,0)) texts = ('Set Region from Window', 'Set Center from Window', 'Set Width from Window') tipTexts = ('Set the override region to be the current window region', 'Set the center of the override region to be the center of the current window region', 'Set the width of the override region to be the width of the current window region') commands = (self.setRegionFromWindow, self.setCenterFromWindow, self.setWidthFromWindow) self.setRegionButton = ButtonList(frame, texts=texts, tipTexts=tipTexts, commands=commands, grid=(2,0)) self.minRegionWidget = FloatEntry(self, returnCallback=self.setMinRegion, width=10) self.maxRegionWidget = FloatEntry(self, returnCallback=self.setMaxRegion, width=10) headings = MIN_MAX_HEADINGS editWidgets = [ None, None, self.minRegionWidget, self.maxRegionWidget ] editGetCallbacks = [ None, None, self.getMinRegion, self.getMaxRegion ] editSetCallbacks = [ None, None, self.setMinRegion, self.setMaxRegion ] self.regionTable = RegionScrolledMatrix(frame, headingList=headings, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, grid=(3,0)) self.updateWindows() self.updateAfter() self.administerNotifiers(self.registerNotify)
def update(self, objects=None, selected=None, labels=None, colors=None, fonts=None): if objects is None: if self.objects is None: self.objects = [] else: self.objects = objects if labels is None: if self.labels is None: self.labels = [] else: self.labels = labels if colors is None: if self.colors is None: self.colors = [] else: self.colors = colors if fonts is None: if self.fonts is None: self.fonts = [] else: self.fonts = fonts N = len(self.objects) for i in range(N): if i >= len(self.labels): self.labels.append('%d' % i) if self.objects[i] is None: self.labels[i] = 'None' if i >= len(self.colors): self.colors.append(self.cget('background')) if i >= len(self.fonts): self.fonts.append(self.font) if i >= len(self.buttons): command = lambda n=i, s=self: s.selectButton(n) button = Button(self, command=command, relief=self.buttonRelief, font=self.fonts[i], borderwidth=self.buttonBorderWidth) self.buttons.append(button) if len(self.buttons) > N: for i in range(N, len(self.buttons)): self.buttons[i].grid_forget() self.grid_columnconfigure(i, weight=0) row = 0 col = 0 for i in range(N): if i >= len(self.state): self.state.append(1) self.setButtonState(i, self.state[i]) self.buttons[i].config(text=labels[i], font=self.fonts[i]) self.buttons[i].grid(row=row, column=col, sticky=Tkinter.NSEW) self.grid_columnconfigure(col, weight=1) col += 1 if col >= self.maxRowObjects: row += 1 col = 0 if selected is not None: self.setSelected(selected)
def body(self, mainFrame): mainFrame.grid_columnconfigure(1, weight=1, minsize=100) mainFrame.config(borderwidth=5, relief='solid') row = 0 label = Label(mainFrame, text="Frame (with sub-widgets):") label.grid(row=row, column=0, sticky=Tkinter.E) frame = Frame(mainFrame, relief='raised', border=2, background='#8080D0') # Frame expands East-West frame.grid(row=row, column=1, sticky=Tkinter.EW) # Last column expands => Widgets pusted to the West frame.grid_columnconfigure(3, weight=1) # Label is within the sub frame label = Label(frame, text='label ') label.grid(row=0, column=0, sticky=Tkinter.W) entry = Entry(frame, text='Entry', returnCallback=self.showWarning) entry.grid(row=0, column=1, sticky=Tkinter.W) self.check = CheckButton(frame, text='Checkbutton', selected=True, callback=self.updateObjects) self.check.grid(row=0, column=2, sticky=Tkinter.W) # stick a button to the East wall button = Button(frame, text='Button', command=self.pressButton) button.grid(row=0, column=3, sticky=Tkinter.E) row += 1 label = Label(mainFrame, text="Text:") label.grid(row=row, column=0, sticky=Tkinter.E) self.textWindow = Text(mainFrame, text='Initial Text\n', width=60, height=5) self.textWindow.grid(row=row, column=1, sticky=Tkinter.NSEW) row += 1 label = Label(mainFrame, text="CheckButtons:") label.grid(row=row, column=0, sticky=Tkinter.E) entries = ['Alpha','Beta','Gamma','Delta'] selected = entries[2:] self.checkButtons = CheckButtons(mainFrame, entries, selected=selected,select_callback=self.changedCheckButtons) self.checkButtons.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="PartitionedSelector:") label.grid(row=row, column=0, sticky=Tkinter.E) labels = ['Bool','Int','Float','String'] objects = [type(0),type(1),type(1.0),type('a')] selected = [type('a')] self.partitionedSelector= PartitionedSelector(mainFrame, labels=labels, objects=objects, colors = ['red','yellow','green','#000080'], callback=self.toggleSelector,selected=selected) self.partitionedSelector.grid(row=row, column=1, sticky=Tkinter.EW) row += 1 label = Label(mainFrame, text="PulldownMenu") label.grid(row=row, column=0, sticky=Tkinter.E) entries = ['Frodo','Pipin','Merry','Sam','Bill','Gandalf','Strider','Gimli','Legolas'] self.pulldownMenu = PulldownMenu(mainFrame, callback=self.selectPulldown, entries=entries, selected_index=2, do_initial_callback=False) self.pulldownMenu.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="RadioButtons in a\nScrolledFrame.frame:") label.grid(row=row, column=0, sticky=Tkinter.EW) frame = ScrolledFrame(mainFrame, yscroll = False, doExtraConfig = True, width=100) frame.grid(row=row, column=1, sticky=Tkinter.EW) frame.grid_columnconfigure(0, weight=1) self.radioButtons = RadioButtons(frame.frame, entries=entries, select_callback=self.checkRadioButtons, selected_index=1, relief='groove') self.radioButtons.grid(row=0, column=0, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="LabelFrame with\nToggleLabels inside:") label.grid(row=row, column=0, sticky=Tkinter.E) labelFrame = LabelFrame(mainFrame, text='Frame Title') labelFrame.grid(row=row, column=1, sticky=Tkinter.NSEW) labelFrame.grid_rowconfigure(0, weight=1) labelFrame.grid_columnconfigure(3, weight=1) self.toggleLabel1 = ToggleLabel(labelFrame, text='ScrolledMatrix', callback=self.toggleFrame1) self.toggleLabel1.grid(row=0, column=0, sticky=Tkinter.W) self.toggleLabel1.arrowOn() self.toggleLabel2 = ToggleLabel(labelFrame, text='ScrolledGraph', callback=self.toggleFrame2) self.toggleLabel2.grid(row=0, column=1, sticky=Tkinter.W) self.toggleLabel3 = ToggleLabel(labelFrame, text='ScrolledCanvas', callback=self.toggleFrame3) self.toggleLabel3.grid(row=0, column=2, sticky=Tkinter.W) row += 1 mainFrame.grid_rowconfigure(row, weight=1) label = Label(mainFrame, text="changing/shrinking frames:") label.grid(row=row, column=0, sticky=Tkinter.E) self.toggleRow = row self.toggleFrame = Frame(mainFrame) self.toggleFrame.grid(row=row, column=1, sticky=Tkinter.NSEW) self.toggleFrame.grid_rowconfigure(0, weight=1) self.toggleFrame.grid_columnconfigure(0, weight=1) # option 1 self.intEntry = IntEntry(self, returnCallback = self.setNumber, width=8) self.multiWidget = MultiWidget(self, Entry, options=None, values=None, callback=self.setKeywords, minRows=3, maxRows=5) editWidgets = [None, None, self.intEntry, self.multiWidget] editGetCallbacks = [None, None, self.getNumber, self.getKeywords] editSetCallbacks = [None, None, self.setNumber, self.setKeywords] headingList = ['Name','Color','Number','Keywords'] self.scrolledMatrix = ScrolledMatrix(self.toggleFrame, headingList=headingList, editSetCallbacks=editSetCallbacks, editGetCallbacks=editGetCallbacks, editWidgets=editWidgets, callback=self.selectObject, multiSelect=False) self.scrolledMatrix.grid(row=0, column=0, sticky=Tkinter.NSEW) # option 2 self.scrolledGraph = ScrolledGraph(self.toggleFrame, width=400, height=300, symbolSize=5, symbols=['square','circle'], dataColors=['#000080','#800000'], lineWidths=[0,1] ) self.scrolledGraph.setZoom(1.3) dataSet1 = [[0,0],[1,1],[2,4],[3,9],[4,16],[5,25]] dataSet2 = [[0,0],[1,3],[2,6],[3,9],[4,12],[5,15]] self.scrolledGraph.update(dataSets=[dataSet1,dataSet2], xLabel = 'X axis label', yLabel = 'Y axis label', title = 'Main Title') self.scrolledGraph.draw() # option 3 self.scrolledCanvas = ScrolledCanvas(self.toggleFrame,relief = 'groove', borderwidth = 2, resizeCallback=None) canvas = self.scrolledCanvas.canvas font = 'Helvetica 10' box = canvas.create_rectangle(10,10,150,200, outline='grey', fill='grey90') line = canvas.create_line(0,0,200,200,fill='#800000', width=2) text = canvas.create_text(120,50, text='Text', font=font, fill='black') circle = canvas.create_oval(30,30,50,50,outline='#008000',fill='#404040',width=3) row += 1 label = Label(mainFrame, text="FloatEntry:") label.grid(row=row, column=0, sticky=Tkinter.E) self.floatEntry = FloatEntry(mainFrame, text=3.14159265, returnCallback=self.floatEntryReturn) self.floatEntry.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="Scale:") label.grid(row=row, column=0, sticky=Tkinter.E) self.scale = Scale(mainFrame, from_=10, to=90, value=50, orient=Tkinter.HORIZONTAL) self.scale.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="Value Ramp:") label.grid(row=row, column=0, sticky=Tkinter.E) self.valueRamp = ValueRamp(mainFrame, self.valueRampCallback, speed = 1.5, delay = 50) self.valueRamp.grid(row=row, column=1, sticky=Tkinter.W) row += 1 label = Label(mainFrame, text="ButtonList:") label.grid(row=row, column=0, sticky=Tkinter.E) texts = ['Select File','Close','Quit'] commands = [self.selectFile, self.close, self.quit] bottomButtons = ButtonList(mainFrame, texts=texts, commands=commands, expands=True) bottomButtons.grid(row=row, column=1, sticky=Tkinter.EW) self.protocol('WM_DELETE_WINDOW', self.quit)
def body(self): '''describes the body of this tab. It bascically consists of some field to fill out for the user at the top and a ScrolledGraph that shows the progess of the annealing procedure a the bottom. ''' frame = self.frame # frame.expandGrid(13,0) frame.expandGrid(15, 1) row = 0 text = 'Calculate Assignment Suggestions' command = self.runCalculations self.startButton = Button(frame, command=command, text=text) self.startButton.grid(row=row, column=0, sticky='nsew', columnspan=2) row += 1 Label(frame, text='Amount of runs: ', grid=(row, 0)) tipText = 'The amount of times the whole optimization procedure is performed, each result is safed' self.repeatEntry = IntEntry(frame, grid=(row, 1), width=7, text=10, returnCallback=self.updateRepeatEntry, tipText=tipText, sticky='nsew') self.repeatEntry.bind('<Leave>', self.updateRepeatEntry, '+') row += 1 Label(frame, text='Temperature regime: ', grid=(row, 0)) tipText = 'This list of numbers govern the temperature steps during the annealing, every number represents 1/(kb*t), where kb is the Boltzmann constant and t the temperature of one step.' self.tempEntry = Entry(frame, text=map(str, self.acceptanceConstantList), width=64, grid=(row, 1), isArray=True, returnCallback=self.updateAcceptanceConstantList, tipText=tipText, sticky='nsew') row += 1 Label(frame, text='Amount of attempts per temperature:', grid=(row, 0)) tipText = 'The amount of attempts to switch the position of two spinsystems in the sequence are performed for each temperature point' self.NAStepEntry = IntEntry(frame, grid=(row, 1), width=7, text=10000, returnCallback=self.updateStepEntry, tipText=tipText, sticky='nsew') self.NAStepEntry.bind('<Leave>', self.updateStepEntry, '+') row += 1 Label(frame, text='Fraction of peaks to leave out:', grid=(row, 0)) tipText = 'In each run a fraction of the peaks can be left out of the optimization, thereby increasing the variability in the outcome and reducing false negatives. In each run this will be different randomly chosen sub-set of all peaks. 0.1 (10%) can be a good value.' self.leaveOutPeaksEntry = FloatEntry(frame, grid=(row, 1), width=7, text=0.0, returnCallback=self.updateLeavePeaksOutEntry, tipText=tipText, sticky='nsew') self.leaveOutPeaksEntry.bind( '<Leave>', self.updateLeavePeaksOutEntry, '+') row += 1 Label(frame, text='Minmal amino acid typing score:', grid=(row, 0)) tipText = 'If automatic amino acid typing is selected, a cut-off value has to set. Every amino acid type that scores higher than the cut-off is taken as a possible type. This is the same score as can be found under resonance --> spin systems --> predict type. Value should be between 0 and 100' self.minTypeScoreEntry = FloatEntry(frame, grid=(row, 1), width=7, text=1.0, returnCallback=self.updateMinTypeScoreEntry, tipText=tipText, sticky='nsew') self.minTypeScoreEntry.bind( '<Leave>', self.updateMinTypeScoreEntry, '+') row += 1 Label(frame, text='Minimal colabelling fraction:', grid=(row, 0)) tipText = 'The minimal amount of colabelling the different nuclei should have in order to still give rise to a peak.' self.minLabelEntry = FloatEntry(frame, grid=(row, 1), width=7, text=0.1, returnCallback=self.updateMinLabelEntry, tipText=tipText, sticky='nsew') self.minLabelEntry.bind('<Leave>', self.updateMinLabelEntry, '+') row += 1 Label(frame, text='Use sequential assignments:', grid=(row, 0)) tipText = 'When this option is select the present sequential assignments will be kept in place' self.useAssignmentsCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Use tentative assignments:', grid=(row, 0)) tipText = 'If a spin system has tentative assignments this can be used to narrow down the amount of possible sequential assignments.' self.useTentativeCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Use amino acid types:', grid=(row, 0)) tipText = 'Use amino acid types of the spin systems. If this option is not checked the spin systems are re-typed, only resonance names and frequencies are used' self.useTypeCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Include untyped spin systems:', grid=(row, 0)) tipText = 'Also include spin system that have no type information. Amino acid typing will be done on the fly.' self.useAlsoUntypedSpinSystemsCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Use dimensional assignments:', grid=(row, 0)) tipText = 'If one or more dimensions of a peak is already assigned, assume that this assignment is the only option. If not the check the program will consider all possibilities for the assignment of the dimension.' self.useDimensionalAssignmentsCheck = CheckButton( frame, selected=True, tipText=tipText, grid=(row, 1)) row += 1 Label(frame, text='Chain:', grid=(row, 0)) self.molPulldown = PulldownList( frame, callback=self.changeMolecule, grid=(row, 1)) self.updateChains() row += 1 Label(frame, text='Residue ranges: ', grid=(row, 0)) tipText = 'Which residues should be included. Example: "10-35, 62-100, 130".' self.residueRangeEntry = Entry(frame, text=None, width=64, grid=(row, 1), isArray=True, returnCallback=self.updateResidueRanges, tipText=tipText, sticky='nsew') self.updateResidueRanges(fromChain=True) row += 1 self.energyPlot = ScrolledGraph(frame, symbolSize=2, width=600, height=200, title='Annealing', xLabel='temperature step', yLabel='energy') self.energyPlot.grid(row=row, column=0, columnspan=2, sticky='nsew')
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)
from ccp.gui.ChemCompEditor import ChemCompEditPopup from pdbe.chemComp.Constants import editChemCompDataDir if (__name__ == '__main__'): project = Implementation.MemopsRoot(name='edit') setCurrentStore(project, 'ChemElementStore') root = Tkinter.Tk() root.top = root root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) frame = ChemCompFrame( root, project, chemCompEntries=('ChemComp', )) #path = editChemCompDataDir, frame.grid(sticky=Tkinter.NSEW) def getSelected(): chemComp = frame.getSelectedChemComp() ChemCompEditPopup(root, chemComp) button = Button(root, text='Edit selected', command=getSelected) button.grid() root.mainloop()
[ '#000040', '#000080', '#0000A0', '#0000FF', '#0040FF', '#0080FF', '#00A0FF', '#00C0FF', '#00E0FF', '#00FFFF', '#40FFFF', '#80FFFF', '#A0FFFF', '#D0FFFF', '#FFFFFF' ], None ] selected_index = 2 popup_select = PulldownMenu(root, callback=callback, entries=entries, colors=colors, selected_index=selected_index) popup_select.grid(row=0, column=0, columnspan=3) button = Button(root, text='add', command=add) button.grid(row=1, column=0) button = Button(root, text='remove', command=remove) button.grid(row=1, column=1) button = Button(root, text='getSelected', command=getSelected) button.grid(row=1, column=2) button = Button(root, text='getSelectedInd', command=getSelectedInd) button.grid(row=1, column=3) button = Button(root, text='quit', command=sys.exit) button.grid(row=1, column=4) root.mainloop()
class MultiWidget(Frame): def __init__(self, parent, widgetClass, options=None, values=None, callback=None, minRows=3, maxRows=None, useImages=True, *args, **kw): Frame.__init__(self, parent, **kw) if not values: values = [] if not options: options = [] # Widget types currently: Entries, Pulldown, Checkbutton if useImages: gfxDir = path.join(getTopDirectory(), 'python', 'memops', 'gui', 'graphics') self.crossImage = Tkinter.PhotoImage( file=path.join(gfxDir, 'cross.gif')) self.tickImage = Tkinter.PhotoImage( file=path.join(gfxDir, 'tick.gif')) self.plusImage = Tkinter.PhotoImage( file=path.join(gfxDir, 'plus.gif')) self.minusImage = Tkinter.PhotoImage( file=path.join(gfxDir, 'minus.gif')) else: self.crossImage = None self.tickImage = None self.plusImage = None self.minusImage = None module = widgetClass.__module__ self.widgetType = module.split('.')[-1] self.widgetClass = widgetClass self.callback = callback self.numRows = 0 self.values = values self.options = options self.minRows = minRows self.maxRows = maxRows self.widgets = [] self.labels = [] self.grid_columnconfigure(1, weight=1) self.topFrame = Frame(self) self.topFrame.grid(row=0, column=0, columnspan=4, sticky=Tkinter.NSEW) self.topFrame.grid_columnconfigure(1, weight=1) self.topFrame.grid_rowconfigure(0, weight=1) self.addButton = None self.removeButton = None self.commitButton = None self.cancelButton = None self.set(self.values, self.options) self.updateButtons() self.bind('<KeyPress-Return>', self.commit) self.bind('<KeyPress-Escape>', self.cancel) def get(self): values = [] if self.widgetType == 'PulldownMenu': for i in range(self.numRows): value = self.widgets[i].getSelected() if value is not None: values.append(value) elif self.widgetType == 'PulldownList': for i in range(self.numRows): value = self.widgets[i].getObject() if value is not None: values.append(value) else: for i in range(self.numRows): value = self.widgets[i].get() if (value is not None) and (value != ''): values.append(value) return values def set(self, values=None, options=None): if values is not None: self.values = values if options is not None: self.options = options N = max(len(self.values), self.minRows) if self.maxRows is not None: N = min(N, self.maxRows) #N = max( min(len(self.values), self.maxRows), self.minRows) #N = len(self.values) if self.numRows < N: for i in range(self.numRows, N): self.addRow() elif self.numRows > N: for i in range(N, self.numRows): self.removeRow(doClear=1) for i in range(self.numRows): if i < len(self.values): value = self.values[i] else: value = None if i < len(self.options): option = self.options[i] else: option = None self.updateWidget(i, value, option) def setOptions(self, options): self.set(self.values, options) def setValues(self, values): self.set(values, self.options) def updateWidget(self, row, value, option): if self.labels: font = self.labels[0].cget('font') else: font = None widget = self.widgets[row] if self.widgetType in ('Entry', 'IntEntry', 'FloatEntry'): widget.set(value) label = self.labels[row] label.set(option or '') if font: label.config(font=font) elif self.widgetType == 'PulldownMenu': index = -1 if value in self.options: index = self.options.index(value or self.options[0]) widget.setup(self.options, index) elif self.widgetType == 'PulldownList': index = 0 if value in self.options: index = self.options.index(value or self.options[0]) widget.setup(self.options, self.options, index) elif self.widgetType == 'CheckButton': widget.set(value) label = self.labels[row] label.set(option or '') if font: label.config(font=font) else: raise 'Widget type %s not supported in MultiWidget' % self.widgetType def updateButtons(self): row = 1 col = 0 if self.widgetType != 'CheckButton': if (self.maxRows is None) or (self.numRows < self.maxRows): if not self.addButton: if self.plusImage: self.addButton = Button(self, image=self.plusImage, command=self.addRow, borderwidth=1) else: self.addButton = Button(self, text='+', command=self.addRow, borderwidth=1, bg=blueColor) self.addButton.grid(row=row, column=col, sticky=Tkinter.EW) col += 1 elif self.addButton: self.addButton.grid_forget() if self.numRows > self.minRows: if not self.removeButton: if self.minusImage: self.removeButton = Button(self, image=self.minusImage, command=self.removeRow, borderwidth=1) else: self.removeButton = Button(self, text='-', command=self.removeRow, borderwidth=1, bg=blueColor) self.removeButton.grid(row=row, column=col, sticky=Tkinter.EW) col += 1 elif self.removeButton: self.removeButton.grid_forget() if self.callback: if not self.commitButton: if self.tickImage: self.commitButton = Button(self, image=self.tickImage, command=self.commit, borderwidth=1) else: self.commitButton = Button(self, text='OK', command=self.commit, borderwidth=1, bg=blueColor) self.commitButton.grid(row=row, column=col, sticky=Tkinter.EW) self.grid_columnconfigure(col, weight=1) col += 1 if not self.cancelButton: if self.crossImage: self.cancelButton = Button(self, image=self.crossImage, command=self.cancel, borderwidth=1) else: self.cancelButton = Button(self, text='Cancel', command=self.cancel, borderwidth=1, bg=blueColor) self.cancelButton.grid(row=row, column=col, sticky=Tkinter.EW) self.grid_columnconfigure(col, weight=1) def addWidget(self, row, value=None): if self.widgetType in ('Entry', 'IntEntry', 'FloatEntry'): option = '' if row < len(self.options): option = self.options[row] label = Label(self.topFrame, text=option or '', anchor='w') label.grid(row=row, column=0, sticky=Tkinter.E) self.labels.append(label) widget = self.widgetClass(self.topFrame, text=value, width=12) widget.grid(row=row, column=1, sticky=Tkinter.EW) widget.bind('<KeyPress-Return>', self.commit) widget.bind('<KeyPress-Escape>', self.cancel) elif self.widgetType == 'PulldownList': index = -1 if value in self.options: index = self.options.index(value or self.options[0]) widget = self.widgetClass(self.topFrame) widget.setup(self.options, self.options, index) widget.grid(row=row, column=0, columnspan=2, sticky=Tkinter.W) elif self.widgetType == 'PulldownMenu': index = -1 if value in self.options: index = self.options.index(value or self.options[0]) widget = self.widgetClass(self.topFrame) widget.setup(self.options, index) widget.grid(row=row, column=0, columnspan=2, sticky=Tkinter.W) elif self.widgetType == 'CheckButton': widget = self.widgetClass(self.topFrame) widget.set(value) widget.grid(row=row, column=0, sticky=Tkinter.W) option = '' if row < len(self.options): option = self.options[row] label = Label(self.topFrame, text=option or '', anchor='w') label.grid(row=row, column=1, sticky=Tkinter.W) self.labels.append(label) else: raise 'Widget type %s not supported in MultiWidget' % self.widgetType return widget def commit(self, event=None): values = self.get() if self.callback: self.callback(values) def cancel(self, event=None): if self.callback: self.callback(None) def addRow(self): if (self.maxRows is None) or (self.numRows < self.maxRows): row = self.numRows self.numRows += 1 if self.numRows > len(self.widgets): widget = self.addWidget(row) self.widgets.append(widget) else: widget = self.widgets[row] if self.widgetType in ('Entry', 'IntEntry', 'FloatEntry'): label = self.labels[row] label.grid(row=row, column=0, sticky=Tkinter.E) widget.grid(row=row, column=1, sticky=Tkinter.EW) elif self.widgetType == 'CheckButton': widget.grid(row=row, column=0, sticky=Tkinter.W) label = self.labels[row] label.grid(row=row, column=1, sticky=Tkinter.W) else: widget.grid(row=row, column=0, columnspan=2, sticky=Tkinter.W) if row == 0: self.topFrame.grid(row=0, column=0, columnspan=4, sticky=Tkinter.NSEW) self.updateButtons() def removeRow(self, doClear=0): if self.numRows > self.minRows: self.numRows -= 1 row = self.numRows widget = self.widgets[row] widget.grid_forget() if self.widgetType == 'CheckButton': label = self.labels[row] label.grid_forget() elif self.widgetType in ('Entry', 'IntEntry', 'FloatEntry'): label = self.labels[row] label.grid_forget() if doClear: self.updateWidget(row, None, '') if self.numRows == 0: self.topFrame.grid_forget() self.updateButtons()
self.toggled = not self.toggled if (self.command): self.command() if (self.toggled): dict = self.toggledDict else: dict = self.untoggledDict self.config(**dict) if (__name__ == '__main__'): import sys root = Tkinter.Tk() toggledDict = {'fg': 'darkred', 'relief': 'sunken'} untoggledDict = {'fg': 'black', 'relief': 'groove'} button = ToggleButton(root, text='hit me', tipText='Comment', toggledDict=toggledDict, untoggledDict=untoggledDict) button.grid() button = Button(root, text='quit', command=sys.exit) button.grid() root.mainloop()
def __init__(self, parent, application, *args, **kw): project = application.project simStore = project.findFirstNmrSimStore(application=APP_NAME) or \ project.newNmrSimStore(application=APP_NAME, name=APP_NAME) self.application = application self.residue = None self.structure = None self.serverCredentials = None self.iCingBaseUrl = DEFAULT_URL self.resultsUrl = None self.chain = None self.nmrProject = application.nmrProject self.serverDone = False NmrSimRunFrame.__init__(self, parent, project, simStore, *args, **kw) # # # # # # New Structure Frame # # # # # self.structureFrame.grid_forget() tab = self.tabbedFrame.frames[0] frame = Frame(tab, grid=(1,0)) frame.expandGrid(2,1) div = LabelDivider(frame, text='Structures', grid=(0,0), gridSpan=(1,2)) label = Label(frame, text='Ensemble: ', grid=(1,0)) self.structurePulldown = PulldownList(frame, callback=self.changeStructure, grid=(1,1)) headingList = ['Model','Use'] editWidgets = [None,None] editGetCallbacks = [None,self.toggleModel] editSetCallbacks = [None,None,] self.modelTable = ScrolledMatrix(frame, grid=(2,0), gridSpan=(1,2), callback=self.selectStructModel, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, headingList=headingList) texts = ['Activate Selected','Inactivate Selected'] commands = [self.activateModels, self.disableModels] buttons = ButtonList(frame, texts=texts, commands=commands, grid=(3,0), gridSpan=(1,2)) # # # # # # Submission frame # # # # # # tab = self.tabbedFrame.frames[1] tab.expandGrid(1,0) frame = LabelFrame(tab, text='Server Job Submission', grid=(0,0)) frame.expandGrid(None,2) srow = 0 label = Label(frame, text='iCing URL:', grid=(srow, 0)) urls = [DEFAULT_URL,] self.iCingBaseUrlPulldown = PulldownList(frame, texts=urls, objects=urls, index=0, grid=(srow,1)) srow +=1 label = Label(frame, text='Results File:', grid=(srow, 0)) self.resultFileEntry = Entry(frame, bd=1, text='', grid=(srow,1), width=50) self.setZipFileName() button = Button(frame, text='Choose File', bd=1, sticky='ew', command=self.chooseZipFile, grid=(srow, 2)) srow +=1 label = Label(frame, text='Results URL:', grid=(srow, 0)) self.resultUrlEntry = Entry(frame, bd=1, text='', grid=(srow,1), width=50) button = Button(frame, text='View Results HTML', bd=1, sticky='ew', command=self.viewHtmlResults, grid=(srow, 2)) srow +=1 texts = ['Submit Project!', 'Check Run Status', 'Purge Server Result', 'Download Results'] commands = [self.runCingServer, self.checkStatus, self.purgeCingServer, self.downloadResults] self.buttonBar = ButtonList(frame, texts=texts, commands=commands, grid=(srow, 0), gridSpan=(1,3)) for button in self.buttonBar.buttons[:1]: button.config(bg=CING_BLUE) # # # # # # Residue frame # # # # # # frame = LabelFrame(tab, text='Residue Options', grid=(1,0)) frame.expandGrid(1,1) label = Label(frame, text='Chain: ') label.grid(row=0,column=0,sticky='w') self.chainPulldown = PulldownList(frame, callback=self.changeChain) self.chainPulldown.grid(row=0,column=1,sticky='w') headingList = ['#','Residue','Linking','Decriptor','Use?'] editWidgets = [None,None,None,None,None] editGetCallbacks = [None,None,None,None,self.toggleResidue] editSetCallbacks = [None,None,None,None,None,] self.residueMatrix = ScrolledMatrix(frame, headingList=headingList, multiSelect=True, editWidgets=editWidgets, editGetCallbacks=editGetCallbacks, editSetCallbacks=editSetCallbacks, callback=self.selectResidue) self.residueMatrix.grid(row=1, column=0, columnspan=2, sticky = 'nsew') texts = ['Activate Selected','Inactivate Selected'] commands = [self.activateResidues, self.deactivateResidues] self.resButtons = ButtonList(frame, texts=texts, commands=commands,) self.resButtons.grid(row=2, column=0, columnspan=2, sticky='ew') """ # # # # # # Validate frame # # # # # # frame = LabelFrame(tab, text='Validation Options', grid=(2,0)) frame.expandGrid(None,2) srow = 0 self.selectCheckAssign = CheckButton(frame) self.selectCheckAssign.grid(row=srow, column=0,sticky='nw' ) self.selectCheckAssign.set(True) label = Label(frame, text='Assignments and shifts') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckResraint = CheckButton(frame) self.selectCheckResraint.grid(row=srow, column=0,sticky='nw' ) self.selectCheckResraint.set(True) label = Label(frame, text='Restraints') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckQueen = CheckButton(frame) self.selectCheckQueen.grid(row=srow, column=0,sticky='nw' ) self.selectCheckQueen.set(False) label = Label(frame, text='QUEEN') label.grid(row=srow,column=1,sticky='nw') srow += 1 self.selectCheckScript = CheckButton(frame) self.selectCheckScript.grid(row=srow, column=0,sticky='nw' ) self.selectCheckScript.set(False) label = Label(frame, text='User Python script\n(overriding option)') label.grid(row=srow,column=1,sticky='nw') self.validScriptEntry = Entry(frame, bd=1, text='') self.validScriptEntry.grid(row=srow,column=2,sticky='ew') scriptButton = Button(frame, bd=1, command=self.chooseValidScript, text='Browse') scriptButton.grid(row=srow,column=3,sticky='ew') """ # # # # # # # # # # self.update(simStore) self.administerNotifiers(application.registerNotify)
def __init__(self, parent, texts, commands, images=None, buttonBorderwidth=1, spacers=1, expands=True, font=None, direction=HORIZONTAL, sticky='ew', *args, **kw): assert direction in (HORIZONTAL, VERTICAL), 'direction = %s' % direction if (type(commands) is types.DictType): have_dict = True for key in commands.keys(): assert key in texts, 'key = %s' % key else: have_dict = False assert len(texts) == len( commands), 'len(texts) = %s, len(commands) = %s' % ( len(texts), len(commands)) if not kw.has_key('bg'): kw['bg'] = 'grey82' Frame.__init__(self, parent, sticky=sticky, *args, **kw) if (direction == Tkinter.HORIZONTAL): self.grid_rowconfigure(0, weight=1) else: self.grid_columnconfigure(0, weight=1) if images is None: images = [None] * len(texts) self.font = font self.spacers = spacers r = 0 c = 0 if expands: self.spacers = spacers = 0 for i in range(len(texts)): if texts[i]: if (direction == Tkinter.HORIZONTAL): self.grid_columnconfigure(i, weight=1) else: self.grid_rowconfigure(i, weight=1) else: if spacers and (direction == Tkinter.HORIZONTAL): self.grid_columnconfigure(c, weight=1) self.grid_columnconfigure(len(texts) + 1, weight=1) spacer1 = Spacer(self) spacer2 = Spacer(self) spacer1.grid(row=r, column=c, sticky=Tkinter.NSEW) spacer2.grid(row=r, column=len(texts) + 1, sticky=Tkinter.NSEW) c += 1 self.buttons = [] bg = kw['bg'] for n, text in enumerate(texts): if n < len(images): image = images[n] else: image = None if type(text) not in (STRING_TYPE, UNICODE_TYPE): text = str(text) if (have_dict): try: command = commands[text] except: command = lambda x=text: notYetImplemented(x) else: command = commands[n] if not command: command = lambda x=text: notYetImplemented(x) button = Button(self, text=text, command=command, bg=bg, image=image, borderwidth=buttonBorderwidth, font=self.font) button.grid(row=r, column=c, sticky=Tkinter.NSEW) self.buttons.append(button) if direction == Tkinter.HORIZONTAL: c = c + 1 else: r = r + 1
class RepositoryPropertiesFrame(Frame): def __init__(self, guiParent, basePopup): # Base popup required to handle notification of data model changes # e.g. new peak lists, so that the GUI can update to the latest # state self.basePopup = basePopup self.guiParent = guiParent self.registerNotify = basePopup.registerNotify self.unregisterNotify = basePopup.unregisterNotify Frame.__init__(self, guiParent) # set up the grid self.grid_columnconfigure(0, weight=1, minsize=10) self.grid_columnconfigure(1, weight=0, minsize=10) self.grid_columnconfigure(2, weight=0, minsize=20) self.grid_columnconfigure(3, weight=1, minsize=10) self.grid_rowconfigure(0, weight=1, minsize=5) self.grid_rowconfigure(1, weight=0, minsize=10) self.grid_rowconfigure(2, weight=0, minsize=10) self.grid_rowconfigure(3, weight=0, minsize=10) self.grid_rowconfigure(4, weight=0, minsize=10) self.grid_rowconfigure(5, weight=0, minsize=10) self.grid_rowconfigure(6, weight=1, minsize=5) # build up the body. # Column headers self.name_label = Label(self, text='Repository Name:') self.name_label.grid(row=1, column=1, padx=5, pady=5, sticky='w') self.name_value = Text(self, width=20, height=1, text="") self.name_value.grid(row=1, column=2, padx=5, pady=5, sticky='w') self.rep_label = Label(self, text='Repository Url:') self.rep_label.grid(row=2, column=1, padx=5, pady=5, sticky='w') self.rep_value = Text(self, width=20, height=1, text="") self.rep_value.grid(row=2, column=2, padx=5, pady=5, sticky='w') self.user_label = Label(self, text='Username:'******'w') self.user_value = Text(self, width=20, height=1, text="") self.user_value.grid(row=3, column=2, padx=5, pady=5, sticky='w') self.pswd_label = Label(self, text='Password:'******'w') self.pswd_value = Text(self, width=20, height=1, text="") self.pswd_value.grid(row=4, column=2, padx=5, pady=5, sticky='w') self.cancel_button = Button(self, width=10, height=1, text="Cancel", command=self.quit) self.cancel_button.grid(row=5, column=1, padx=5, pady=5, sticky='e') self.login_botton = Button(self, width=10, height=1, text="Connect", command=self.connectRepository) self.login_botton.grid(row=5, column=2, padx=5, pady=5, sticky='w') def connectRepository(self): # need to check that all values are input # trim off the end name = self.name_value.getText()[:-1] connect = self.rep_value.getText()[:-1] username = self.user_value.getText()[:-1] passwd = self.pswd_value.getText()[:-1] # need to test the connection and store the set of connections # locally (in rep?) self.basePopup.parent.repList.newRepository(name, connect, username) # there must be a better way of finding this! for ff in self.basePopup.parent.tabbedFrame.frames[0].children.values( ): ff.draw() self.basePopup.destroy() def administerNotifiers(self, notifyFunc): for func in ('__init__', 'delete', 'setName'): notifyFunc(self.updateAllAfter, 'ccp.nmr.Nmr.Experiment', func) notifyFunc(self.updateAllAfter, 'ccp.nmr.Nmr.DataSource', func) def updateAllAfter(self, obj): self.after_idle(self.updateAll) def updateAll(self, project=None): return def quit(self): self.guiParent.parent.destroy() def destroy(self): self.administerNotifiers(self.basePopup.unregisterNotify) Frame.destroy(self)