######################################### # This script is the standalone version # of contigViewer. # Brian Chan and Alexander Kozik # ######################################### import sys, urllib from Tkinter import * from tkMessageBox import * from tkFileDialog import * from string import * from math import log10 from math import fabs import tkFont # ==================================================== # global g_interestListWin = 0 # these are for the interest win g_interestListWin_open = 0 g_interestListIndex = 0 g_interestList_content = None # ==================================================== class contigViewerUserInputWindow( Frame ): def __init__(self): # set up the main window Frame.__init__(self) root = self.root = self.master root.title("Blast Info Viewer") # root.geometry( "600x200" ) myRow = 0 # keep track of the row number (for grid manager) # first row frame_1 = Frame(root) frame_1.pack(side = TOP, fill = X) self.input1_label = Label(frame_1, text="info file:", width=18) self.input1_label.pack(side = LEFT) self.input1_text = Entry(frame_1, name="input1_text", width=40) self.input1_text.pack(side = LEFT) self.input1_browse_btn = Button(frame_1, text="Browse", command=self.getInputFile1) self.input1_browse_btn.pack(side = LEFT) self.input1_load_btn = Button(frame_1, text="Load", command=self.loadInputFile1) self.input1_load_btn.pack(side = LEFT) self.input1_text.insert(0, "x-let-ath-blastX.info2") # second row myRow = myRow + 1 frame_2 = Frame(root) frame_2.pack(side = TOP, fill = X) self.input2_label = Label(frame_2, text="position file:", width=18) self.input2_label.pack(side = LEFT) self.input2_text = Entry(frame_2, name="input2_text", width=40) self.input2_text.pack(side = LEFT) self.input2_browse_btn = Button(frame_2, text="Browse", command=self.getInputFile2) self.input2_browse_btn.pack(side = LEFT) self.input2_load_btn = Button(frame_2, text="Load", command=self.loadInputFile2) self.input2_load_btn.pack(side = LEFT) self.input2_text.insert(0, "x-ath_NCBI_genes.coords.nr") # third row myRow = myRow + 1 frame_3 = Frame(root) frame_3.pack(side = TOP, fill = X) self.input3_label = Label(frame_3, text="seq tab file:", width=18) self.input3_label.pack(side = LEFT) self.input3_text = Entry(frame_3, name="input3_text", width=40) self.input3_text.pack(side = LEFT) self.input3_browse_btn = Button(frame_3, text="Browse", command=self.getInputFile3) self.input3_browse_btn.pack(side = LEFT) self.input3_load_btn = Button(frame_3, text="Load", command=self.loadInputFile3) self.input3_load_btn.pack(side = LEFT) self.input3_text.insert(0, "x-lettuce_assembly.tab") # load both myRow = myRow + 1 frame_23 = Frame(root) frame_23.pack(side = TOP, fill = X) self.loadAll_btn = Button(frame_23, text="Load All", command=self.loadInputFiles, width=12, bg="orange") self.loadAll_btn.pack(side = LEFT) self.status_label = Label(frame_23, text=".....") self.status_label.pack(side = LEFT) # forth row myRow = myRow + 1 frame_4 = Frame(root) frame_4.pack(side = TOP, fill = X) self.queryID_label = Label(frame_4, text="Query ID:", width=18) self.queryID_label.pack(side = LEFT) self.queryID_text = Entry(frame_4, name="queryID_text", bg="lightgreen") self.queryID_text.pack(side = LEFT) self.queryID_btn = Button(frame_4, text="Search", command=self.searchQueryID) self.queryID_btn.pack(side = LEFT) self.queryID_text.bind("", self.searchQueryID) self.queryID_text.insert(0, "QG_CA_Contig1258") # fifth row myRow = myRow + 1 frame_5 = Frame(root) frame_5.pack(side = TOP, fill = X) self.subjectID_label = Label(frame_5, text="Subject ID:", width=18) self.subjectID_label.pack(side = LEFT) self.subjectID_text = Entry(frame_5, name="subjectID_text") self.subjectID_text.pack(side = LEFT) self.subjectID_btn = Button(frame_5, text="Search", command=self.searchSubjectID) self.subjectID_btn.pack(side = LEFT) self.subjectID_text.bind("", self.searchSubjectID) self.subjectID_text.insert(0, "At2g45260") # sixth row myRow = myRow + 1 frame_6 = Frame(root) frame_6.pack(side = TOP, fill = X) self.hitN_label = Label(frame_6, text="Hit N:", width=18) self.hitN_label.pack(side = LEFT) self.hitN_text = Entry(frame_6, name="hit_N") self.hitN_text.pack(side = LEFT) self.hitN_text.insert(0, "1") # make menu self.makemenu() # --------------------------------------------------- def getInputFile1(self): filename = askopenfilename() if filename == "": return self.input1_text.delete(0, END) self.input1_text.insert(0, filename) def getInputFile2(self): filename = askopenfilename() if filename == "": return self.input2_text.delete(0, END) self.input2_text.insert(0, filename) def getInputFile3(self): filename = askopenfilename() if filename == "": return self.input3_text.delete(0, END) self.input3_text.insert(0, filename) # --------------------------------------------------- def loadInputFiles(self): self.status_label.configure(text="start loading file 1...") self.root.update() self.loadInputFile1() self.status_label.configure(text="start loading file 2...") self.root.update() self.loadInputFile2() self.status_label.configure(text="start loading file 3...") self.root.update() self.loadInputFile3() self.status_label.configure(text="finish loading...") """ q_id = 'QG_CA_Contig1' print q_id print self.QID_data[q_id] print "---------" """ def loadInputFile1(self): # clear old data self.QID1_data = {} self.SID1_data = {} self.QID2_data = {} self.SID2_data = {} self.QID3_data = {} self.SID3_data = {} # get raw data infoData = self.getData( self.input1_text.get() ) delimiter = "\t" for line in infoData: if find(line, "no_hits_found") != -1: continue cells = split(line, delimiter) hit_num = int(cells[7]) # if hit_num != 1: if hit_num == 1: # up to here, they are all lines with hit_num = 1 queryID = cells[0] subjectID = cells[1] query_first = int(cells[9]) query_last = int(cells[10]) subject_first = int(cells[11]) subject_last = int(cells[12]) len_q_str, len_s_str = split(cells[13], "/") len_q = int(len_q_str) len_s = int(len_s_str) data = [subjectID, query_first, query_last, subject_first, subject_last, len_q, len_s] self.QID1_data[queryID] = data if self.SID1_data.has_key(subjectID): self.SID1_data[subjectID].append(queryID) else: self.SID1_data[subjectID] = [queryID] if hit_num == 2: # up to here, they are all lines with hit_num = 2 queryID = cells[0] subjectID = cells[1] query_first = int(cells[9]) query_last = int(cells[10]) subject_first = int(cells[11]) subject_last = int(cells[12]) len_q_str, len_s_str = split(cells[13], "/") len_q = int(len_q_str) len_s = int(len_s_str) data = [subjectID, query_first, query_last, subject_first, subject_last, len_q, len_s] self.QID2_data[queryID] = data if self.SID2_data.has_key(subjectID): self.SID2_data[subjectID].append(queryID) else: self.SID2_data[subjectID] = [queryID] if hit_num == 3: # up to here, they are all lines with hit_num = 3 queryID = cells[0] subjectID = cells[1] query_first = int(cells[9]) query_last = int(cells[10]) subject_first = int(cells[11]) subject_last = int(cells[12]) len_q_str, len_s_str = split(cells[13], "/") len_q = int(len_q_str) len_s = int(len_s_str) data = [subjectID, query_first, query_last, subject_first, subject_last, len_q, len_s] self.QID3_data[queryID] = data if self.SID3_data.has_key(subjectID): self.SID3_data[subjectID].append(queryID) else: self.SID3_data[subjectID] = [queryID] def loadInputFile2(self): # clear old data self.GI_data = {} # get raw data posData = self.getData( self.input2_text.get() ) delimiter = "\t" for line in posData: line = strip(line) cells = split(line, delimiter) fr = cells[3] # gi_id = cells[4] gi_id = cells[0] ie = cells[5] data = [fr, ie] self.GI_data[gi_id] = data def loadInputFile3(self): # clear old data self.seq_data = {} # get raw data seqData = self.getData( self.input3_text.get() ) delimiter = "\t" for line in seqData: line = strip(line) cells = split(line, delimiter) seqName = cells[0] seqBody = cells[2] self.seq_data[seqName] = seqBody def getData(self, filename): if filename: all_lines = open(filename, 'r').readlines() else: showinfo('Error', 'file is corrupted') return all_lines # --------------------------------------------------- def searchQueryID(self, o=None): which_hit = self.hitN_text.get() print which_hit queryID = self.queryID_text.get() if which_hit == "1": if not self.QID1_data.has_key(queryID): showinfo('Error', 'No such query ID: ' + str(queryID)) return infoData = self.QID1_data[queryID] subjectID = infoData[0] posData = self.GI_data[subjectID] seqBody = self.seq_data[queryID] self.plotGraph(queryID, infoData, posData, seqBody, which_hit) if which_hit == "2": if not self.QID2_data.has_key(queryID): showinfo('Error', 'No such query ID: ' + str(queryID)) return infoData = self.QID2_data[queryID] subjectID = infoData[0] posData = self.GI_data[subjectID] seqBody = self.seq_data[queryID] self.plotGraph(queryID, infoData, posData, seqBody, which_hit) if which_hit == "3": if not self.QID3_data.has_key(queryID): showinfo('Error', 'No such query ID: ' + str(queryID)) return infoData = self.QID3_data[queryID] subjectID = infoData[0] posData = self.GI_data[subjectID] seqBody = self.seq_data[queryID] self.plotGraph(queryID, infoData, posData, seqBody, which_hit) def searchSubjectID(self, o=None): which_hit = self.hitN_text.get() print which_hit subjectID = self.subjectID_text.get() if which_hit == "1": if self.SID1_data.has_key(subjectID): queryID_list = self.SID1_data[subjectID] else: showinfo('Error', 'No such subject ID: ' + str(subjectID)) return print queryID_list queryID = queryID_list[0] infoData = self.QID_data[queryID] subjectID = infoData[0] posData = self.GI_data[subjectID] seqBody = self.seq_data[queryID] # eventually make this another select box self.plotGraph(queryID, infoData, posData, seqBody, which_hit) if which_hit == "2": if self.SID2_data.has_key(subjectID): queryID_list = self.SID2_data[subjectID] else: showinfo('Error', 'No such subject ID: ' + str(subjectID)) return print queryID_list queryID = queryID_list[0] infoData = self.QID_data[queryID] subjectID = infoData[0] posData = self.GI_data[subjectID] seqBody = self.seq_data[queryID] # eventually make this another select box self.plotGraph(queryID, infoData, posData, seqBody, which_hit) if which_hit == "3": if self.SID3_data.has_key(subjectID): queryID_list = self.SID3_data[subjectID] else: showinfo('Error', 'No such subject ID: ' + str(subjectID)) return print queryID_list queryID = queryID_list[0] infoData = self.QID_data[queryID] subjectID = infoData[0] posData = self.GI_data[subjectID] seqBody = self.seq_data[queryID] # eventually make this another select box self.plotGraph(queryID, infoData, posData, seqBody, which_hit) # --------------------------------------------------- def makemenu(self): self.menubar = Menu(self.master) self.master.config(menu=self.menubar) # add file pulldown menu file = Menu(self.menubar, tearoff=0) file.add_command(label='Quit', command=self.quit) self.menubar.add_cascade(label='File', underline=0, menu=file) # add help pulldown menu help = Menu(self.menubar, tearoff=0) help.add_command(label='About', command=self.openAboutWin) self.menubar.add_cascade(label='Help', underline=0, menu=help) # --------------------------------------------------- def quit(self): if askyesno('Really quit?', 'Are you sure you want to quit?'): Frame.quit(self) # --------------------------------------------------- def openAboutWin(self): s = """ In the sequence window, the top bar is the arabidopsis, the bottom bar is the lettuce. """ showinfo('About:', s) # --------------------------------------------------- def plotGraph(self, queryID, infoData, posData, seqBody, which_hit): # generate picture cv = contigViewerClass(queryID, infoData, posData, which_hit) cv.generatePicture() tv = textViewerClass(queryID, infoData, seqBody, which_hit) tv.displayText() # --------------------------------------------------- # =================================================== class textViewerClass( Frame ): def __init__(self, queryID, infoData, seqBody, which_hit): self.queryID = queryID self.seqBody = seqBody self.subjectID = infoData[0] self.query_first = infoData[1] self.query_last = infoData[2] self.subject_first = infoData[3] self.subject_last = infoData[4] self.len_q = infoData[5] self.len_s = infoData[6] self.hitN = which_hit def displayText(self): # setup up a new window and a new picture self.textWin = Toplevel() self.textWin.title( "Query ID: " + str(self.queryID) + " Hit_N: " + self.hitN) maxX = 100 maxY = 10 frame_1 = Frame(self.textWin) frame_1.pack(side = TOP, fill = BOTH, expand = True) myFont = tkFont.Font(family="Courier", size="10") self.content = Text(frame_1, width=maxX, height=maxY, wrap=NONE, font=myFont) self.content.pack(side = LEFT, fill = BOTH, expand = True) # set up a scrollable bar vertical_scrollbar = Scrollbar(frame_1, orient=VERTICAL, command=self.content.yview) vertical_scrollbar.pack(side = LEFT, fill = Y) vertical_scrollbar.width = 10 self.content.config(yscrollcommand=vertical_scrollbar.set) # insert the seq name and body self.content.insert("0.1", ">" + str(self.queryID) + "\n") row = 0 count = 0 size = len(self.seqBody) while count < size: end = 0 row += 1 if count+maxX < size: self.content.insert(END, self.seqBody[count:count+maxX] + "\n") count = row * maxX end = maxX else: self.content.insert(END, self.seqBody[count:] + "\n") end = size - count count = size """ print row print count print end print "------" """ # add tag for i in range(end): index = (row-1)*maxX+i+1 if (index >= self.query_first and index <= self.query_last) or (index <= self.query_first and index >= self.query_last): index_str = str(row+1) + "." + str(i) self.content.tag_add("alignment", index_str) #print index_str #print "=============" self.content.tag_config("alignment", background = "yellow") #print self.seqBody # =================================================== class contigViewerClass( Frame ): def __init__(self, queryID, infoData, posData, which_hit): # init this class self.queryID = queryID self.subjectID = infoData[0] self.query_first = infoData[1] self.query_last = infoData[2] self.subject_first = infoData[3] self.subject_last = infoData[4] self.len_q = infoData[5] self.len_s = infoData[6] self.hitN = which_hit print infoData print posData # change direction self.dir_bottom_bar = "F" if self.query_first > self.query_last: self.query_first, self.query_last = self.query_last, self.query_first self.dir_bottom_bar = "R" if posData[0] == "forward": self.dir_top_bar = "F" else: self.dir_top_bar = "R" # store exons info positions = posData[1] exons_raw = split(positions, "|") self.introns = [] self.exons = [] for exon_raw in exons_raw: index1_str, index2_str = split(exon_raw, "-") index1, index2 = int(index1_str), int(index2_str) if self.dir_top_bar == "F": self.exons.append( [index1, index2] ) elif self.dir_top_bar == "R": self.exons.append( [index2, index1] ) if self.dir_top_bar == "R": self.exons.reverse() # store introns info if len(self.exons) > 1: numExons = len(self.exons) for ei in range(numExons-1): left_pair = self.exons[ei] right_pair = self.exons[ei+1] left = left_pair[1] right = right_pair[0] intron_size = right - left self.introns.append( intron_size ) # constants for the graph self.graphChartSizeX = 1000 # the left part of the image (histogram) self.hSpace = 50 # horizontal empty space self.vSpace = 20 # vertical empty space # actual graph chart sizeX self.adjustedGraphChartSizeX = self.graphChartSizeX - self.hSpace * 2 self.barHeight = 10 # the height of the bar of seqs self.maxImageSizeX = self.graphChartSizeX # total X pixels self.maxImageSizeY = 3*self.barHeight + 3*self.vSpace # total Y pixels self.maxGeneLen = 0 # end of contig (not known yet) self.charSpace = 4 # the # of pixel to display a char (horizontally) # calculate the dimensions' parameters self.numOfBars = 2 self.maxGeneLen = self.len_s # --------------------------------------------------- def generatePicture(self): # setup up a new window and a new picture self.ViewerWin = Toplevel() self.ViewerWin.title( "Query ID: " + str(self.queryID) + " -- Subject ID: " + self.subjectID + " Hit_N: " + self.hitN) frame_1 = Frame(self.ViewerWin) frame_1.pack(side = TOP, fill = BOTH, expand = True) self.pic = Canvas(frame_1, width=self.maxImageSizeX, height=self.maxImageSizeY, bg='black') self.pic.pack(side = LEFT, fill = BOTH, expand = True) # set up a scrollable bar vertical_scrollbar = Scrollbar(frame_1, orient=VERTICAL, command=self.pic.yview) vertical_scrollbar.pack(side = LEFT, fill = Y) vertical_scrollbar.width = 10 self.pic.config(yscrollcommand=vertical_scrollbar.set) self.pic.config(scrollregion=(0,0,self.maxImageSizeX,self.maxImageSizeY)) # change the mouse icon for this canvas self.pic.config(cursor="crosshair") # plot it out ------------------------------------ # draw the two seqs textcolor = 'white' # pick text color for each seq posY = self.vSpace + 0 * (self.vSpace+self.barHeight) text_barHeight = self.barHeight # height for the text # first bar ------------------------ """ self.query_first = data[0] self.query_last = data[1] self.subject_first = data[2] self.subject_last = data[3] self.len_q = data[4] self.len_s = data[5] """ # place the longer seq bar barcolor = 'blue' start = 1.0 end = self.len_s posX_start = self.hSpace + (start/self.maxGeneLen)*self.adjustedGraphChartSizeX posX_end = self.hSpace + (end/self.maxGeneLen)*self.adjustedGraphChartSizeX posY_start = posY posY_end = posY_start + self.barHeight self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) # place the shorter seq bar barcolor = 'yellow' start = self.subject_first * 1.0 end = self.subject_last * 1.0 posX_start = self.hSpace + (start/self.maxGeneLen)*self.adjustedGraphChartSizeX posX_end = self.hSpace + (end/self.maxGeneLen)*self.adjustedGraphChartSizeX posY_start = posY posY_end = posY_start + self.barHeight self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) # place the start index start = self.subject_first posX = self.hSpace + (start*1.0/self.maxGeneLen)*self.adjustedGraphChartSizeX - self.charSpace * ( log10(start)+1 ) self.pic.create_text(posX, text_barHeight, text=(str(start)+" aa"), fill=textcolor) # place the end index end = self.len_s posX = self.hSpace + (end/self.maxGeneLen)*self.adjustedGraphChartSizeX + self.charSpace * ( log10(end)+4 ) self.pic.create_text(posX, text_barHeight, text=(str(end)+" aa"), fill=textcolor) # place position info middle = self.subject_last * 1.0 posX = self.hSpace + (middle/self.maxGeneLen)*self.adjustedGraphChartSizeX - self.charSpace * ( log10(middle)+1 ) self.pic.create_text(posX, text_barHeight, text=(str(int(middle))+" aa"), fill=textcolor) # place the direction dir = self.dir_top_bar posX = self.hSpace + self.adjustedGraphChartSizeX + self.charSpace * 3 self.pic.create_text(posX, text_barHeight+self.barHeight*1.5, text=dir, fill=textcolor) # put introns and exons ------------------------ print "exons: " + str(self.exons) print "introns: " + str(self.introns) exon_lens = [] exon_sum = 0 for exon_pair in self.exons: #diff = exon_pair[1] - exon_pair[0] diff = int( fabs(exon_pair[1]-exon_pair[0]) ) exon_lens.append( diff ) exon_sum += diff print "exon lens: " + str(exon_lens) print "exon sum: " + str(exon_sum) #== place exons curr_pos = 0 if len(exon_lens) > 1: for exon_l in exon_lens: middle = curr_pos+(exon_l/2.0) posX = self.hSpace + (middle/exon_sum)*self.adjustedGraphChartSizeX self.pic.create_text(posX, text_barHeight+self.barHeight*2.5, text=str(exon_l), fill=textcolor) curr_pos += exon_l #== place introns #-- place vertical lines intronLineColor = "red" curr_pos = 0 for intron_i in range( len(self.introns) ): pos = curr_pos + exon_lens[intron_i] * 1.0 posX_start = self.hSpace + (pos/exon_sum)*self.adjustedGraphChartSizeX posX_end = posX_start+1 posY_start = posY posY_end = posY_start + self.barHeight self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=intronLineColor) # draw triangle triangle_size = 10 posX1 = posX_start posY1 = posY_end posX2 = posX1 - triangle_size posY2 = posY1 + triangle_size posX3 = posX1 + triangle_size posY3 = posY1 + triangle_size self.pic.create_line(posX1, posY1, posX2, posY2, fill=intronLineColor) self.pic.create_line(posX1, posY1, posX3, posY3, fill=intronLineColor) self.pic.create_line(posX2, posY2, posX3, posY3, fill=intronLineColor) # place intron value intron_val = self.introns[intron_i] posX = posX_start self.pic.create_text(posX, text_barHeight+self.barHeight*2.5+triangle_size+1, text=str(intron_val), fill=textcolor) # update curr pos curr_pos += exon_lens[intron_i] * 1.0 # second bar ------------------------ posY = self.vSpace + 1 * (self.vSpace+self.barHeight) + self.barHeight text_barHeight = posY+self.barHeight*2.0 # height for the text # place the longer seq bar barcolor = 'blue' start = self.subject_first - self.query_first / 3.0 + 1 if start < 1: start = 1.0 end = self.subject_first + self.len_q / 3.0 start_long, end_long = start, end if self.dir_bottom_bar == "R": middle = (self.subject_last + self.subject_first) / 2.0 end_long = (middle-start) + middle start_long = middle - (end-middle) if start_long < 1.0: start_long = 1.0 posX_start = self.hSpace + (start_long/self.maxGeneLen)*self.adjustedGraphChartSizeX posX_end = self.hSpace + (end_long/self.maxGeneLen)*self.adjustedGraphChartSizeX posY_start = posY posY_end = posY_start + self.barHeight self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) # place the left extention broken bar hSegment = self.hSpace / 8.0 if (self.subject_first - self.query_first/3.0) < 0 or start_long <= 1.0: posX_start = hSegment*3.5 posX_end = posX_start+hSegment self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) posX_start = hSegment*5 posX_end = posX_start+hSegment self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) posX_start = hSegment*6.5 posX_end = posX_start+hSegment self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) # decide start and end indexes start = self.subject_first * 1.0 end = self.subject_last * 1.0 if self.dir_bottom_bar == "F": start_str = self.query_first end_str = self.query_last else: end_str = self.query_first start_str = self.query_last # place the start index posX = self.hSpace + (start/self.maxGeneLen)*self.adjustedGraphChartSizeX - self.charSpace * ( log10(start)+1 ) self.pic.create_text(posX, text_barHeight, text=(str(start_str)+" nt"), fill=textcolor) # place the end index posX = self.hSpace + (end/self.maxGeneLen)*self.adjustedGraphChartSizeX + self.charSpace * ( log10(end)+1 ) self.pic.create_text(posX, text_barHeight, text=(str(end_str)+" nt"), fill=textcolor) # place the shorter seq bar barcolor = 'lightgreen' start = self.subject_first * 1.0 end = self.subject_last * 1.0 posX_start = self.hSpace + (start/self.maxGeneLen)*self.adjustedGraphChartSizeX posX_end = self.hSpace + (end/self.maxGeneLen)*self.adjustedGraphChartSizeX posY_start = posY posY_end = posY_start + self.barHeight self.pic.create_rectangle(posX_start, posY_start, posX_end, posY_end, width=0, fill=barcolor) # place the direction dir = self.dir_bottom_bar posX = self.hSpace + self.adjustedGraphChartSizeX + self.charSpace * 3 self.pic.create_text(posX, text_barHeight-self.barHeight*1.5, text=dir, fill=textcolor) # --------------------------------------------------- def highlightTextWinGenes(self): L_str = self.CVLTR_L_text.get() # left index LX_str = self.CVLTR_LX_text.get() # left excluded index R_str = self.CVLTR_R_text.get() # right index RX_str = self.CVLTR_RX_text.get() # right excluded index doLeftFlag = 1 # indicate we should highlight the left one doRightFlag = 1 # indicate we should highlight the right one if L_str == "" or LX_str == "": # no input yet, so quit doLeftFlag = 0 if R_str == "" or RX_str == "": # no input yet, so quit doRightFlag = 0 # clear the old background color self.SeqTextWin_content.tag_delete('interested_tag') # draw the new background color if doLeftFlag == 1: L = int(L_str) + self.seqNameCharSpace LX = int(LX_str) + self.seqNameCharSpace for i in range(1, self.numOfBars+1): startingPos = "%d.%d" % (i, LX) endingPos = "%d.%d" % (i, L) self.SeqTextWin_content.tag_add('interested_tag', startingPos, endingPos) if doRightFlag == 1: R = int(R_str) + self.seqNameCharSpace RX = int(RX_str) + self.seqNameCharSpace for i in range(1, self.numOfBars+1): startingPos = "%d.%d" % (i, R) endingPos = "%d.%d" % (i, RX) self.SeqTextWin_content.tag_add('interested_tag', startingPos, endingPos) self.SeqTextWin_content.tag_config('interested_tag', background='yellow') # --------------------------------------------------- # --------------------------------------------------- # --------------------------------------------------- # --------------------------------------------------- ######################################### def main(): contigViewerUserInputWindow().mainloop() if __name__ == "__main__": main()