def test_2x2grid_config_font_from_list(self): buttons = [] button = Tkbutton(self.master,text='foobar') button.grid(row=0,column=0) buttons.append(button) button = Tkbutton(self.master,text='foobar') button.grid(row=1,column=0) buttons.append(button) button = Tkbutton(self.master,text='foobar') button.grid(row=0,column=1) buttons.append(button) button = Tkbutton(self.master,text='foobar') button.grid(row=1,column=1) buttons.append(button) font = tkFont.Font(family="Monospace", size=36) for button in buttons: button.configure(font=font) self.master.mainloop()
def initUI(self): self.parent.title("Layout Test") self.config(bg = '#F0F0F0') self.pack(fill = BOTH, expand = 1) #create canvas canvas1 = Canvas(self, relief = FLAT, background = "#D2D2D2", width = 180, height = 500) canvas1.pack(side = TOP, anchor = NW, padx = 10, pady = 10) #add quit button button1 = Button(canvas1, text = "Quit", command = self.quit, anchor = W) button1.configure(width = 10, activebackground = "#ee0000", relief = FLAT) button1.pack(side = TOP) button2 = Button(canvas1, text = "Start", command = self.print_out, anchor = W) button2.configure(width = 10, activebackground = "#00ee00", relief = FLAT) button2.pack(side = TOP)
def test_config_font(self): button = Tkbutton(self.master,text='foobar') button.pack(side=LEFT, fill=BOTH,expand=1) font = tkFont.Font(family="Monospace", size=20) button.configure(font=font)
def test_2x2grid_config_font(self): button1 = Tkbutton(self.master,text='foobar') button1.grid(row=0,column=0) button2 = Tkbutton(self.master,text='foobar') button2.grid(row=1,column=0) button3 = Tkbutton(self.master,text='foobar') button3.grid(row=0,column=1) button4 = Tkbutton(self.master,text='foobar') button4.grid(row=1,column=1) font = tkFont.Font(family="Monospace", size=36) button2.configure(font=font)
def __init__(self): window=Tk() window.title('Scientific Calculator') window.configure(background="white") self.string=StringVar() entry=Entry(window,textvariable=self.string) entry.grid(row=0,column=0,columnspan=6) entry.configure(background="white") entry.focus() values=["7","8","9","/","%","clear","AC", "4","5","6","*","(",")","**", "1","2","3","-","=",",","0",".","min","+","sin","asin","cos","acos","tan()", "pow","log10","max","abs","floor","pi","e","log","ceil","degrees","radians"] text=1 i=0 row=1 col=0 for txt in values: padx=10 pady=10 if(i==7): row=2 col=0 if(i==14): row=3 col=0 if(i==19): row=4 col=0 if(i==26): row=5 col=0 if(i==33): row=6 col=0 if(txt=='='): btn=Button(window,height=2,width=4,padx=70,pady=pady,text=txt,command=lambda txt=txt:self.equals()) btn.grid(row=row,column=col,columnspan=3,padx=2,pady=2) btn.configure(background="yellow") elif(txt=='clear'): btn=Button(window,height=2,width=4,padx=padx,pady=pady, text=txt ,command=lambda txt=txt:self.delete()) btn.grid(row=row,column=col,padx=1,pady=1) btn.configure(background="grey") elif(txt=='AC'): btn=Button(window,height=2,width=4,padx=padx,pady=pady,text=txt,command=lambda txt=txt:self.clearall()) btn.grid(row=row,column=col,padx=1,pady=1) btn.configure(background="red") else: btn=Button(window,height=2,width=4,padx=padx,pady=pady,text=txt ,command=lambda txt=txt:self.addChar(txt)) btn.grid(row=row,column=col,padx=1,pady=1) btn.configure(background="cyan") col=col+1 i=i+1 window.mainloop()
def add_tabs(self, tabs=None): """ Add tab or lot of tabs tabs args is a list of dict where dict is a single tab format of dict is : * title => title for this tab * content => content for this tab If no title's defined the default title as NaN If no centent's defined the default content is the index of the tabs """ if not tabs or len(tabs) == 0: raise TabsError('Tabs args is required.') for current_tabs in tabs: # Button configure button = Button( self.frame_btn, text=current_tabs.get('title', 'NaN') ) button.configure( state='disabled', relief='flat', highlightbackground='white' ) button.pack(side='left') # Content configure #content = Frame(self.frame_content) content = current_tabs.get( 'content', Label(text='Tab %s' % len(self.content)) ) content.config() arguments = {'button' : button, 'content' : content} button.bind( '<Button-1>', lambda event, args=arguments: self.show_tabs(event, args) ) #component = current_tabs.get('content', Label(text='Tabs %d' % len(self.onglets))) #component.pack(side='bottom') self.onglets.append(button) self.content.append(content) if len(self.onglets) == 1: button.configure(state='normal', highlightbackground='gray') content.pack(side='bottom', fill='both', expand='yes')
def initTimeSelectionBtns(root, canvas): # Inits buttons for time selection fiveMinuteBtn = Button(canvas, text ="5 Minutes", command = lambda: setTime(root,canvas, 5)) fiveMinuteBtn.configure(width = 10) # 5 Mins canvas.data.fiveMinuteBtn = fiveMinuteBtn threeMinuteBtn = Button(canvas, text = "3 Minutes", command = lambda: setTime(root,canvas, 3)) threeMinuteBtn.configure(width = 10) canvas.data.threeMinuteBtn = threeMinuteBtn # 3 Mins oneMinuteBtn = Button(canvas, text = "1 Minute", command = lambda: setTime(root, canvas, 1)) oneMinuteBtn.configure(width = 10) canvas.data.oneMinuteBtn = oneMinuteBtn # 1 Min noTimeBtn = Button(canvas, text = "No Limit", command = lambda: setTime(root, canvas, -1)) noTimeBtn.configure(width = 10) canvas.data.noTimeBtn = noTimeBtn # No Time Limit endBtn = Button(text = "END GAME !", command = lambda:gameOver(canvas)) endBtn.configure(width = 18) canvas.data.endBtn = endBtn # End Game
def initFeatureBtns(root,canvas): # Inits buttons to do with game features instructionsBtn = Button( text = "GAME INSTRUCTIONS", command = printInstructions) instructionsBtn.configure(width = 30) canvas.data.instructionsBtn = instructionsBtn # Displays Instructions gameRules = Button( text = "GAME RULES !", command=printInstructions) gameRules.configure(width = 10) canvas.data.gameRules = gameRules # Displays Game Rules helpBtn = Button( text = "HELP !", command = lambda: printHelp(canvas)) helpBtn.configure(width = 10) canvas.data.helpBtn = helpBtn # Displays Help Instructions Style().configure('blue.TButton', foreground='blue') aboutBtn = Button(text = "ABOUT", style='blue.TButton', command=lambda: drawAbout(canvas)) aboutBtn.configure(width = 30) canvas.data.aboutBtn = aboutBtn # Displays about screen backBtn = Button(text = "BACK",command=lambda: initGame(root, canvas)) backBtn.configure(width = 15) canvas.data.backBtn = backBtn # Displays back button
def addButtonI(self, dim=(0, 0, 206, 109), x=0, y=0, command=0): try: crop = self.__texture[0].crop(dim) render = ImageTk.PhotoImage(crop) nbutton = Button(self, image=render, bg="#4a4a4a", borderwidth=0, activebackground="#4d86a1") nbutton.image = render nbutton.place(x=x, y=y) self.__list_button.append(nbutton) if command == 1: nbutton.configure(command=self.showOne) elif command == 2: nbutton.configure(command=self.showAll) elif command == 3: pass elif command == 4: nbutton.configure(command=self.master.destroy) return nbutton except Exception as e: self.Error("Error al cargar Texturas") return -1
def __init__(self): window=Tk() window.title('Calculator') window.configure(background="black") self.string=StringVar() entry=Entry(window,textvariable=self.string) entry.grid(row=0,column=0,columnspan=20) entry.configure(background="white") entry.focus() values=["7","8","9","/","%","clear", "4","5","6","*","+","AC", "1","2","3","-","0","="] text=1 i=0 row=1 col=0 for txt in values: padx=5 pady=5 if(i==6): row=2 col=0 if(i==12): row=3 col=0 if(i==18): row=4 col=0 if(txt=='='): btn=Button(window,height=2,width=4,padx=50,pady=pady,text=txt,command=lambda txt=txt:self.equals()) btn.grid(row=row,column=col,columnspan=3,padx=1,pady=1) btn.configure(background="red") elif(txt=='clear'): btn=Button(window,height=2,width=4,padx=padx,pady=pady, text=txt ,command=lambda txt=txt:self.delete()) btn.grid(row=row,column=col,padx=1,pady=1) btn.configure(background="yellow") elif(txt=='AC'): btn=Button(window,height=2,width=4,padx=padx,pady=pady,text=txt,command=lambda txt=txt:self.clearall()) btn.grid(row=row,column=col,padx=1,pady=1) btn.configure(background="red") else: btn=Button(window,height=2,width=4,padx=padx,pady=pady,text=txt ,command=lambda txt=txt:self.addChar(txt)) btn.grid(row=row,column=col,padx=1,pady=1) btn.configure(background="grey") col=col+1 i=i+1 window.mainloop()
def initBoardSelectionBtns(root, canvas): # Inits buttons to do with Board fourByFourBtn = Button(canvas, text = "4 X 4", command = lambda: dimensionCombo(canvas, 4))#setDimension(4)) fourByFourBtn.configure(width = 15) canvas.data.fourByFourBtn = fourByFourBtn fiveByFiveBtn = Button(canvas, text = "5 X 5", command = lambda: dimensionCombo(canvas, 5)) #setDimension(5)) fiveByFiveBtn.configure(width = 15) canvas.data.fiveByFiveBtn = fiveByFiveBtn rotateBtn = Button(text = "ROTATE", command = lambda:rotate2dList(canvas)) rotateBtn.configure(width = 6) canvas.data.rotateBtn = rotateBtn
def initGameStateBtns(root, canvas): # Inits buttons to do with game state buttonImg = canvas.data.imageDict["buttonImage"] startGameBtn = Button(image=buttonImg,command =lambda: redrawGame(canvas)) startGameBtn.image = buttonImg # PLAY BUTTON canvas.data.startGameBtn = startGameBtn restartBtn = Button(text="MAIN MENU",command=lambda:comboFunc(root,canvas)) restartBtn.configure(width = 12) canvas.data.restartBtn = restartBtn # RESTART Style().configure('red.TButton', foreground='red') quitBtn = Button(text = "QUIT", style='red.TButton', command = quit) quitBtn.configure(width = 5) canvas.data.quitBtn = quitBtn # QUIT pauseBtn = Button(text = "PAUSE", style='red.TButton', command = lambda: pauseResumeTrigger(canvas)) pauseBtn.configure(width = 12) canvas.data.pauseBtn = pauseBtn # PAUSE resumeBtn = Button(text = "RESUME", style='red.TButton', command=lambda: pauseResumeTrigger(canvas)) resumeBtn.configure(width = 30) canvas.data.resumeBtn = resumeBtn # RESUME
def initShareImportBtns(root, canvas): # Draws the share and import btns shareBtn = Button(canvas, text ="FLEX GAME SHARE", command=lambda: shareGame(root,canvas)) # THE SHARING FTR shareBtn.configure(width = 20) canvas.data.shareBtn = shareBtn # STORES BUTTON IN STRUCT # importGameBtn takes the user to the import Game Screen importGameBtn = Button(canvas, text ="IMPORT GAME", command=lambda: importGame(root,canvas)) importGameBtn.configure(width = 25) canvas.data.importGameBtn = importGameBtn # The begin button runs the imported game beginBtn = Button(canvas, text ="BEGIN", command=lambda: runImportedGame(root,canvas)) beginBtn.configure(width = 20) canvas.data.beginBtn = beginBtn
class App(Tk): def __init__(self): Tk.__init__(self) self.label = Label(self, text="Stopped.") self.label.pack() self.play_button = Button(self, text="Play", command=self.play) self.play_button.pack(side="left", padx=2, pady=2) self.stop_button = Button(self, text="Stop", command=self.stop) self.stop_button.pack(side="left", padx=2, pady=2) self._thread, self._pause, self._stop = None, False, True def action(self): for i in range(1000): if self._stop: break while self._pause: self.label["text"] = "Pause... (count: {})".format(i) sleep(0.1) self.label["text"] = "Playing... (count: {})".format(i) sleep(0.1) self.label["text"] = "Stopped." def play(self): if self._thread is None: self._stop = False self._thread = Thread(target=self.action) self._thread.start() self._pause = False self.play_button.configure(text="Pause", command=self.pause) def pause(self): self._pause = True self.play_button.configure(text="Play", command=self.play) def stop(self): if self._thread is not None: self._thread, self._pause, self._stop = None, False, True self.play_button.configure(text="Play", command=self.play)
class ListView(Frame): def __init__(self, parent, height, width, border_style, border_width, background_colour): #Call Frams's __init__ Frame.__init__(self, parent) #create the frame that holds the widgets on the left lists_frame = Frame(self) #Add custom ListPane widget self.lists_list_pane = ListPane(lists_frame, height = 25) self.lists_list_pane.singleClickFunc = self.displayWords #Add labels and Buttons lists_label = Label(lists_frame, text="Word Lists") import_button = Button(lists_frame, text="Import", command=self.importList) export_button = Button(lists_frame, text="Export", command=self.exportList) #Grid everything lists_label.grid(row=0, column=0, sticky=W, pady=3, padx=2) self.lists_list_pane.grid(row=1, column=0, columnspan=2) import_button.grid(row=2, column=0, sticky=W, padx=2) export_button.grid(row=2, column=0) #create the container frame that holds the widgets on the right words_frame = Frame(self) #create custom ListPane widget self.words_list_pane = ListPane(words_frame,height = 25) self.words_list_pane.singleClickFunc = self.displayWordInfo #create labels and buttons self.speak_word_button = Button(words_frame, text="Speak Word", command=self.speakWord, state=DISABLED) self.speak_list_button = Button(words_frame,text="Speak List", command=self.speakList, state=DISABLED) stop_speech_button = Button(words_frame,text="Stop Speech", command=self.stopSpeech) words_label = Label(words_frame, text="Words in List") #grid everything words_label.grid(row=0, column=0, sticky=W, pady=3, padx=2) self.words_list_pane.grid(row=1, column=0, columnspan=3) self.speak_word_button.grid(row=2, column=0) self.speak_list_button.grid(row=2, column=1) stop_speech_button.grid(row=2, column=2) #Create the infoFrame info_frame = Frame(self, height=140, width=width, bd=border_width, bg=background_colour, relief=border_style) self.info_text = Text(info_frame, state=DISABLED, font=tkFont.Font(family="Tahoma", size=9)) self.info_text.pack(fill=BOTH) lists_frame.grid(column=0, row=0) words_frame.grid(column=1, row=0) info_frame.grid(column=0, row=1, columnspan=2) info_frame.pack_propagate(0) #Create databse and Festival connections self.db = SpellingDatabase() self.fest = FestivalInterface() list_records = self.db.getLists() list_names = [] for row in list_records: list_names.append(row[1]) self.lists_list_pane.display(list_names) self.words_list_pane.display(['...']) def importList(self): filename = tkFileDialog.askopenfilename(filetypes = (("Tldr Files", "*.tldr"),)) if str(filename) == "": return tldr_parse = TldrParser(filename) list_name = filename[:-5].split('/')[-1] if self.db.importList(list_name, tldr_parse.getWordList(), tldr_parse.getSource(), tldr_parse.getDateEdited(), tldr_parse.getListSize()): self.lists_list_pane.insert(list_name) else: print "List with that name already exists!!!" self.db.commit() def exportList(self): filename = tkFileDialog.asksaveasfilename(filetypes = (("Tldr Files", "*.tldr"),), initialfile = self.lists_list_pane.get()) if str(filename) == "": return export_list = self.db.getList(self.lists_list_pane.get())[0] word_list = self.db.getWords(self.lists_list_pane.get()) word_dict = {} for word in word_list: word = word[0] word_record = self.db.getWord(word)[0] word_dict[word] = [word_record[2],word_record[3],word_record[4]] tldr_parse = TldrParser() tldr_parse.setWordList(word_dict) tldr_parse.setSource(export_list[2]) tldr_parse.setDateEdited(str(date.today())) tldr_parse.setListSize(export_list[4]) tldr_parse.writetldr(filename) def speakWord(self): word = self.words_list_pane.get() self.fest.speech(word) def speakList(self): word_list = self.words_list_pane.getDisplayed() long_sentence = "" for word in word_list: long_sentence += " %s," % (word) self.fest.speech(long_sentence) def stopSpeech(self): self.fest.resetSpeech() def displayWords(self, item_index): word_records = self.db.getWords(self.lists_list_pane.get(item_index)) word_names = [] for row in word_records: word_names.append(str(row[1])) word_names.sort(key=str.lower) self.words_list_pane.display(word_names) list_record = self.db.getList(self.lists_list_pane.get(item_index)) if len(list_record) > 0: list_record = list_record[0] info_string = """List: %s Source: %s Date Edited: %s Number of Words in List: %s""" % (list_record[1], list_record[2], list_record[3], list_record[4]) self.info_text.configure(state=NORMAL) self.info_text.delete(1.0, END) self.info_text.insert(1.0, info_string) self.info_text.configure(state=DISABLED) self.speak_word_button.configure(state=DISABLED) self.speak_list_button.configure(state=NORMAL) else: self.info_text.configure(state=NORMAL) self.info_text.delete(1.0, END) self.info_text.insert(1.0, "There are no lists in the database.\nImport one or create one") self.info_text.configure(state=DISABLED) def displayWordInfo(self, item_index): word_record = self.db.getWord(self.words_list_pane.get(item_index)) if len(word_record) > 0: word_record = word_record[0] info_string = """Word: %s Definition: %s Usage: "%s" Difficulty: %s""" % (word_record[1], word_record[2], word_record[3], word_record[4]) self.info_text.configure(state=NORMAL) self.info_text.delete(1.0, END) self.info_text.insert(1.0, info_string) self.info_text.configure(state=DISABLED) self.speak_word_button.configure(state=NORMAL) def update(self): list_records = self.db.getLists() list_names = [] for row in list_records: list_names.append(row[1]) self.lists_list_pane.display(list_names) self.words_list_pane.display(['...'])
class App: def __init__(self, master): rows = 10 columns = 7 self.d = door(rows, columns) master.title("The Fridge") self.frame = Frame(master) controls = Frame(self.frame) self.start = Button(controls, text = "Restart", width = 6, command = self.restart ) self.start.grid(row = 0, column = 4, columnspan = 2, sticky = E) self.rowtext = Entry(controls, width = 4) self.rowtext.grid(row = 0, column = 0, columnspan = 2, sticky = W) self.coltext = Entry(controls, width = 4) self.coltext.grid(row = 0, column = 2, columnspan = 2, sticky = E) controls.grid(row = 0, column = 0, columnspan = 7) self.bttns = [] for i in xrange(rows): for j in xrange(columns): cb = Button(self.frame, bg = "green" if self.d.plate[i][j].state else "red", text = " ", command = self.click(self.bttns, self.d, i, j) # coolhack ) cb.grid(row = i+1, column = j) self.bttns.append(cb) self.frame.grid(column = 0, row = 0) def restart(self): rows = int(self.rowtext.get()) if self.rowtext.get() else 10 columns = int(self.coltext.get()) if self.coltext.get() else 7 if columns < 5: columns = 5 if rows < 4: rows = 4 self.d = door(rows, columns) for b in self.bttns: b.destroy() self.bttns = [] for i in xrange(rows): for j in xrange(columns): cb = Button(self.frame, bg = "green" if self.d.plate[i][j].state else "red", text = " ", command = self.click(self.bttns, self.d, i, j) # coolhack ) cb.grid(row = i+1, column = j) self.bttns.append(cb) self.start.configure(text = "Restart") def click(self, buttons, dr, x, y): def real(): # Those coolhack dr.turn(x, y) b_state = "disabled" if dr.check() else "normal" if dr.check(): self.start.configure(text = "WIN") rows = len(dr.plate) columns = len(dr.plate[0]) b_iter = iter(buttons) for i in xrange(rows): for j in xrange(columns): b_iter.next().configure(bg = "green" if dr.plate[i][j].state else "red", state = b_state) return real
class App: def __init__(self, master): self.master = master column0_padx = 24 row_pady = 40 self.imgck = IntVar() self.latck = IntVar() self.lonck = IntVar() self.timeck = IntVar() self.dateck = IntVar() self.datestate = int() self.imgval = StringVar() self.latval = StringVar() self.lonval = StringVar() self.timeval = StringVar() self.dateval = StringVar() self.headerVal = IntVar() self.rbv = IntVar() vcmd = (master.register(self.validate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') self.entryExif = Entry(master, relief="sunken") self.entryExif.insert(0, "EXIF csv file") self.entryExif.grid(row=0,columnspan=4, sticky='EW',padx=5, pady=10) exifbtn = Button(master, text="OPEN CSV file", command=self.getEXIFfile) exifbtn.grid(row=1, column=0, padx=5, sticky='w') ##added to allow header line self.headerOpt = Checkbutton(master, text="Select if CSV file has header line", variable=self.headerVal) self.headerOpt.grid(row=2, column=0, padx=5, sticky='w') self.entryJPGS = Entry(master, relief="sunken") self.entryJPGS.insert(0, "JPEG folder") self.entryJPGS.grid(row=3,columnspan=4, sticky='EW',padx=5, pady=10) JPGbtn = Button(master, text="OPEN JPEG folder", command=self.getJPEGFolder) JPGbtn.grid(row=4, column=0, padx=5, sticky='w') self.paramFile = Entry(master, relief="sunken") self.paramFile.insert(0, "Param file") self.paramFile.grid(row=5, columnspan=4, sticky='EW', padx=5, pady=10) parambtn = Button(master, text="OPEN PARAM file", command=self.getParamfile) parambtn.grid(row=6, column=0, padx=5, sticky='w') lbl_exiftag = Label(master, text="EXIF tag", wraplength=100, anchor='w', justify='left') lbl_column = Label(master, text="CSV column (zero based)", wraplength=100, anchor='w', justify='left') cbImage = Checkbutton(master, text='Image name', variable=self.imgck, command=self.imgcheck) cbLatitude = Checkbutton(master, text='Latitude', variable=self.latck, command=self.latcheck) cbLongitude = Checkbutton(master, text='Longitude', variable=self.lonck, command=self.loncheck) cbTime = Checkbutton(master, text='GPSTime', variable=self.timeck, command=self.timecheck) cbDate = Checkbutton(master, text='GPSDate', variable=self.dateck, command=self.datecheck) lblText =Label(master, text="Free text fields:") lblArtist = Label(master, text="Artist:") ## lbl_analysis = Label(master, text="Analysis Library") self.entryImage = Entry(master, validate = 'key', validatecommand = vcmd, width=5, state='disabled') self.entryLat = Entry(master, validate = 'key', validatecommand = vcmd, width=5, state='disabled') self.entryLon = Entry(master, validate = 'key', validatecommand = vcmd, width=5, state='disabled') self.entryTime = Entry(master, validate = 'key', validatecommand = vcmd, width=5, state='disabled') self.entryDate = Entry(master, validate = 'key', validatecommand = vcmd, width=5, state='disabled') self.entryArtist = Entry(master, width=40) #lbl_testcase_exec.grid(row=0, column=2, padx=20, pady=12, sticky='w') lbl_exiftag.grid(row=7, column=0, padx=20, pady=12, sticky='w') lbl_column.grid(row=7, column=1, padx=10, pady=12, sticky='w') cbImage.grid(row=8, column=0, padx=20, sticky='w') cbLatitude.grid(row=9, column=0, padx=20, sticky='w') cbLongitude.grid(row=10, column=0, padx=20, sticky='w') cbTime.grid(row=11, column=0, padx=20, sticky='w') cbDate.grid(row=12, column=0, padx=20, sticky='w') lblText.grid(row=13, column=0, padx=30, sticky='w') lblArtist.grid(row=14, column=0, padx=20, sticky='w') self.entryImage.grid(row=8, column=1, padx=10, sticky='w') self.entryLat.grid(row=9, column=1, padx=10, sticky='w') self.entryLon.grid(row=10, column=1, padx=10, sticky='w') self.entryTime.grid(row=11, column=1, padx=10, sticky='w') self.entryDate.grid(row=12, column=1, padx=10, sticky='w') lbl_datefmt = Label(master, text="Select date format:", wraplength=500, anchor='w', justify='left') lbl_datefmt.grid(row=12, column=1, padx=50, sticky='w') self.entryArtist.grid(row=14, column=1, padx=10, sticky='w') ## ##added to allow header line ## self.dateOpt1 = Checkbutton(master, text="YYYYMMDD", variable=self.headerVal) ## self.dateOpt1.grid(row=10, column=1, padx=160, sticky='w') ## self.dateOpt2 = Checkbutton(master, text="YYYY:MM:DD", variable=self.headerVal) ## self.dateOpt2.grid(row=10, column=1, padx=260, sticky='w') ## self.dateOpt3 = Checkbutton(master, text="MM/DD/YYYY", variable=self.headerVal) ## self.dateOpt3.grid(row=10, column=1, padx=360, sticky='w') #try radio buttons Radiobutton(master, text="YYYYMMDD", variable=self.rbv, value=1, command=self.rdioInvoke).grid(row=11, column=1, padx=190, sticky='w') Radiobutton(master, text="YYYY:MM:DD", variable=self.rbv, value=2).grid(row=12, column=1, padx=190, sticky='w') Radiobutton(master, text="MM/DD/YYYY", variable=self.rbv, value=3).grid(row=13, column=1, padx=190, sticky='w') # buttons bottom_frame = Frame(master) bottom_frame.grid(row=30, column=1, columnspan=3, sticky='w') #I had to add the self to the prefix, otherwise my rdioInvoke wouldn't work. #I'm guessing the self is sort of the global aspect. #temporarily commenting this out so I can just test reading the param file self.btn_start = Button(bottom_frame, text = "Submit", width=7, command=self.MergeExif) #self.btn_start = Button(bottom_frame, text = "Submit", width=7, command=self.readParamfile) self.btn_start.pack(side='left', pady=20) self.btn_start.config(state='disabled') ## btn_commit = Button(bottom_frame, text="Commit", width=7) ## btn_commit.pack(side='left', padx=80) btn_exit = Button(bottom_frame, text="Exit", width=7, command=self.cbtnClick) btn_exit.pack(side='left', padx=10) def rdioInvoke(self): print "rdioInvoke" self.btn_start.configure(state='normal') def cbtnClick(self): print "close button event handler" self.master.destroy() def imgcheck(self): print "check" if self.imgck.get() == 0: self.entryImage.configure(state='disabled') else: self.entryImage.configure(state='normal') def latcheck(self): print "check" if self.latck.get() == 0: self.entryLat.configure(state='disabled') else: self.entryLat.configure(state='normal') def loncheck(self): print "check" if self.lonck.get() == 0: self.entryLon.configure(state='disabled') else: self.entryLon.configure(state='normal') def timecheck(self): print "check" if self.timeck.get() == 0: self.entryTime.configure(state='disabled') else: self.entryTime.configure(state='normal') def datecheck(self): print "check" if self.dateck.get() == 0: self.entryDate.configure(state='disabled') else: self.entryDate.configure(state='normal') #self.datestate == 1 def validate(self, action, index, value_if_allowed, prior_value, text, validation_type, trigger_type, widget_name): if text in '0123456789': return True else: return False def getEXIFfile(self): EXIFcsvfile = tkFileDialog.askopenfilename(title='Image EXIF CSV file') #need to fix the next line self.entryExif.delete(0,END) if len(EXIFcsvfile) > 0: self.entryExif.insert(0,EXIFcsvfile) def getJPEGFolder(self): #by not specifying an intial directory, it starts where the script is located. JPGfolder = tkFileDialog.askdirectory(title='Pick JPEG folder') #need to clear anything that's there self.entryJPGS.delete(0,END) if len(JPGfolder) > 0: #print "now read JPEG folder %s" % JPGfolder #for entry widget self.entryJPGS.insert(0,JPGfolder) def getParamfile(self): PARAMtxtfile = tkFileDialog.askopenfilename(title='Paramter text file') self.paramFile.delete(0,END) if len(PARAMtxtfile) > 0: self.paramFile.insert(0,PARAMtxtfile) def readParamfile(self): params = self.paramFile.get() inputparams = open(params, "r") allparams = inputparams.read() for cmd3 in allparams.splitlines(): if "-comment" in cmd3: ## print cmd3 ## print " " val3 = cmd3 for cmd4 in allparams.splitlines(): if "-sep" in cmd4: ## print cmd4 ## print " " #return cmd4 val4 = cmd4 for cmd6 in allparams.splitlines(): if "-Caption=" in cmd6: ## print cmd6 ## print " " #return cmd6 val6=cmd6 for cmd9 in allparams.splitlines(): if "-Caption-Abstract" in cmd9: ## print cmd9 ## print " " #return cmd9 val9 = cmd9 for cmd10 in allparams.splitlines(): if "-ImageDescription=" in cmd10: ## print cmd10 ## print " " #return cmd10 val10 = cmd10 ## print "read params" ## print "val3" ## print val3 return (val3, val4, val6, val9, val10) #self.MergeExif() def MergeExif(self): try: test = self.entryExif.get() print test ## print "date format" ## print str(self.rbv.get()) inputfile = open(test, "r") #print "made it here 1" imgval = int(self.entryImage.get()) #print self.entryImage.get() #print str(imgval) if self.latck.get() <> 0: latval = int(self.entryLat.get()) #print "made it here 1a" if self.lonck.get() <> 0: lonval = int(self.entryLon.get()) print "made it here 1b" if self.timeck.get() <> 0: timeval = int(self.entryTime.get()) print "made it here 1c" if self.dateck.get() <> 0: dateval = int(self.entryDate.get()) print "got date" print str(dateval) print "made it here 2" ##add this if statement to deal with header value if self.headerVal.get() == 1: print "have a header value" line = inputfile.readline() else: print "no header value" print "getting return" ## retcmd3, retcmd4, retcmd6, retcmd9, retcmd10 = self.readParamfile() ## print "just cmd3" ## print retcmd3 allreturns = self.readParamfile() print "allreturns" print allreturns ## print "first return" ## print allreturns[0] while 1: line = inputfile.readline() print "made it here 3" values = str.split(line,",") ## print line ## print "imgval" ## print imgval ##if extension is included in text file img = values[imgval].strip() ##if extension is NOT included in text file ##img = values[imgval].strip() + '.JPG' vlat = values[latval].strip() vlon = values[lonval].strip() ingpsdate = values[dateval].strip() ## #section to read date formats if self.rbv.get()==1: vyr=str(ingpsdate)[0:4] vmm=str(ingpsdate)[4:6] vdd=str(ingpsdate)[6:8] vgpsdate=vyr+":"+vmm+":"+vdd if self.rbv.get()==2: vgpsdate=ingpsdate if self.rbv.get()==3: vmm, vdd, vyr = ingpsdate.split("/") if len(vmm)==1: vmm="0"+vmm if len(vdd)==1: vdd="0"+vdd vgpsdate=vyr+":"+vmm+":"+vdd ## if ingpsdate.find(':')==-1: ## vyr=str(ingpsdate)[0:4] ## vmm=str(ingpsdate)[4:6] #### print ingpsdate #### print "year" #### print vyr #### print "month" #### print vmm ## vdd=ingpsdate[6:8] ## vgpsdate=vyr+":"+vmm+":"+vdd ## else: ## vgpsdate=ingpsdate print vgpsdate vgpstime = values[timeval].strip() imagefolder = self.entryJPGS.get() fullimg = os.path.join(imagefolder, img) fullimg = fullimg.replace('\\','/') vartist = self.entryArtist.get() vartistquotes = '"'+vartist+'"' ## print str(fullimg) ## print str(vlat) ## print str(vlon) ## print str(vgpsdate) ## print str(vgpstime) if (float(vlat)) > 0: print "latref1" vlatref = 'N' else: print "latref2" vlatref = 'S' if (float(vlon)) > 0: vlonref = 'E' else: vlonref = 'W' ## print str(vlatref) ## print str(vlonref) cmd = "exiftool -GPSDateStamp=" + vgpsdate + " -GPSTimeStamp="+vgpstime+" -GPSLatitude="+vlat+" -GPSLatitudeRef="+ vlatref+\ " -GPSLongitude="+vlon+" -GPSLongitudeRef="+vlonref+" "+ " -Artist=" +vartistquotes +" "+fullimg print cmd #print "made it past first os.system" subprocess.check_call(cmd, shell=True) print "executed" cmd2 = """exiftool -Credit="U.S. Geological Survey" -Contact="[email protected] " """+ fullimg subprocess.check_call(cmd2, shell=True) #jpeg comment print "in command 3 section" cmd3=allreturns[0] cmd3new = cmd3+" "+fullimg print cmd3new #print cmd3 #cmd3 = """exiftool -comment="Photo from down-looking camera on the USGS SEABOSS deployed from the R/V Rafael during survey 2012-003-FA (http://woodshole.er.usgs.gov/operations/ia/public_ds_info.php?fa=2012-003-FA). Released as part of publication DOI:10.3133/ds937. " """+ fullimg subprocess.check_call(cmd3new, shell=True) #iptc info #cmd4 = """exiftool -sep ", " -keywords="Barnegat Bay, New Jersey, 2012-003-FA, SEABOSS, sea floor, USGS " """+ fullimg cmd4=allreturns[1] cmd4new = cmd4+" "+fullimg #subprocess.check_call(cmd4, shell=True) subprocess.check_call(cmd4new, shell=True) #cmd5 unused and skipped #xmp info #cmd6 = """exiftool -Caption="Photograph of the sea floor in Barnegat Bay, New Jersey from survey 2012-003-FA " """+ fullimg cmd6=allreturns[2] cmd6new = cmd6+" "+fullimg #subprocess.check_call(cmd6, shell=True) subprocess.check_call(cmd6new, shell=True) print "did caption" #EXIF info cmd7 = """exiftool -Copyright="Public Domain - please credit U.S. Geological Survey " """ + fullimg subprocess.check_call(cmd7, shell=True) print "did copyright" #iptc info cmd8 = """exiftool -CopyrightNotice="Public Domain - please credit U.S. Geological Survey " """ + fullimg subprocess.check_call(cmd8, shell=True) #iptc info #cmd9 = """exiftool -Caption-Abstract="Photograph of the sea floor in Barnegat Bay, New Jersey from survey 2012-003-FA " """+ fullimg cmd9=allreturns[3] cmd9new = cmd9+" "+fullimg #subprocess.check_call(cmd9, shell=True) subprocess.check_call(cmd9new, shell=True) #exif info - software such as Picasso use this as the caption #cmd10 = """exiftool -ImageDescription="Photograph of the sea floor in Barnegat Bay, New Jersey from survey 2012-003-FA " """+ fullimg cmd10=allreturns[4] cmd10new = cmd10+" "+fullimg #subprocess.check_call(cmd10, shell=True) subprocess.check_call(cmd10new, shell=True) except: print "booboo maybe?" inputfile.close() print "done"
class Main(): def __init__(self, master): #La intro se puede apagar al final, cumple solo una funcion vistosa #Iniciacion propia de la ventan y sus configuraciones self.master=master self.master.wm_title(R.AppTitle) self.widht=(self.master.winfo_screenwidth() - self.master.winfo_reqwidth()) / 2 self.height=(self.master.winfo_screenheight() - self.master.winfo_reqheight()) / 2 self.master.geometry("+{0:.0f}+{1:.0f}".format(self.widht, self.height)) self.master.deiconify() self.master.resizable(False,False) self.icon=(R.IconPath) self.master.iconbitmap(self.icon) self.master.configure(background=R.Bgcolor) #Definicion de variables variables que estaran en uso. self.btnFlecha=Image.open(R.BtnFlechaImgPath) self.btnFlechaimg=ImageTk.PhotoImage(self.btnFlecha) self.selectMed = StringVar(self.master) self.selectMed.set(R.SelectMed) #Las variables que usaran para saber que hacer o que reemplazar self.fromLabel = StringVar() self.fromLabel.set(R.Select) self.toLabel=StringVar() self.toLabel.set(R.Select) #Los valores de las entradas self.fromNumber=StringVar() self.toNumber=StringVar() #La creacion de las partes del programita. self.menuChoices() self.convertChoice() self.convertButton() def menuChoices(self): #Menu de seleccion principal sobre los tipos que conversion que hara el programa self.MenuChoices = OptionMenu(self.master, self.selectMed, R.LongMain,R.AlmacMain, command=self.choice) self.MenuChoices.configure(bg="white",fg="black",activebackground="#eceefb",highlightbackground=R.Bgcolor, indicatoron=0,image=self.btnFlechaimg,compound='right') self.MenuChoices.grid(row=0,column=0) def convertChoice(self): #Las partes que integran el primer submenu llamado "DE", labelFrame,menu, entrada. self.labelFrameFrom=LabelFrame(self.master,text="De",background=R.Bgcolor) self.labelFrameFrom.grid(row=1,column=0,padx=5,pady=3) self.menuFrom=OptionMenu(self.labelFrameFrom,self.fromLabel,"",) self.menuFrom.configure(bg=R.White,fg=R.Black,activebackground=R.hoverBtnColor,highlightbackground=R.Bgcolor, indicatoron=0,image=self.btnFlechaimg, compound='right') self.menuFrom.grid(row=0,column=0,padx=3,pady=2,sticky=E) self.entryFrom=Entry(self.labelFrameFrom,justify='center',textvariable=self.fromNumber) self.entryFrom.grid(row=2,column=0,padx=5,pady=5) #Las partes que integran el segundo submenu llamado "Hasta", labelFrame, menu, entrada. self.labelFrameTo=LabelFrame(self.master,text="Hacia",background=R.Bgcolor) self.labelFrameTo.grid(row=1,column=1,padx=5,pady=3) self.menuTo=OptionMenu(self.labelFrameTo,self.toLabel,"",) self.menuTo.configure(bg=R.White,fg=R.Black, activebackground=R.hoverBtnColor,highlightbackground=R.Bgcolor, indicatoron=0,image=self.btnFlechaimg, compound='right') self.menuTo.grid(row=0,column=0, padx=3, pady=2, sticky=E) self.entryTo=Entry(self.labelFrameTo,justify='center',textvariable=self.toNumber,state="readonly") self.entryTo.configure(bg="red", readonlybackground=R.Bgcolor) self.entryTo.grid(row=2,column=0,padx=3,pady=5) def convertButton(self): #El boton Convertir que activa las funcionalidades de los campos self.butonimgpath = Image.open(R.BtnConvertirImgPath) self.butonTkImage = ImageTk.PhotoImage(self.butonimgpath) self.button = Button(self.master,text='Convertir',command=self.choiceFromTo) self.button.configure(image=self.butonTkImage, bd=False, highlightthickness=0, activebackground="black") self.button.grid(row=3,column=1,sticky=E) def choice(self, choices): #Al tocar el boton [<- Selecione] se cambia la opcion de medida y se genera opciones acorde # error.set("") #Opciones acorde en el caso de elegir "Longitudes" if choices==R.LongMain: self.fromLabel.set(R.LongStart) self.toLabel.set(R.LongStart) self.clean() # medidas= ("kms", "milla","metro","legua","yarda","pie") for m in R.LongList: self.menuFrom['menu'].add_command(label=m,command=lambda v=self.fromLabel,l=m:v.set(l)) for m in R.LongList: self.menuTo['menu'].add_command(label=m,command=lambda v=self.toLabel,l=m:v.set(l)) #Genera las opciones si se elige "Almacenamientos" elif choices==R.AlmacMain: self.fromLabel.set(R.AlmacStart) self.toLabel.set(R.AlmacStart) self.clean() # medidas= ("Gbs", "Mbs","Kbs","bytes") for m in R.AlmacList: self.menuFrom['menu'].add_command(label=m,command=lambda v=self.fromLabel,l=m:v.set(l)) for m in R.AlmacList: self.menuTo['menu'].add_command(label=m,command=lambda v=self.toLabel,l=m:v.set(l)) def choiceFromTo(self): try: #Se toma los valores de las seleciones [DE] y [HACIA], ademas de la entrada numerica # self.fromChoice=self.fromNumber.get() self.fromChoice=self.fromLabel.get() self.toChoice=self.toLabel.get() self.fromN=self.entryFrom.get() #A partir de un if se consulta #el objeto a crear que poseen los comportamientos de convertirse a #otra medida #Si la medida esta en el campo de las longitudes if self.toChoice in R.LongList: convLong = Distancia(float(self.fromN)) dicChoices = {0: convLong.km_a_(self.toChoice), 1: convLong.milla_a_(self.toChoice), 2: convLong.metro_a_(self.toChoice), 3: convLong.legua_a_(self.toChoice), 4: convLong.yarda_a_(self.toChoice), 5: convLong.pie_a_(self.toChoice)} self.toNumber.set(dicChoices.get(R.LongList.index(self.fromChoice))) #Si la medida esta en el campo de las medidas de almacenamiento elif self.toChoice in R.AlmacList: conAlmc = Almacenamiento(float(self.fromN)) dicChoices = {0: conAlmc.gb_a_(self.toChoice), 1: conAlmc.mb_a_(self.toChoice), 2: conAlmc.kbs_a_(self.toChoice), 3: conAlmc.bytes_a_(self.toChoice)} self.toNumber.set(dicChoices.get(R.AlmacList.index(self.fromChoice))) except: self.toNumber.set('{}'.format("Numero no valido")) def clean(self): self.menuTo['menu'].delete(0,END) self.menuFrom['menu'].delete(0,END)
class path_planner_gui(StoppableThread): DEFAULT_START_LAT = 55.434352 #55.43526 #55.431122 DEFAULT_START_LON = 10.415182 #10.41086 #10.420436 DEFAULT_GOAL_LAT = 55.42474 #55.427203 DEFAULT_GOAL_LON = 10.41975 #10.419043 # for testing altitude - points near Hindsgavl, Middelfart # start_point_3dDICT = {'lat': 55.505618, 'lon': 9.681612, 'alt_rel': 0} # goal_point_3dDICT = {'lat': 55.518093, 'lon': 9.699519, 'alt_rel': 0} # goal inside geofence: 55.429331, 10.422770 DEFAULT_STEP_SIZE_HORZ_ASTAR = 100 DEFAULT_STEP_SIZE_VERT_ASTAR = 10 DEFAULT_STEP_SIZE_HORZ_RRT = 50 DEFAULT_STEP_SIZE_VERT_RRT = 10 DEFAULT_SEARCH_TIME_MAX = 120 # unit: s DEFAULT_ITERATIONS_MAX = 3000 DEFAULT_TIME_STEP = 1.0 # unit: s DEFAULT_ACCELERATION_FACTOR = 10.0 # unitless DEFAULT_STEP_SIZE_HORZ_LOCAL_ASTAR = 50 DEFAULT_STEP_SIZE_VERT_LOCAL_ASTAR = 5 DEFAULT_SEARCH_TIME_MAX_LOCAL = 180 # unit: s DEFAULT_STEP_SIZE_HORZ_LOCAL_RRT = 25 DEFAULT_STEP_SIZE_VERT_LOCAL_RRT = 5 DEFAULT_ITERATIONS_MAX_LOCAL = 3000 # unit: s INITIAL_PLANNER = 1 def __init__(self, parent_class, auto_start=False): # self.__class__ = type(self.__class__.__name__, (base_class, object), dict(self.__class__.__dict__)) # super(self.__class__, self).__init__() self.parent_class = parent_class StoppableThread.__init__(self) self.q = Queue() self.logger = logging.getLogger(__name__) if auto_start: self.start() def stop_thread(self): self.callback_close() self.stop() def callback_close(self): self.root.quit() self.logger.info( 'Tkinter GUI has stopped but thread will first be joined upon closing of the program' ) def on_main_thread(self, func): self.q.put(func) def check_queue(self): while True: try: task = self.q.get(block=False) except Empty: break else: self.root.after_idle(task) self.root.after(100, self.check_queue) def set_label_no_fly_zones(self, txt, color='black'): self.label_data_source_no_fly_zones_res.configure(text=txt) self.label_data_source_no_fly_zones_res.configure(fg=color) def set_label_height_map(self, txt, color='black'): self.label_data_source_height_map_res.configure(text=txt) self.label_data_source_height_map_res.configure(fg=color) def set_label_drone_id(self, txt, color='black'): self.label_data_source_droneID_res.configure(text=txt) self.label_data_source_droneID_res.configure(fg=color) def set_label_adsb(self, txt, color='black'): self.label_data_source_adsb_res.configure(text=txt) self.label_data_source_adsb_res.configure(fg=color) def set_label_weather(self, txt, color='black'): self.label_data_source_weather_res.configure(text=txt) self.label_data_source_weather_res.configure(fg=color) def set_label_rally_points(self, txt, color='black'): self.label_data_rally_point_res.configure(text=txt) self.label_data_rally_point_res.configure(fg=color) def set_global_plan_start_heuristic(self, val, color='black'): self.label_global_plan_start_heuristic_res.configure(text='%.02f' % val) self.label_global_plan_start_heuristic_res.configure(fg=color) def set_global_plan_cur_heuristic(self, val, color='black'): self.label_global_plan_cur_heuristic_res.configure(text='%.02f' % val) self.label_global_plan_cur_heuristic_res.configure(fg=color) def set_global_plan_horz_step_size(self, val, color='black'): self.label_global_plan_horz_step_size_res.configure(text='%.01f [m]' % val) self.label_global_plan_horz_step_size_res.configure(fg=color) def set_global_plan_vert_step_size(self, val, color='black'): self.label_global_plan_vert_step_size_res.configure(text='%.01f [m]' % val) self.label_global_plan_vert_step_size_res.configure(fg=color) def set_global_plan_status(self, txt, color='black'): self.label_global_plan_status_res.configure(text=txt) self.label_global_plan_status_res.configure(fg=color) def set_global_plan_search_time(self, val, color='black'): self.label_global_plan_search_time_res.configure(text='%.01f [s]' % val) self.label_global_plan_search_time_res.configure(fg=color) def set_global_plan_nodes_visited(self, val, color='black'): self.label_global_plan_nodes_visited_res.configure(text='%i' % val) self.label_global_plan_nodes_visited_res.configure(fg=color) def set_global_plan_nodes_explored(self, val, color='black'): self.label_global_plan_nodes_explored_res.configure(text='%i' % val) self.label_global_plan_nodes_explored_res.configure(fg=color) def set_label_gpe_fitness(self, val, color='black'): self.label_gpe_fitness_res.configure(text='%f' % val) self.label_gpe_fitness_res.configure(fg=color) def set_label_gpe_dist_tot(self, val, color='black'): self.label_gpe_dist_tot_res.configure(text='%.02f [m]' % val) self.label_gpe_dist_tot_res.configure(fg=color) def set_label_gpe_dist_horz(self, val, color='black'): self.label_gpe_dist_horz_res.configure(text='%.02f [m]' % val) self.label_gpe_dist_horz_res.configure(fg=color) def set_label_gpe_dist_vert(self, val, color='black'): self.label_gpe_dist_vert_res.configure(text='%.02f [m]' % val) self.label_gpe_dist_vert_res.configure(fg=color) def set_label_gpe_eta(self, val, color='black'): self.label_gpe_eta_res.configure(text='%.02f [s]' % val) self.label_gpe_eta_res.configure(fg=color) def set_label_gpe_wps(self, val, color='black'): self.label_gpe_wps_res.configure(text='%i' % val) self.label_gpe_wps_res.configure(fg=color) def set_label_gpe_runtime(self, val, color='black'): self.label_gpe_runtime_res.configure(text='%.02f [s]' % val) self.label_gpe_runtime_res.configure(fg=color) def set_label_gpe_bytes_tot(self, val, color='black'): self.label_gpe_bytes_tot_res.configure(text='%i' % val) self.label_gpe_bytes_tot_res.configure(fg=color) def set_label_gpe_objects_tot(self, val, color='black'): self.label_gpe_objects_tot_res.configure(text='%i' % val) self.label_gpe_objects_tot_res.configure(fg=color) def set_label_gpe_bytes_planner(self, val, color='black'): self.label_gpe_bytes_planner_res.configure(text='%i' % val) self.label_gpe_bytes_planner_res.configure(fg=color) def set_label_gpe_objects_planner(self, val, color='black'): self.label_gpe_objects_planner_res.configure(text='%i' % val) self.label_gpe_objects_planner_res.configure(fg=color) def set_scrolledtext_global_path(self, txt): self.scrolledtext_global_path.delete(1.0, END) self.scrolledtext_global_path.insert(INSERT, txt) def set_scrolledtext_local_path(self, txt): self.scrolledtext_local_path.delete(1.0, END) self.scrolledtext_local_path.insert(INSERT, txt) def enable_button_global_plan(self): self.button_global_plan.configure(state='normal') def diable_button_global_plan(self): self.button_global_plan.configure(state='disabled') def set_label_local_plan_status(self, txt, color='black'): self.label_local_plan_status_res.configure(text=txt) self.label_local_plan_status_res.configure(fg=color) def set_label_local_plan_time(self, val, color='black'): self.label_local_plan_time_res.configure(text='%.02f [s]' % val) self.label_local_plan_time_res.configure(fg=color) def set_label_local_uav_y(self, val, color='black'): self.label_local_uav_y_res.configure(text='%.01f [m]' % val) self.label_local_uav_y_res.configure(fg=color) def set_label_local_uav_x(self, val, color='black'): self.label_local_uav_x_res.configure(text='%.01f [m]' % val) self.label_local_uav_x_res.configure(fg=color) def set_label_local_uav_z_rel(self, val, color='black'): self.label_local_uav_z_rel_res.configure(text='%.01f [m]' % val) self.label_local_uav_z_rel_res.configure(fg=color) def set_label_local_uav_status(self, txt, color='black'): self.label_local_uav_status_res.configure(text=txt) self.label_local_uav_status_res.configure(fg=color) def global_planner_thread(self, point_start, point_goal, path_planner, step_size_horz, step_size_vert, search_time_max): if self.parent_class.plan_path_global( point_start, point_goal, path_planner, step_size_horz=step_size_horz, step_size_vert=step_size_vert, search_time_max=search_time_max ): # Plan path and test the result to update the GUI self.button_local_plan.configure(state='normal') self.button_global_plan.configure(state='normal') self.button_gen_global_sim_files.configure(state='normal') self.button_global_plan.configure(text='Start global planning') self.button_show_result_webpage_global.configure(state='normal') self.button_evaluate_path.configure(state='normal') self.button_web_visualize_global.configure(state='normal') else: # The global path planner failed and therefore diable the local path planner and change the option to continue self.button_local_plan.configure(state='disabled') self.button_global_plan.configure(state='normal') self.button_gen_global_sim_files.configure(state='disabled') self.button_show_result_webpage_global.configure(state='disabled') path_planner = str(self.combo_planner_type.get()) if path_planner == self.parent_class.PATH_PLANNER_NAMES[0]: self.button_global_plan.configure( text='Continue global planning') elif path_planner == self.parent_class.PATH_PLANNER_NAMES[1]: self.button_global_plan.configure(text='Retry global planning') self.button_evaluate_path.configure(state='disabled') self.button_web_visualize_global.configure(state='disabled') def start_global_path_planning(self): self.button_global_plan.configure(state='disabled') self.button_gen_global_sim_files.configure(state='disabled') self.button_local_plan.configure(state='disabled') self.button_show_result_webpage_global.configure(state='disabled') self.button_evaluate_path.configure(state='disabled') self.button_web_visualize_global.configure(state='disabled') # Get data from the GUI path_planner = self.combo_planner_type.get() start_point_3dDICT = { 'lat': float(self.input_start_point_lat.get()), 'lon': float(self.input_start_point_lon.get()), 'alt_rel': 0 } goal_point_3dDICT = { 'lat': float(self.input_goal_point_lat.get()), 'lon': float(self.input_goal_point_lon.get()), 'alt_rel': 0 } step_size_horz = float(self.input_step_size_horz.get()) step_size_vert = float(self.input_step_size_vert.get()) search_time_max = float(self.input_search_time_max.get()) # Create and start the thread thread_global_planning = threading.Thread( target=self.global_planner_thread, args=(start_point_3dDICT, goal_point_3dDICT, path_planner, step_size_horz, step_size_vert, search_time_max)) thread_global_planning.start() #thread_global_planning.join() def local_planner_thread(self, path_planner, step_size_horz, step_size_vert, max_search_time, time_step, acceleration_factor): self.parent_class.plan_path_local( path_planner=path_planner, step_size_horz=step_size_horz, step_size_vert=step_size_vert, max_search_time=max_search_time, time_step=time_step, acceleration_factor=acceleration_factor) self.button_global_plan.configure(state='normal') self.button_gen_global_sim_files.configure(state='normal') self.button_local_plan.configure(state='normal') self.button_web_visualize_local.configure(state='normal') self.button_show_result_webpage_local.configure(state='normal') self.button_gen_local_sim_files.configure(state='normal') def start_local_path_planning(self): self.button_global_plan.configure(state='disabled') self.button_gen_global_sim_files.configure(state='disabled') self.button_local_plan.configure(state='disabled') self.button_web_visualize_local.configure(state='disabled') self.button_show_result_webpage_local.configure(state='disabled') self.button_gen_local_sim_files.configure(state='disabled') # Get data from the GUI path_planner = str(self.combo_planner_type.get()) time_step = float(self.input_time_step.get()) acceleration_factor = float(self.input_acceleration_factor.get()) step_size_horz = float(self.input_replan_step_size_horz.get()) step_size_vert = float(self.input_replan_step_size_vert.get()) search_time_max = float(self.input_replan_search_time_max.get()) # Create and start the thread thread_local_planning = threading.Thread( target=self.local_planner_thread, args=(path_planner, step_size_horz, step_size_vert, search_time_max, time_step, acceleration_factor)) thread_local_planning.start() def show_result_webpage_global_thread(self): self.parent_class.draw_planned_path_global() self.parent_class.map_plotter_global.show_plot() def show_result_webpage_global(self): show_result_webpage_global = threading.Thread( target=self.show_result_webpage_global_thread) show_result_webpage_global.start() def gen_global_sim_files_thread(self): self.parent_class.generate_simulation_files_global() def gen_global_sim_files(self): gen_global_sim = threading.Thread( target=self.gen_global_sim_files_thread) gen_global_sim.start() def gen_local_sim_files_thread(self): self.parent_class.generate_simulation_files_local() def gen_local_sim_files(self): gen_local_sim = threading.Thread( target=self.gen_local_sim_files_thread) gen_local_sim.start() def show_result_webpage_local_thread(self): self.parent_class.draw_planned_path_local() self.parent_class.map_plotter_local.show_plot() def show_result_webpage_local(self): show_result_webpage_local = threading.Thread( target=self.show_result_webpage_local_thread) show_result_webpage_local.start() def show_web_visualize_global(self): route_id = self.parent_class.visualize_path_3d_global() if not None: url = 'http://uas.heltner.net/routes/' + str(route_id) + '/3d' webbrowser.open_new(url) def show_web_visualize_local(self): route_id = self.parent_class.visualize_path_3d_local() if not None: url = 'http://uas.heltner.net/routes/' + str(route_id) + '/3d' webbrowser.open_new(url) def path_evaluation_thread(self): self.parent_class.evaluate_path() def start_evaluation(self): # Create and start the thread thread_evaluate_path = threading.Thread( target=self.path_evaluation_thread) thread_evaluate_path.start() def change_planner(self, event=None): path_planner = str(self.combo_planner_type.get()) if path_planner == self.parent_class.PATH_PLANNER_NAMES[0]: self.input_step_size_horz.delete(0, END) self.input_step_size_horz.insert(0, self.DEFAULT_STEP_SIZE_HORZ_ASTAR) self.input_step_size_vert.delete(0, END) self.input_step_size_vert.insert(0, self.DEFAULT_STEP_SIZE_VERT_ASTAR) self.label_search_time_max.configure(text='Max search time [s]:') self.input_search_time_max.delete(0, END) self.input_search_time_max.insert(0, self.DEFAULT_SEARCH_TIME_MAX) self.input_replan_step_size_horz.delete(0, END) self.input_replan_step_size_horz.insert( 0, self.DEFAULT_STEP_SIZE_HORZ_LOCAL_ASTAR) self.input_replan_step_size_vert.delete(0, END) self.input_replan_step_size_vert.insert( 0, self.DEFAULT_STEP_SIZE_VERT_LOCAL_ASTAR) self.label_replan_search_time_max.configure( text='Replan max search time [s]:') self.input_replan_search_time_max.delete(0, END) self.input_replan_search_time_max.insert( 0, self.DEFAULT_SEARCH_TIME_MAX_LOCAL) elif path_planner == self.parent_class.PATH_PLANNER_NAMES[1]: self.input_step_size_horz.delete(0, END) self.input_step_size_horz.insert(0, self.DEFAULT_STEP_SIZE_HORZ_RRT) self.input_step_size_vert.delete(0, END) self.input_step_size_vert.insert(0, self.DEFAULT_STEP_SIZE_VERT_RRT) self.label_search_time_max.configure(text='Max iterations:') self.input_search_time_max.delete(0, END) self.input_search_time_max.insert(0, self.DEFAULT_ITERATIONS_MAX) self.input_replan_step_size_horz.delete(0, END) self.input_replan_step_size_horz.insert( 0, self.DEFAULT_STEP_SIZE_HORZ_LOCAL_RRT) self.input_replan_step_size_vert.delete(0, END) self.input_replan_step_size_vert.insert( 0, self.DEFAULT_STEP_SIZE_VERT_LOCAL_RRT) self.label_replan_search_time_max.configure( text='Replan max iterations:') self.input_replan_search_time_max.delete(0, END) self.input_replan_search_time_max.insert( 0, self.DEFAULT_ITERATIONS_MAX_LOCAL) def run(self): self.root = Tk() self.root.protocol("WM_DELETE_WINDOW", self.callback_close) self.root.title("UAV Path Planner") #self.root.geometry('{}x{}'.format(460, 350)) """ Left side layout """ row_num_left = 0 self.label_start_point = Label(self.root, text="Path Planning", font=("Arial Bold", 12)) self.label_start_point.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_planner_type = Label(self.root, text="Type:") self.label_planner_type.grid(row=row_num_left, column=0) self.combo_planner_type = Combobox(self.root) self.combo_planner_type[ 'values'] = self.parent_class.PATH_PLANNER_NAMES if self.INITIAL_PLANNER == 0: self.combo_planner_type.current(0) elif self.INITIAL_PLANNER == 1: self.combo_planner_type.current(1) self.combo_planner_type.bind('<<ComboboxSelected>>', self.change_planner) self.combo_planner_type.grid(row=row_num_left, column=1) row_num_left += 1 self.label_start_point = Label(self.root, text="Start point (geodetic)", font=("Arial Bold", 10)) self.label_start_point.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_start_point_lat = Label(self.root, text="Latitude [dd]:") self.label_start_point_lat.grid(row=row_num_left, column=0) self.input_start_point_lat = Entry(self.root, width=10) self.input_start_point_lat.insert(0, self.DEFAULT_START_LAT) self.input_start_point_lat.grid(row=row_num_left, column=1) row_num_left += 1 self.label_start_point_lon = Label(self.root, text="Longitude [dd]:") self.label_start_point_lon.grid(row=row_num_left, column=0) self.input_start_point_lon = Entry(self.root, width=10) self.input_start_point_lon.insert(0, self.DEFAULT_START_LON) self.input_start_point_lon.grid(row=row_num_left, column=1) row_num_left += 1 self.label_goal_point = Label(self.root, text="Goal point (geodetic)", font=("Arial Bold", 10)) self.label_goal_point.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_goal_point_lat = Label(self.root, text="Latitude [dd]:") self.label_goal_point_lat.grid(row=row_num_left, column=0) self.input_goal_point_lat = Entry(self.root, width=10) self.input_goal_point_lat.insert(0, self.DEFAULT_GOAL_LAT) self.input_goal_point_lat.grid(row=row_num_left, column=1) row_num_left += 1 self.label_goal_point_lon = Label(self.root, text="Longitude [dd]:") self.label_goal_point_lon.grid(row=row_num_left, column=0) self.input_goal_point_lon = Entry(self.root, width=10) self.input_goal_point_lon.insert(0, self.DEFAULT_GOAL_LON) self.input_goal_point_lon.grid(row=row_num_left, column=1) row_num_left += 1 self.label_options = Label(self.root, text="Options global path planner", font=("Arial Bold", 10)) self.label_options.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_step_size_horz = Label(self.root, text="Horizontal step-size [m]:") self.label_step_size_horz.grid(row=row_num_left, column=0) self.input_step_size_horz = Entry(self.root, width=10) if self.INITIAL_PLANNER == 0: self.input_step_size_horz.insert(0, self.DEFAULT_STEP_SIZE_HORZ_ASTAR) elif self.INITIAL_PLANNER == 1: self.input_step_size_horz.insert(0, self.DEFAULT_STEP_SIZE_HORZ_RRT) self.input_step_size_horz.grid(row=row_num_left, column=1) row_num_left += 1 self.label_step_size_vert = Label(self.root, text="Vertical step-size [m]:") self.label_step_size_vert.grid(row=row_num_left, column=0) self.input_step_size_vert = Entry(self.root, width=10) if self.INITIAL_PLANNER == 0: self.input_step_size_vert.insert(0, self.DEFAULT_STEP_SIZE_VERT_ASTAR) elif self.INITIAL_PLANNER == 1: self.input_step_size_vert.insert(0, self.DEFAULT_STEP_SIZE_VERT_RRT) self.input_step_size_vert.grid(row=row_num_left, column=1) row_num_left += 1 self.label_search_time_max = Label(self.root, text="") if self.INITIAL_PLANNER == 0: self.label_search_time_max.configure(text='Max search time [s]:') elif self.INITIAL_PLANNER == 1: self.label_search_time_max.configure(text='Max iterations:') self.label_search_time_max.grid(row=row_num_left, column=0) self.input_search_time_max = Entry(self.root, width=10) if self.INITIAL_PLANNER == 0: self.input_search_time_max.insert(0, self.DEFAULT_SEARCH_TIME_MAX) elif self.INITIAL_PLANNER == 1: self.input_search_time_max.insert(0, self.DEFAULT_ITERATIONS_MAX) self.input_search_time_max.grid(row=row_num_left, column=1) row_num_left += 1 self.button_global_plan = Button( self.root, text="Start global planning", command=self.start_global_path_planning) self.button_global_plan.configure(state='disabled') self.button_global_plan.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_options_local = Label(self.root, text="Options local path planner", font=("Arial Bold", 10)) self.label_options_local.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_time_step = Label(self.root, text="Time step [s]:") self.label_time_step.grid(row=row_num_left, column=0) self.input_time_step = Entry(self.root, width=10) self.input_time_step.insert(0, self.DEFAULT_TIME_STEP) self.input_time_step.grid(row=row_num_left, column=1) row_num_left += 1 self.label_acceleration_factor = Label(self.root, text="Playback speed:") self.label_acceleration_factor.grid(row=row_num_left, column=0) self.input_acceleration_factor = Entry(self.root, width=10) self.input_acceleration_factor.insert(0, self.DEFAULT_ACCELERATION_FACTOR) self.input_acceleration_factor.grid(row=row_num_left, column=1) row_num_left += 1 self.label_replan_step_size_horz = Label( self.root, text="Replan horizontal step-size [m]:") self.label_replan_step_size_horz.grid(row=row_num_left, column=0) self.input_replan_step_size_horz = Entry(self.root, width=10) if self.INITIAL_PLANNER == 0: self.input_replan_step_size_horz.insert( 0, self.DEFAULT_STEP_SIZE_HORZ_LOCAL_ASTAR) elif self.INITIAL_PLANNER == 1: self.input_replan_step_size_horz.insert( 0, self.DEFAULT_STEP_SIZE_HORZ_LOCAL_RRT) self.input_replan_step_size_horz.grid(row=row_num_left, column=1) row_num_left += 1 self.label_replan_step_size_vert = Label( self.root, text="Replan vertical step-size [m]:") self.label_replan_step_size_vert.grid(row=row_num_left, column=0) self.input_replan_step_size_vert = Entry(self.root, width=10) if self.INITIAL_PLANNER == 0: self.input_replan_step_size_vert.insert( 0, self.DEFAULT_STEP_SIZE_VERT_LOCAL_ASTAR) elif self.INITIAL_PLANNER == 1: self.input_replan_step_size_vert.insert( 0, self.DEFAULT_STEP_SIZE_VERT_LOCAL_RRT) self.input_replan_step_size_vert.grid(row=row_num_left, column=1) row_num_left += 1 self.label_replan_search_time_max = Label( self.root, text="Replan max search time [s]:") if self.INITIAL_PLANNER == 0: self.label_replan_search_time_max.configure( text='Replan max search time [s]:') elif self.INITIAL_PLANNER == 1: self.label_replan_search_time_max.configure( text='Replan max iterations:') self.label_replan_search_time_max.grid(row=row_num_left, column=0) self.input_replan_search_time_max = Entry(self.root, width=10) if self.INITIAL_PLANNER == 0: self.input_replan_search_time_max.insert( 0, self.DEFAULT_SEARCH_TIME_MAX_LOCAL) elif self.INITIAL_PLANNER == 1: self.input_replan_search_time_max.insert( 0, self.DEFAULT_ITERATIONS_MAX_LOCAL) self.input_replan_search_time_max.grid(row=row_num_left, column=1) row_num_left += 1 self.button_local_plan = Button(self.root, text="Start local planning", command=self.start_local_path_planning) self.button_local_plan.configure( state='disabled' ) # disable the button since it cannot make a local plan before it has made a global plan self.button_local_plan.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_sim_info = Label(self.root, text="Simulation information", font=("Arial Bold", 12)) self.label_sim_info.grid(row=row_num_left, column=0, columnspan=2) row_num_left += 1 self.label_local_plan_status = Label(self.root, text="Status:") self.label_local_plan_status.grid(row=row_num_left, column=0) self.label_local_plan_status_res = Label(self.root, text="idle") self.label_local_plan_status_res.configure(fg='green') self.label_local_plan_status_res.grid(row=row_num_left, column=1) row_num_left += 1 self.label_local_plan_time = Label(self.root, text="Time:") self.label_local_plan_time.grid(row=row_num_left, column=0) self.label_local_plan_time_res = Label(self.root, text="N/A") self.label_local_plan_time_res.grid(row=row_num_left, column=1) row_num_left += 1 self.label_local_uav_y = Label(self.root, text="UAV y:") self.label_local_uav_y.grid(row=row_num_left, column=0) self.label_local_uav_y_res = Label(self.root, text="N/A") self.label_local_uav_y_res.grid(row=row_num_left, column=1) row_num_left += 1 self.label_local_uav_x = Label(self.root, text="UAV x:") self.label_local_uav_x.grid(row=row_num_left, column=0) self.label_local_uav_x_res = Label(self.root, text="N/A") self.label_local_uav_x_res.grid(row=row_num_left, column=1) row_num_left += 1 self.label_local_uav_z_rel = Label(self.root, text="UAV z_rel:") self.label_local_uav_z_rel.grid(row=row_num_left, column=0) self.label_local_uav_z_rel_res = Label(self.root, text="N/A") self.label_local_uav_z_rel_res.grid(row=row_num_left, column=1) row_num_left += 1 self.label_local_uav_status = Label(self.root, text="UAV status:") self.label_local_uav_status.grid(row=row_num_left, column=0) self.label_local_uav_status_res = Label(self.root, text="N/A") self.label_local_uav_status_res.grid(row=row_num_left, column=1) """ Right side layout """ row_num_right = 0 self.label_data_sources = Label(self.root, text="Data sources", font=("Arial Bold", 12)) self.label_data_sources.grid(row=row_num_right, column=2, columnspan=2) row_num_right += 1 self.label_data_source_no_fly_zones = Label(self.root, text="No-fly zones:") self.label_data_source_no_fly_zones.grid(row=row_num_right, column=2) self.label_data_source_no_fly_zones_res = Label(self.root, text="not loaded") self.label_data_source_no_fly_zones_res.configure(fg='red') self.label_data_source_no_fly_zones_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_data_source_height_map = Label(self.root, text="Altitude map:") self.label_data_source_height_map.grid(row=row_num_right, column=2) self.label_data_source_height_map_res = Label(self.root, text="not loaded") self.label_data_source_height_map_res.configure(fg='red') self.label_data_source_height_map_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_data_source_droneID = Label(self.root, text="DroneID:") self.label_data_source_droneID.grid(row=row_num_right, column=2) self.label_data_source_droneID_res = Label(self.root, text="not loaded") self.label_data_source_droneID_res.configure(fg='red') self.label_data_source_droneID_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_data_source_adsb = Label(self.root, text="ADS-B:") self.label_data_source_adsb.grid(row=row_num_right, column=2) self.label_data_source_adsb_res = Label(self.root, text="not loaded") self.label_data_source_adsb_res.configure(fg='red') self.label_data_source_adsb_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_data_source_weather = Label(self.root, text="Weather:") self.label_data_source_weather.grid(row=row_num_right, column=2) self.label_data_source_weather_res = Label(self.root, text="not loaded") self.label_data_source_weather_res.configure(fg='red') self.label_data_source_weather_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_data_rally_point = Label(self.root, text="Rally points:") self.label_data_rally_point.grid(row=row_num_right, column=2) self.label_data_rally_point_res = Label(self.root, text="not loaded") self.label_data_rally_point_res.configure(fg='red') self.label_data_rally_point_res.grid(row=row_num_right, column=3) row_num_right += 1 # gpe = global path evaluator self.label_gpe = Label(self.root, text="Global path evaluator", font=("Arial Bold", 12)) self.label_gpe.grid(row=row_num_right, column=2, columnspan=2) row_num_right += 1 self.button_evaluate_path = Button(self.root, text="Evaluate", command=self.start_evaluation) self.button_evaluate_path.configure( state='disabled') # Disabled because no global plan has been made self.button_evaluate_path.grid(row=row_num_right, column=2, columnspan=2) row_num_right += 1 self.label_gpe_fitness = Label(self.root, text="Fitness:") self.label_gpe_fitness.grid(row=row_num_right, column=2) self.label_gpe_fitness_res = Label(self.root, text="N/A") self.label_gpe_fitness_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_dist_tot = Label(self.root, text="Total distance:") self.label_gpe_dist_tot.grid(row=row_num_right, column=2) self.label_gpe_dist_tot_res = Label(self.root, text="N/A") self.label_gpe_dist_tot_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_dist_horz = Label(self.root, text="Horizontal distance:") self.label_gpe_dist_horz.grid(row=row_num_right, column=2) self.label_gpe_dist_horz_res = Label(self.root, text="N/A") self.label_gpe_dist_horz_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_dist_vert = Label(self.root, text="Vertical distance:") self.label_gpe_dist_vert.grid(row=row_num_right, column=2) self.label_gpe_dist_vert_res = Label(self.root, text="N/A") self.label_gpe_dist_vert_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_eta = Label(self.root, text="Estimated flight time:") self.label_gpe_eta.grid(row=row_num_right, column=2) self.label_gpe_eta_res = Label(self.root, text="N/A") self.label_gpe_eta_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_wps = Label(self.root, text="Waypoints:") self.label_gpe_wps.grid(row=row_num_right, column=2) self.label_gpe_wps_res = Label(self.root, text="N/A") self.label_gpe_wps_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_runtime = Label(self.root, text="Runtime:") self.label_gpe_runtime.grid(row=row_num_right, column=2) self.label_gpe_runtime_res = Label(self.root, text="N/A") self.label_gpe_runtime_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_bytes_tot = Label(self.root, text="Bytes total:") self.label_gpe_bytes_tot.grid(row=row_num_right, column=2) self.label_gpe_bytes_tot_res = Label(self.root, text="N/A") self.label_gpe_bytes_tot_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_objects_tot = Label(self.root, text="Objects total:") self.label_gpe_objects_tot.grid(row=row_num_right, column=2) self.label_gpe_objects_tot_res = Label(self.root, text="N/A") self.label_gpe_objects_tot_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_bytes_planner = Label(self.root, text="Bytes planner:") self.label_gpe_bytes_planner.grid(row=row_num_right, column=2) self.label_gpe_bytes_planner_res = Label(self.root, text="N/A") self.label_gpe_bytes_planner_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_gpe_objects_planner = Label(self.root, text="Objects planner:") self.label_gpe_objects_planner.grid(row=row_num_right, column=2) self.label_gpe_objects_planner_res = Label(self.root, text="N/A") self.label_gpe_objects_planner_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_planning_info = Label(self.root, text="Planning information", font=("Arial Bold", 12)) self.label_planning_info.grid(row=row_num_right, column=2, columnspan=2) row_num_right += 1 self.label_global_plan_status = Label(self.root, text="Status:") self.label_global_plan_status.grid(row=row_num_right, column=2) self.label_global_plan_status_res = Label(self.root, text="idle") self.label_global_plan_status_res.configure(fg='green') self.label_global_plan_status_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_start_heuristic = Label(self.root, text="Start heuristic:") self.label_global_plan_start_heuristic.grid(row=row_num_right, column=2) self.label_global_plan_start_heuristic_res = Label(self.root, text="N/A") self.label_global_plan_start_heuristic_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_cur_heuristic = Label(self.root, text="Best heuristic:") self.label_global_plan_cur_heuristic.grid(row=row_num_right, column=2) self.label_global_plan_cur_heuristic_res = Label(self.root, text="N/A") self.label_global_plan_cur_heuristic_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_horz_step_size = Label( self.root, text="Horizontal step-size:") self.label_global_plan_horz_step_size.grid(row=row_num_right, column=2) self.label_global_plan_horz_step_size_res = Label(self.root, text="N/A") self.label_global_plan_horz_step_size_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_vert_step_size = Label( self.root, text="Vertical step-size:") self.label_global_plan_vert_step_size.grid(row=row_num_right, column=2) self.label_global_plan_vert_step_size_res = Label(self.root, text="N/A") self.label_global_plan_vert_step_size_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_search_time = Label(self.root, text="Search time:") self.label_global_plan_search_time.grid(row=row_num_right, column=2) self.label_global_plan_search_time_res = Label(self.root, text="N/A") self.label_global_plan_search_time_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_nodes_visited = Label(self.root, text="Nodes visited:") self.label_global_plan_nodes_visited.grid(row=row_num_right, column=2) self.label_global_plan_nodes_visited_res = Label(self.root, text="N/A") self.label_global_plan_nodes_visited_res.grid(row=row_num_right, column=3) row_num_right += 1 self.label_global_plan_nodes_explored = Label(self.root, text="Nodes explored:") self.label_global_plan_nodes_explored.grid(row=row_num_right, column=2) self.label_global_plan_nodes_explored_res = Label(self.root, text="N/A") self.label_global_plan_nodes_explored_res.grid(row=row_num_right, column=3) """ Both sides """ if row_num_left > row_num_right: row_num_both = row_num_left else: row_num_both = row_num_right row_num_both += 1 self.label_global_path = Label(self.root, text="Global path:") self.label_global_path.grid(row=row_num_both, column=0) self.scrolledtext_global_path = tkst.ScrolledText(self.root, height=5) self.scrolledtext_global_path.grid(row=row_num_both, column=1, columnspan=3) row_num_both += 1 self.label_local_path = Label(self.root, text="Local path:") self.label_local_path.grid(row=row_num_both, column=0) self.scrolledtext_local_path = tkst.ScrolledText(self.root, height=5) self.scrolledtext_local_path.grid(row=row_num_both, column=1, columnspan=3) row_num_both += 1 self.button_show_result_webpage_global = Button( self.root, text="2D global path visualization (local)", command=self.show_result_webpage_global) self.button_show_result_webpage_global.configure( state='disabled') # Disabled because no global plan has been made self.button_show_result_webpage_global.grid(row=row_num_both, column=0, columnspan=2) #row_num_both += 1 self.button_show_result_webpage_local = Button( self.root, text="2D local path visualization (local)", command=self.show_result_webpage_local) self.button_show_result_webpage_local.configure( state='disabled') # Disabled because no global plan has been made self.button_show_result_webpage_local.grid(row=row_num_both, column=2, columnspan=2) row_num_both += 1 self.button_web_visualize_global = Button( self.root, text="3D global path visualization (online)", command=self.show_web_visualize_global) self.button_web_visualize_global.configure( state='disabled') # Disabled because no global plan has been made self.button_web_visualize_global.grid(row=row_num_both, column=0, columnspan=2) #row_num_both += 1 self.button_web_visualize_local = Button( self.root, text="3D local path visualization (online)", command=self.show_web_visualize_local) self.button_web_visualize_local.configure( state='disabled') # Disabled because no global plan has been made self.button_web_visualize_local.grid(row=row_num_both, column=2, columnspan=2) row_num_both += 1 self.button_gen_global_sim_files = Button( self.root, text="Generate global path simulation files", command=self.gen_global_sim_files) self.button_gen_global_sim_files.configure( state='disabled') # Disabled because no global plan has been made self.button_gen_global_sim_files.grid(row=row_num_both, column=0, columnspan=2) #row_num_both += 1 self.button_gen_local_sim_files = Button( self.root, text="Generate local path simulation files", command=self.gen_local_sim_files) self.button_gen_local_sim_files.configure( state='disabled') # Disabled because no global plan has been made self.button_gen_local_sim_files.grid(row=row_num_both, column=2, columnspan=2) row_num_both += 1 self.label_credit = Label( self.root, text="Copyright (c) 2018, Tobias Lundby, BSD 3-Clause License", fg="grey", font=("Arial 8 italic")) self.label_credit.grid(row=row_num_both, column=0, columnspan=4) # Configure the queue callback self.root.after(250, self.check_queue) # Start the main loop self.root.mainloop()
class editPool(Frame): font_decorations = ('italic', 'bold', 'subscript', 'superscript') font_decorations_to_names = { 'italic': _('italic'), 'bold': _('bold'), 'subscript': _('subscript'), 'superscript': _('superscript') } font_decorations_to_html = { 'italic': 'i', 'bold': 'b', 'subscript': 'sub', 'superscript': 'sup' } def __init__(self, master, buttons=('interpret', 'asis'), **kw): Frame.__init__(self, master, **kw) self.text = '' self.interpret = 1 self.editPool = Entry(self, width=50, state='disabled', font="Helvetica 12") self.editPool.pack(side='left') self.editPool.bind('<Return>', self._interpretButtonPressed) self.editPool.bind('<Escape>', self._cancel) self.editPool.bind('<Control-s>', lambda e: self._tag_it("sub")) self.editPool.bind('<Control-S>', lambda e: self._tag_it("sup")) self.editPool.bind('<Control-i>', lambda e: self._tag_it("i")) self.editPool.bind('<Control-b>', lambda e: self._tag_it("b")) self.editPool.bind("<KeyPress>", self._key) if 'interpret' in buttons: pix = Store.app.request('pixmap', name='interpret') self.interpretButton = Button(self, text=_('Interpret'), image=pix, command=self._interpretButtonPressed, state='disabled', bd=config.border_width) Store.app.balloon.bind(self.interpretButton, _('Interpret text (where applicable)')) self.interpretButton.pack(side='left') else: self.interpretButton = None if 'asis' in buttons: pix = Store.app.request('pixmap', name='asis') self.setButton = Button(self, image=pix, text=_('As is'), command=self._setButtonPressed, state='disabled', bd=config.border_width) Store.app.balloon.bind(self.setButton, _('Leave text as is - do not interpret')) self.setButton.pack(side='left') else: self.setButton = None pix = Store.app.request('pixmap', name='subnum') self.numbersToSubButton = Button( self, image=pix, text=_('Sub numbers'), command=self._numbersToSubButtonPressed, state='disabled', bd=config.border_width) Store.app.balloon.bind(self.numbersToSubButton, _('Convert numbers to subscript')) self.numbersToSubButton.pack(side='left') # text decoration decorFrame = Frame(self) decorFrame.pack(padx=5, side="left") for i in self.font_decorations: pix = Store.app.request('pixmap', name=i) self.__dict__[i] = Button( self, image=pix, command=misc.lazy_apply(self._tag_it, (self.font_decorations_to_html[i], )), state='disabled', text=self.font_decorations_to_names[i], bd=config.border_width) Store.app.balloon.bind(self.__dict__[i], self.font_decorations_to_names[i]) self.__dict__[i].pack(side="left") # special characters pix = Store.app.request('pixmap', name='specialchar') self.specialCharButton = Button(self, image=pix, text=_('Special Character'), command=self._specialCharButtonPressed, state='disabled', bd=config.border_width) Store.app.balloon.bind(self.specialCharButton, _('Insert a special character')) self.specialCharButton.pack(side='left') self.active = False def _interpretButtonPressed(self, *e): t = self.editPool.get() if string.lower(t) in groups_table: self._setText(t) #self._setText( groups_table[ string.lower(t)]['text']) #self.editPool.insert(0, self.text) else: self._setText(t) self.text = re.sub("\\\\n", "\n", self.text) self._quit() def _setButtonPressed(self, *e): self._setText(self.editPool.get()) self.interpret = 0 self._quit() def _numbersToSubButtonPressed(self, *e): self._setText(re.sub("\d+", '<sub>\g<0></sub>', self.editPool.get())) self._quit() def _cancel(self, e): self._setText(None) self.active = False self._quit() def _quit(self): self.grab_release() self._disable() self._normaly_terminated = 1 self.active = False self.quit() def _disable(self): self.interpretButton.configure(state='disabled') self.numbersToSubButton.configure(state='disabled') self.setButton.configure(state='disabled') self.editPool.configure(state='disabled') self.italic.configure(state='disabled') self.bold.configure(state='disabled') self.superscript.configure(state='disabled') self.subscript.configure(state='disabled') self.specialCharButton.configure(state='disabled') def _enable(self): self.interpretButton.configure(state='normal') self.numbersToSubButton.configure(state='normal') self.setButton.configure(state='normal') self.editPool.configure(state='normal') self.italic.configure(state='normal') self.bold.configure(state='normal') self.superscript.configure(state='normal') self.subscript.configure(state='normal') self.specialCharButton.configure(state='normal') def _setText(self, text): self.text = text self._update() def _update(self): self.editPool.delete(0, last='end') if self.text: self.editPool.insert(0, self.text) def activate(self, text=None, select=1): """activates edit_pool and returns inserted value (None if cancel occured), if parameter text is None it preserves the old one, use text='' to delete old text""" self.active = True self.interpret = 1 self.focus_set() self.grab_set() self._enable() # this is because I need to distinguish whether the mainloop was terminated "from inside" # or from outside (this most of the time means the application was killed and the widgets are no longer available) self._normaly_terminated = 0 if text != None: self._setText(text) self.editPool.focus_set() if select: self.editPool.selection_range(0, 'end') self.mainloop() if self._normaly_terminated: return self.text else: return None def _tag_it(self, tag): if self.editPool.selection_present(): self.editPool.insert(Tkinter.SEL_FIRST, '<%s>' % tag) self.editPool.insert(Tkinter.SEL_LAST, '</%s>' % tag) else: self.editPool.insert(Tkinter.INSERT, '<%s></%s>' % (tag, tag)) self.editPool.icursor( self.editPool.index(Tkinter.INSERT) - len(tag) - 3) def _key(self, event): if len(event.keysym) > 1 and event.keysym in keysyms: if self.editPool.selection_present(): self.editPool.delete("anchor", "insert") self.editPool.insert('insert', unicode(keysyms[event.keysym])) return "break" def _specialCharButtonPressed(self): dialog = special_character_menu(self._insertText) dialog.post(self.specialCharButton.winfo_rootx(), self.specialCharButton.winfo_rooty()) def _insertText(self, text): if text != None: self.editPool.insert(Tkinter.INSERT, text) self.grab_set()
class BoardFrame(Frame): def __init__(self, master): Frame.__init__(self, master) self.configure(background="#336600") # Divide screen in horizontal zones self.infoFrame = Frame(self) # contains helper buttons and timer self.topCardsFrame = Frame(self) # contains stock, waste and foundations self.tableauFrame = Frame(self) # contains tableau piles self.infoFrame.pack(side="top", fill="x", expand=False) self.topCardsFrame.pack(side="top", fill="x", expand=False) self.tableauFrame.pack(side="top", fill="both", expand=True) # Divide the info frame in 2 vertically self.possibleMovesFrame = Frame(self.infoFrame) self.timerFrame = Frame(self.infoFrame) self.possibleMovesFrame.pack(side="left", fill="x", expand=True) self.timerFrame.pack(side="right", fill="x", expand=True) # Divide the top cards frame in 2 vertically self.topCardsLeft = Frame(self.topCardsFrame) self.topCardsRight = Frame(self.topCardsFrame) self.topCardsLeft.pack(side="left", fill="x", expand=True) self.topCardsRight.pack(side="right", fill="x", expand=True) # In top left put 2 frames for the stock and the waste self.stockFrame = Frame(self.topCardsLeft) self.wasteFrame = Frame(self.topCardsLeft) self.stockFrame.pack(side="left", fill="x", expand=True) self.wasteFrame.pack(side="right", fill="x", expand=True) # In top right put 4 frames for the 4 foundations self.HFrame = Frame(self.topCardsRight) self.CFrame = Frame(self.topCardsRight) self.SFrame = Frame(self.topCardsRight) self.DFrame = Frame(self.topCardsRight) self.HFrame.pack(side="right", fill="both", expand=True) self.CFrame.pack(side="right", fill="both", expand=True) self.DFrame.pack(side="right", fill="both", expand=True) self.SFrame.pack(side="right", fill="both", expand=True) # In bottom frame put 7 frames for the tableau piles self.tableauFrames = [] for i in range(0, 7): self.tableauFrames.append(Frame(self.tableauFrame)) self.tableauFrames[i].pack(side="left", fill="y", expand=True) # Dictionary which will links cards in the tableau # to buttons which represent them self.cardButtons = {} # When a tableau pile is empty, a corresponding button will be stored # in this dictionnary to allow the user to put a card on an empty pile self.tableauFirstCardButtons = {} # Load common images imageBack = Image.open("../img/back.bmp") self.photoBack = ImageTk.PhotoImage(imageBack) self.photoBackCropped = ImageTk.PhotoImage(imageBack.crop((0, 0, imageBack.size[0], imageBack.size[1]/4))) self.photoEmpty = ImageTk.PhotoImage(Image.open("../img/empty.bmp")) self.photoHEmpty = ImageTk.PhotoImage(Image.open("../img/Hempty.bmp")) self.photoCEmpty = ImageTk.PhotoImage(Image.open("../img/Cempty.bmp")) self.photoSEmpty = ImageTk.PhotoImage(Image.open("../img/Sempty.bmp")) self.photoDEmpty = ImageTk.PhotoImage(Image.open("../img/Dempty.bmp")) # Put possible moves button self.possibleMovesButton = Button(self.possibleMovesFrame) self.possibleMovesButton.text = "Show possible moves" self.possibleMovesButton.pack(side="top", fill="both", expand=False) # Put initial waste button self.wasteButton = Button(self.wasteFrame, image=self.photoEmpty) self.wasteButton.photo = self.photoEmpty self.wasteButton.pack(side="top", fill="both", expand=False) # Put initial stock button self.stockButton = Button(self.stockFrame, image=self.photoBack) self.stockButton.photo = self.photoBack self.stockButton.pack(side="top", fill="both", expand=False) # Put initial foundations buttons self.HButton = Button(self.HFrame, image=self.photoHEmpty) self.CButton = Button(self.CFrame, image=self.photoCEmpty) self.SButton = Button(self.SFrame, image=self.photoSEmpty) self.DButton = Button(self.DFrame, image=self.photoDEmpty) self.HButton.pack(side="top", fill="both", expand=False) self.CButton.pack(side="top", fill="both", expand=False) self.SButton.pack(side="top", fill="both", expand=False) self.DButton.pack(side="top", fill="both", expand=False) # To be called by the controller giving as argument # a list of possible move def showPossibleMoves(self, possibleMoves): # if no move is possible focus stock button if (not possibleMoves): self.focusButton(self.stockButton, True) sleep(1) self.unfocusButton(self.stockButton) return 0 for origin in possibleMoves.keys(): self.focusButton(origin, True) for destination in possibleMoves[origin]: self.focusButton(destination, False) sleep(1) self.unfocusButton(origin) for destination in possibleMoves[origin]: self.unfocusButton(destination) sleep(0.5) return 0 # change the background of a button to focus on it def focusButton(self, button, isOrigin): color="red" if (isOrigin): color = "green" button.configure(highlightbackground=color) button.update_idletasks() # change the background of a button to unfocus on it def unfocusButton(self, button): button.configure(highlightbackground="white") button.update_idletasks() # To be called by the controller when the board # publish the refreshGUI event def updateGUI(self, board): print(board.__str__()) # Update stock and waste buttons resetStockButtonImage = True if (len(board.stock) > 0): if (resetStockButtonImage): self.stockButton.configure(image=self.photoBack) resetStockButtonImage = False else: self.stockButton.configure(image=self.photoEmpty) resetStockButtonImage = True if (len(board.waste) == 0): self.wasteButton.configure(image=self.photoEmpty) else: self.wasteButton.configure(image=board.waste[-1].photoFaceUp) # Update foundations buttons if (len(board.H) > 0): self.HButton.configure(image=board.H[-1].photoFaceUp) else: self.HButton.configure(image=self.photoHEmpty) if (len(board.C) > 0): self.CButton.configure(image=board.C[-1].photoFaceUp) else: self.CButton.configure(image=self.photoCEmpty) if (len(board.S) > 0): self.SButton.configure(image=board.S[-1].photoFaceUp) else: self.SButton.configure(image=self.photoSEmpty) if (len(board.D) > 0): self.DButton.configure(image=board.D[-1].photoFaceUp) else: self.DButton.configure(image=self.photoDEmpty) # Update tableau piles # Remove old buttons in each frame for f in self.tableauFrames: if (len(f.winfo_children()) > 0): for child in f.winfo_children(): child.destroy() frame = -1 for pile in board.PlayingStacks: frame += 1 r = -1 # if a pile is empty, create a button to represent it and add # the button to the dictionary. # If the pile is not empty anymore destroy the button. if (len(pile) == 0): newButton = Button(self.tableauFrames[frame], image=self.photoEmpty) newButton.grid(row=0, column=0) self.tableauFirstCardButtons[frame] = newButton elif frame in self.tableauFirstCardButtons: self.tableauFirstCardButtons[frame].destroy() del self.tableauFirstCardButtons[frame] for card in pile: r += 1 if (card != pile[-1]): if (card.facedown): image=self.photoBackCropped else: image=card.photoFaceUpCropped else: if (card.facedown): image=self.photoBack else: image=card.photoFaceUp newButton = Button(self.tableauFrames[frame], image=image) newButton.grid(row=r, column=0) if (not card.facedown): self.cardButtons[card] = newButton # remove old entries from dictionary for k in self.cardButtons.keys(): isInTableau = False for stack in board.PlayingStacks: if k in stack: isInTableau = True break if (not isInTableau): self.cardButtons.pop(k, None)
class LED8x8AndButton(object): def __init__(self, buttonDownCallback=None, buttonUpCallback=None): self.root = Tk() self.root.title("8x8") self.buttonUpCallback = buttonUpCallback self.buttonDownCallback = buttonDownCallback self.pixels = [] for y in xrange(8): for x in xrange(8): bt = Button(self.root, bg="gray", width=2, height=1, state="disabled") self.pixels.append(bt) bt.grid(column=x, row=y) self.but = Button(self.root, text="#", width=3, height=1) self.but.grid(column=3, row=8, columnspan=2) self.butColor = Button(self.root, state="disabled", width=3) self.butColor.grid(column=1, row=8, columnspan=2) self.orgColor = self.butColor.cget("bg") self.but.bind("<Button-1>", self._buttonDown) self.but.bind("<ButtonRelease-1>", self._buttonUp) def mainLoop(self): self.root.mainloop() def _setXY(self, x, y, val): if val == 0: self.pixels[y * 8 + x].configure(bg="gray") elif val == 1: self.pixels[y * 8 + x].configure(bg="green") elif val == 2: self.pixels[y * 8 + x].configure(bg="red") elif val == 3: self.pixels[y * 8 + x].configure(bg="orange") else: self.pixels[y * 8 + x].configure(bg="white") def setButtonColor(self, val): if val == 0: self.butColor.configure(bg=self.orgColor) elif val == 1: self.butColor.configure(bg="green") elif val == 2: self.butColor.configure(bg="red") elif val == 3: self.butColor.configure(bg="orange") else: self.butColor.configure(bg="white") def writeDisplay(self, image): pos = 0 for x in xrange(8): sv = 1 v1 = ord(image[pos]) v2 = ord(image[pos + 1]) pos = pos + 2 for y in xrange(8): pv = 0 if (v1 & sv) != 0: pv = pv | 1 if (v2 & sv) != 0: pv = pv | 2 sv = sv << 1 self._setXY(7 - x, y, pv) def _buttonDown(self, event): if self.buttonDownCallback: self.buttonDownCallback() def _buttonUp(self, event): if self.buttonUpCallback: self.buttonUpCallback()
class Conversion(Frame): ''' Script creation graphical user interface. Since this page was crowding the main in order to neat this is a better place for it ''' def __init__(self, master=None, **kwargs): #if not master and options.get('parent'): # master = options['parent'] self.master = master Frame.__init__(self, master) self.img = self.master.img # inner class object container self.objt_c = [] self.file_e = [] def create_conversion_gui(self): # file section #======================= DEFAULTS ========================= _autoload_ = 0 eg_files = [ './Examples/IONP/gromacs/SPIO_em.gro', './Examples/IONP/gromacs/SPIO_part.top', './Examples/IONP/gromacs/forcefield.itp', './Examples/IONP/gromacs/ffoplsaaSI_FE_WATnb.itp', './Examples/IONP/gromacs/ffoplsaaSI_FE_WATbon.itp' ] #eg_files=['conf.gro','topol.top','forcefield.itp','nb.itp','bon.itp'] _atomstyle_ = 'full' data_cont = self.master._convert_['setup'] if data_cont <> []: _autoload_ = data_cont[0] eg_files = data_cont[1:-1] _atomstyle_ = data_cont[-1] if _autoload_: enabled = [1, 1, 0, 0, 0] else: enabled = [1, 1, 1, 1, 1] fi_txt = [ 'Enter the gro file', 'Enter the top file', 'Enter the forcefield file', 'Enter the non bonded file', 'Enter the bonded file' ] ###### CONSTRUCTION SITE ############### ## CS first header row row = Frame(self) TEXT1 = "\nSelect the parameters to perform the conversion: " Label(row, text=TEXT1, anchor='w').pack(side='top', padx=2, pady=10) row.pack(side='top', fill='x', padx=5) bottom_hline_deco(self) ## CS files ------------------------- :@ # appends file entries capturing button also self.objt_c.append(_autoload_) # allocating space for autoload in [0] for fi in range(len(eg_files)): self.file_e.append( File_Entry(self, e_txt=fi_txt[fi], e_val=eg_files[fi])) self.file_e[-1].setter(enabled[fi]) self.objt_c.append(self.file_e[-1]._entry) self.file_e[-1].pack(fill='x') if fi == 1: self.file_e[-1]._strvar.trace('w', self.load_top_file) #sv = self.file_e[-1]._strvar #sv.trace('w', lambda name, index, mode, sv=sv: self.load_top_file(sv) ) #"w" bottom_hline_deco(self) ## CS autoload ------------------------- :@ # self.objt_c.append inside self.autoload_buffer = '' self.autoloadff() bottom_hline_deco(self) ## CS atom style ------------------------- :@ # self.objt_c.append inside bottom_hline_deco(self, self.atomstyle) self.objt_c[-1].set(_atomstyle_) # Final Buttons ------------------------- :@ self.build_finalbuttons() ###### END CONSTRUCTION SITE -> PACK OUTSIDE ######### if self.master.test: print 'Seeing main gro2lam converter GUI' self.after(2000, self.test_hook) def atomstyle(self): ''' in this case just one, but could be modified to be generic, accepting <row>, <text> and <options>''' a_mainrow = Frame(self) row_fst = Frame(a_mainrow) #from self-ttk import Combobox TEXT2 = 'Choose an atom style' format_dec([row_fst, TEXT2]) row_fsep = Frame(row_fst) atom_var = StringVar() atom_style_ddl = Drop_Down_List( row_fsep, textvariable=atom_var, #state="readonly" ) atom_style_ddl['values'] = ('full', 'charge', 'molecular', 'angle', 'bond', 'atomic') atom_style_ddl.bind("<Key>", lambda e: "break") # Magic atom_style_ddl.pack() self.objt_c.append(atom_var) row_fsep.pack(side='left', fill='x', pady=0) # row packing row_fst.pack(side='left', pady=0) a_mainrow.pack(side='top', fill='x', pady=3) def autoloadff(self): ''' function that enables the autoload of the forcefield files as stated in the top file, also as a logic side effect disables the file load option for forcefields ''' _a_row_ = Frame(self) _text_ = 'Autoload forcefield files' bt_txt_ = 'Press to autoload' _f_labels = format_dec([_a_row_, _text_]) self.autol_b = Button( _a_row_, text=bt_txt_, #width = 25, height=23, command=self.autoloadstuff) self.autol_b.pack(padx=0) #side='center', _a_row_.pack(side='top', fill='x', pady=3) def autoloadstuff(self): nonerr_flag = True #_autoload_ = self.objt_c[0].get() main_top_file = self.objt_c[2].get() if self.autoload_buffer <> main_top_file: # self.autoload_buffer = _autoload_ self.autoload_buffer = main_top_file aux_cont, nonerr_flag = get_ffldfiles(main_top_file) if nonerr_flag: for i in [2, 3, 4]: nonerr_flag *= check_file(aux_cont[i - 2]) self.file_e[i]._entry.delete(0, 'end') self.file_e[i]._entry.insert(0, aux_cont[i - 2]) self.file_e[i]._entry.xview_moveto(1) self.file_e[i].setter(0) self.objt_c[0] = (1) else: self.objt_c[0] = (0) elif self.objt_c[0] and self.autoload_buffer == main_top_file: pop_wrg_1('Autoload already performed for selected top file.', _i_=0) if not self.objt_c[0]: pop_err_1('Autoload failed!') self.autoload_buffer = '' self.autol_b.configure(state='disabled') for i in [2, 3, 4]: self.file_e[i].setter(1) def load_top_file(self, *args): #event=None, ''' function to capture the change in the top load button. in order to avoid the the waving experienced with a first "''" in the entry an if is inside ''' #print args if self.objt_c[2].get() <> '': #print ( self.objt_c[2].get()) self.autol_b.configure(state='normal') for i in [2, 3, 4]: self.file_e[i].setter(1) def build_finalbuttons(self): _ypadhere_ = 1 Frame(self).pack(side="top", fill='x', pady=35) # Space _row_ = self self.b1 = Button(_row_, text='Convert', command=self.getdata_and_convert) self.b1.pack(side='right', padx=30, pady=_ypadhere_) b2 = Button(_row_, text='Quit', command=self.quit) b2.pack(side='right', padx=10, pady=_ypadhere_) def getdata_and_convert(self): _autoload_ = self.objt_c[0] if not _autoload_: pop_wrg_1('Proceeding without autoload.\nThis means that any ' + 'internal address to files that are not specified ' + 'as GUI input are going to be ignored.') if self.get_entriesvalues(): data_cont = self.master._convert_['setup'] root_folder = '/'.join(data_cont[1].split('/')[:-1] + ['']) print('Root folder: {}'.format(root_folder)) sim_data, _flags_ = extract_gromacs_data(data_cont[1:-1], _autoload_) flag_done_, _sidemol_ = _flags_ config = [data_cont[-1], _sidemol_, _autoload_, root_folder] if flag_done_: try: flag_done_, data_fnam = write_lammps_data( sim_data, 'data.gro2lam', config) except KeyError as Err: err_str = '' for er in Err.args: err_str += er + ' ' pop_err_1( 'There are missing or incomplete coefficients in' + ' your input files related to: ' + err_str) flag_done_ = False except Exception as Exc: pop_err_1( 'There are inconsistencies in your input files\n' + Exc.args[0]) flag_done_ = False if flag_done_: print_dec_g('Data file generated as "data.gro2lam"') self._convertdata_ = sim_data self._convertdata_['filename'] = data_fnam self._convertdata_['config'] = config # Returning the values self.master._convertdata_ = self._convertdata_ # to ensure freshness of our dependant values self.master._script_['advanced'] = [] self.master._script_['restrain'] = [] self.master.swapbody(2) else: pop_wrg_1('The setup needs some further improvements' + 'to be runed. Please check your inputs') def get_entriesvalues(self): ''' --- app entry getter ---- mainly to obtain values beside check buttons ... which check buttons? ''' e_values = [] _flag_ = True ent_rang = range(len(self.objt_c)) for ent in ent_rang: #[1:]: if ent == 0: e_values.append(self.objt_c[ent]) else: e_values.append(self.objt_c[ent].get()) if ent and ent <= 5: _flag_ *= check_file(e_values[-1]) self.master._convert_['setup'] = e_values return _flag_ def test_hook(self, event=None): self.autol_b.invoke() self.b1.invoke() def createWidgets(self): ''' unified name hook''' self.create_conversion_gui()
class CHEOBCMAKiosk: def __init__(self, top=None): ' "It is a good habit, when building any type of GUI component, to keep a reference to our parent" ' self.top = top top.geometry("600x450+525+240") top.title("CHEO BCMA KIOSK") top.configure(background="#d9d9d9") top.configure(highlightbackground="#d9d9d9") top.configure(highlightcolor="black") '''------------------------------------------------------------------------------------------------------ Begin Build Text Box ''' self.TextBox = Text(top) self.TextBox.place(relx=0.2, rely=0.15, relheight=0.34, relwidth=0.64) self.TextBox.configure(background="white") self.TextBox.configure(borderwidth="2") self.TextBox.configure(highlightbackground="#d9d9d9") self.TextBox.configure(highlightcolor="black") self.TextBox.configure(relief=RIDGE) self.TextBox.configure(takefocus="no") ' Bind mouse clicks ' self.TextBox.bind("<Button-1>", self.textbox_text) self.TextBox.bind("<Button-2>", self.textbox_text) self.TextBox.bind("<Button-3>", self.textbox_text) ' Initial value ' self.TextBox.insert(END, "This is the initial text.") ' Disable content from user entry ' self.TextBox.config(state=DISABLED) self.LabelTitle = Label(top) self.LabelTitle.place(relx=0.03, rely=0.03, height=19, width=311) self.LabelTitle.configure(activebackground="#f9f9f9") self.LabelTitle.configure(activeforeground="black") self.LabelTitle.configure(background="#d9d9d9") self.LabelTitle.configure(disabledforeground="#a3a3a3") self.LabelTitle.configure(foreground="#000000") self.LabelTitle.configure(highlightbackground="#d9d9d9") self.LabelTitle.configure(highlightcolor="black") self.LabelTitle.configure( text= '''Welcome to the CHEO self-serve BCMA employee barcode kiosk''') ''' End Build Canvas ------------------------------------------------------------------------------------------------------''' ''' Build Buttons ------------------------------------------------------------------------------------------------------''' # Print Button self.ButtonPrint = Button(top) self.ButtonPrint.configure(command=self.printBut) self.ButtonPrint.place(relx=0.42, rely=0.89, height=21, width=31) self.ButtonPrint.configure(text='''Print''') self.ButtonPrint.configure(underline="0") self.ButtonPrint.configure(default='active') self.ButtonPrint.configure(takefocus='Yes') # Close Button self.ButtonClose = Button(top) self.ButtonClose.configure(command=quit) self.ButtonClose.place(relx=0.55, rely=0.89, height=21, width=35) self.ButtonClose.configure(activebackground="#d9d9d9") self.ButtonClose.configure(activeforeground="#000000") self.ButtonClose.configure(background="#d9d9d9") self.ButtonClose.configure(disabledforeground="#a3a3a3") self.ButtonClose.configure(foreground="#000000") self.ButtonClose.configure(highlightbackground="#d9d9d9") self.ButtonClose.configure(highlightcolor="black") self.ButtonClose.configure(pady="0") self.ButtonClose.configure(text='''Close''') self.ButtonClose.configure(underline="0") ''' End Build Buttons ------------------------------------------------------------------------------------------------------''' ''' Begin Build Radio Group ------------------------------------------------------------------------------------------------------''' # Default Radio Button Source to TAP self.input_source = StringVar() self.input_source.set('TAP') # Tap Data Entry Radio self.rdo_TAP = Radiobutton(top) self.rdo_TAP.place(relx=0.8, rely=0.82, relheight=0.05, relwidth=0.14) self.rdo_TAP.configure(activebackground="#d9d9d9") self.rdo_TAP.configure(activeforeground="#000000") self.rdo_TAP.configure(background="#d9d9d9") self.rdo_TAP.configure(disabledforeground="#a3a3a3") self.rdo_TAP.configure(foreground="#000000") self.rdo_TAP.configure(highlightbackground="#d9d9d9") self.rdo_TAP.configure(highlightcolor="black") self.rdo_TAP.configure(justify=LEFT) self.rdo_TAP.configure(text='Tap Reader') self.rdo_TAP.configure(underline="0") self.rdo_TAP.configure(value='TAP') self.rdo_TAP.configure(variable=self.input_source) self.rdo_TAP.configure(command=self.radio_toggle) # Manual Data Entry Radio self.rdo_MAN = Radiobutton(top) self.rdo_MAN.place(relx=0.8, rely=0.89, relheight=0.05, relwidth=0.15) self.rdo_MAN.configure(activebackground="#d9d9d9") self.rdo_MAN.configure(activeforeground="#000000") self.rdo_MAN.configure(background="#d9d9d9") self.rdo_MAN.configure(disabledforeground="#a3a3a3") self.rdo_MAN.configure(foreground="#000000") self.rdo_MAN.configure(highlightbackground="#d9d9d9") self.rdo_MAN.configure(highlightcolor="black") self.rdo_MAN.configure(justify=LEFT) self.rdo_MAN.configure(text='Manual Entry') self.rdo_MAN.configure(underline="0") self.rdo_MAN.configure(value="MAN") self.rdo_MAN.configure(variable=self.input_source) self.rdo_MAN.configure(command=self.radio_toggle) ''' End Build Radio Group ------------------------------------------------------------------------------------------------------''' ''' Begin Fixed Labels ------------------------------------------------------------------------------------------------------''' # Last Name self.LabelLastName = Label(top) self.LabelLastName.place(relx=0.1, rely=0.56, height=19, width=56) self.LabelLastName.configure(activebackground="#f9f9f9") self.LabelLastName.configure(activeforeground="black") self.LabelLastName.configure(background="#d9d9d9") self.LabelLastName.configure(disabledforeground="#a3a3a3") self.LabelLastName.configure(foreground="#000000") self.LabelLastName.configure(highlightbackground="#d9d9d9") self.LabelLastName.configure(highlightcolor="black") self.LabelLastName.configure(text='''Last Name''') # First Name self.LabelFirstName = Label(top) self.LabelFirstName.place(relx=0.1, rely=0.62, height=19, width=57) self.LabelFirstName.configure(activebackground="#f9f9f9") self.LabelFirstName.configure(activeforeground="black") self.LabelFirstName.configure(background="#d9d9d9") self.LabelFirstName.configure(disabledforeground="#a3a3a3") self.LabelFirstName.configure(foreground="#000000") self.LabelFirstName.configure(highlightbackground="#d9d9d9") self.LabelFirstName.configure(highlightcolor="black") self.LabelFirstName.configure(text='''First Name''') # AD User Name self.LabelADUserName = Label(top) self.LabelADUserName.place(relx=0.07, rely=0.69, height=19, width=75) self.LabelADUserName.configure(activebackground="#f9f9f9") self.LabelADUserName.configure(activeforeground="black") self.LabelADUserName.configure(background="#d9d9d9") self.LabelADUserName.configure(disabledforeground="#a3a3a3") self.LabelADUserName.configure(foreground="#000000") self.LabelADUserName.configure(highlightbackground="#d9d9d9") self.LabelADUserName.configure(highlightcolor="black") self.LabelADUserName.configure(text='''AD User Name''') # AD Password self.LabelADPassword = Label(top) self.LabelADPassword.place(relx=0.08, rely=0.76, height=19, width=70) self.LabelADPassword.configure(activebackground="#f9f9f9") self.LabelADPassword.configure(activeforeground="black") self.LabelADPassword.configure(background="#d9d9d9") self.LabelADPassword.configure(disabledforeground="#a3a3a3") self.LabelADPassword.configure(foreground="#000000") self.LabelADPassword.configure(highlightbackground="#d9d9d9") self.LabelADPassword.configure(highlightcolor="black") self.LabelADPassword.configure(text='''AD Password''') ''' End Fixed Labels ------------------------------------------------------------------------------------------------------''' ''' Begin Data Entry ------------------------------------------------------------------------------------------------------''' # Last Name self.EntryLastName = Entry(top) self.EntryLastName.place(relx=0.2, rely=0.56, relheight=0.04, relwidth=0.34) self.EntryLastName.configure(background="white") self.EntryLastName.configure(disabledforeground="#a3a3a3") self.EntryLastName.configure(font="TkFixedFont") self.EntryLastName.configure(foreground="#000000") self.EntryLastName.configure(highlightbackground="#d9d9d9") self.EntryLastName.configure(highlightcolor="black") self.EntryLastName.configure(insertbackground="black") self.EntryLastName.configure(selectbackground="#c4c4c4") self.EntryLastName.configure(selectforeground="black") ' Bind mouse clicks ' self.EntryLastName.bind("<Button-1>", self.lastname_text) self.EntryLastName.bind("<Button-2>", self.lastname_text) self.EntryLastName.bind("<Button-3>", self.lastname_text) 'self.EntryLastName.configure(state=readonly)' ' First Name ' self.EntryFirstName = Entry(top) self.EntryFirstName.place(relx=0.2, rely=0.62, relheight=0.04, relwidth=0.34) self.EntryFirstName.configure(background="white") self.EntryFirstName.configure(disabledforeground="#a3a3a3") self.EntryFirstName.configure(font="TkFixedFont") self.EntryFirstName.configure(foreground="#000000") self.EntryFirstName.configure(highlightbackground="#d9d9d9") self.EntryFirstName.configure(highlightcolor="black") self.EntryFirstName.configure(insertbackground="black") self.EntryFirstName.configure(selectbackground="#c4c4c4") self.EntryFirstName.configure(selectforeground="black") '''self.EntryFirstName.configure(label="Hi There") readonly = 'readonly' self.EntryFirstName.configure(state=readonly)''' ' AD User Name ' self.EntryADUserName = Entry(top) self.EntryADUserName.place(relx=0.2, rely=0.69, relheight=0.04, relwidth=0.34) self.EntryADUserName.configure(background="white") self.EntryADUserName.configure(disabledforeground="#a3a3a3") self.EntryADUserName.configure(font="TkFixedFont") self.EntryADUserName.configure(foreground="#000000") self.EntryADUserName.configure(highlightbackground="#d9d9d9") self.EntryADUserName.configure(highlightcolor="black") self.EntryADUserName.configure(insertbackground="black") self.EntryADUserName.configure(selectbackground="#c4c4c4") self.EntryADUserName.configure(selectforeground="black") readonly = 'readonly' self.EntryADUserName.configure(state=readonly) ' Data Payload ' self.EntryADPassword = Entry(top) self.EntryADPassword.place(relx=0.2, rely=0.76, relheight=0.04, relwidth=0.34) self.EntryADPassword.configure(background="white") self.EntryADPassword.configure(disabledforeground="#a3a3a3") self.EntryADPassword.configure(font="TkFixedFont") self.EntryADPassword.configure(foreground="#000000") self.EntryADPassword.configure(highlightbackground="#d9d9d9") self.EntryADPassword.configure(highlightcolor="black") self.EntryADPassword.configure(insertbackground="black") self.EntryADPassword.configure(selectbackground="#c4c4c4") self.EntryADPassword.configure(selectforeground="black") '''readonly = 'readonly' self.EntryADPassword.configure(state=readonly)''' ''' End Data Entry Fields ------------------------------------------------------------------------------------------------------''' ''' Begin Status Bar ------------------------------------------------------------------------------------------------------''' # Create a sunken status bar in the root object with a border self.status_text = StringVar() # Displays live status self.status_text.set("Hello") self.status = Label(root, textvariable=self.status_text, bd=1, relief=SUNKEN, anchor=W) # anchor to the West (Left) self.status.pack(side=BOTTOM, fill=X) # display ''' End Status Bar ------------------------------------------------------------------------------------------------------''' ' Print Button Function' def printBut(self): ' Instantiate ZPLII Class ' ' ??? @@@ ' print('Print button has been pressed') print('Current values... ' + str(self.EntryFirstName)) self.status = "Q" # self.input_source.set(_self.input_source.Get) def radio_toggle(self): ' @@@ ' selection = self.input_source.get() print('Radio button is ' + selection) self.status_text.set("Radio toggled to " + selection) def textbox_text(self, event): print('Text Box Event - ' + str(event)) ' Enable before insert ' if self.TextBox["state"] == DISABLED: self.TextBox.config(state=NORMAL) self.TextBox.insert(END, "\nMouse click in TextBox") ' Disable after insert ' self.TextBox.config(state=DISABLED) def lastname_text(self, event): print('LastName Entry Event - ' + str(event)) ' Enable before insert ' if self.TextBox["state"] == DISABLED: self.TextBox.config(state=NORMAL) self.TextBox.insert(END, "\nMouse click in Last Name field") ' Disable after insert ' self.TextBox.config(state=DISABLED) ' Update status depending on which button pressed ' if event.num == 1: self.status_text.set("Left button clicked") elif event.num == 2: self.status_text.set("Middle button clicked") elif event.num == 3: self.status_text.set("Right button clicked") else: self.status_text.set("*** The " + str(event.num) + " button pressed ***")
class DroneGUI: def __init__(self, master): self.master = master master.title("Drone GUI") ## Initialising framework of GUI frame1 = Frame(master, height=350, width=210, bd=2, relief="sunken") frame1.grid(row=10, column=2, rowspan=6) frame1.grid_propagate(False) ## Buttons self.select_target_button = Button(master, text="Select target", command=self.select_target) self.select_target_button.grid(row=4, column=2) self.start_auto_button = Button(master, text="Start autonomous flight", command=self.start_autonomous) self.start_auto_button.grid(row=5, column=2) self.approach_button = Button(master, text="Approach target", command=self.set_approach) self.approach_button.grid(row=6, column=2) self.e1 = Entry(master) self.e1.grid(row=7, column=2) self.e1.bind("<Return>", self.get_target_distance) self.close_button = Button(master, text="Close", command=self.close_gui) self.close_button.grid(row=8, column=2) self.battery_label = Label(master, text="Battery level: NA") self.battery_label.grid(row=10, column=2) self.x_distance_label = Label(master, text="X Distance: NA") self.x_distance_label.grid(row=11, column=2) self.y_distance_label = Label(master, text="Y Distance: NA") self.y_distance_label.grid(row=12, column=2) self.z_distance_label = Label(master, text="Z Distance: NA") self.z_distance_label.grid(row=13, column=2) self.yaw_distance_label = Label(master, text="Yaw angle: NA") self.yaw_distance_label.grid(row=14, column=2) self.flight_status_label = Label(master, text="Autonomous mode: 0") self.flight_status_label.grid(row=15, column=2) header_label = Label(master, text="Choosing target for drone") header_label.grid(row=1, column=5) self.bb_data = (None, None, None, None) self.image_label = Label(text="", height=720, width=1280) # self.image_label = Label(text = "", height = 480, width = 640) # self.image_label = Label(text = "", height = 448, width = 800) # self.image_label = Label(text = "", height = 1200, width = 1600) self.image_label.grid(row=3, column=5, columnspan=15, rowspan=15) self.control_status = 0 self.xTarget = 0 ## Initialising variables for selecting target self.imgClick = False self.bridge = CvBridge() self.enable_video_stream = None self.prev_img = None self.select_target_bool = False self.circle_center = [None, None] self.pos_x = -1 self.pos_y = -1 # Subscribers self.battery_sub = rospy.Subscriber('/dji_sdk/battery_state', BatteryState, self.update_battery_label) self.target_sub = rospy.Subscriber("/visual_tracker/target", Twist, self.draw_target) self.distance_error_sub = rospy.Subscriber( "/visual_tracker/distance_error", Point, self.update_distance_error) self.image_sub = rospy.Subscriber('/camera/image_decompressed', SensorImage, self.image_subscriber_callback) self.distance_sub = rospy.Subscriber('/laser_wall/wall_position', Float32MultiArray, self.update_distance_label) # Publishers self.gui_target_pub = rospy.Publisher('/visual_tracker/gui_target', Point, queue_size=1) self.frame_pub = rospy.Publisher('/visual_tracker/frame_num', UInt8, queue_size=1) self.control_status_msg = rospy.Publisher( '/visual_tracker/target_tracking_msg', UInt8, queue_size=1) rospy.init_node('gui_v2', anonymous=False) rospy.Timer(rospy.Duration(1.0 / 30.0), self.control_status_publish_callback) rospy.loginfo("GUI initialised") def save_pos(self, event): ## updating the position of the target point from position of mouse click on image self.pos_x = event.x self.pos_y = event.y def get_target_distance(self, entry): val = int(eval(self.e1.get())) if (val < 1 or val > 5): self.e1.delete(0, 10) self.e1.insert("Invalid value") else: self.xTarget = val def close_gui(self): self.control_status = 0 msg = UInt8() for i in range(1, 10): msg.data = self.control_status self.control_status_msg.publish(msg) rospy.sleep(rospy.Duration(0.05)) self.master.quit() def control_status_publish_callback(self, time_event): self.flight_status_label.configure( text="Autonomous mode: {}".format(self.control_status)) msg = UInt8() msg.data = self.control_status self.control_status_msg.publish(msg) def start_autonomous(self): if (self.control_status < 1 and self.circle_center[0] != None): self.control_status = 1 rospy.loginfo("Autonomous tracking started") else: rospy.loginfo("No target selected") def set_approach(self): if (self.control_status > 0 and self.xTarget != 0): self.control_status = 1 + self.xTarget elif (self.xTarget == 0): rospy.loginfo("Approach distance not set") else: rospy.loginfo("No target selected or autonomous control not set") def image_subscriber_callback(self, image): cv_image = CvBridge().imgmsg_to_cv2(image, "rgb8") cv2.circle(cv_image, (640, 360), 1, (255, 0, 0), 10) if self.circle_center[0] != None: cv2.circle( cv_image, (int(self.circle_center[0]), int(self.circle_center[1])), 3, self.circ_color, 10) if self.bb_data[0] != None: cv2.rectangle(cv_image, (self.bb_data[0], self.bb_data[1]), (self.bb_data[0] + self.bb_data[2], self.bb_data[1] + self.bb_data[3]), self.circ_color, 2) self.img = Image.fromarray(cv_image) def draw_target(self, data): self.circle_center = [data.linear.x, data.linear.y] if data.linear.z: self.circ_color = (0, 255, 0) else: self.circ_color = (255, 0, 0) if data.angular.z: self.bb_data = (int(data.linear.x - data.angular.x / 2), int(data.linear.y - data.angular.y / 2), int(data.angular.x), int(data.angular.y)) else: self.bb_data = (None, None, None, None) def update_image(self): ## Updating the image from the 'drone_cam_sub.py', if it's new. The update is automatic with a frequency 20 Hz (50 ms) frequency = 30.0 try: if self.img != self.prev_img: self.imgtk = ImageTk.PhotoImage(self.img) self.image_label.pic = self.imgtk self.image_label.configure(image=self.imgtk) self.prev_img = self.img except: print("Image not updated") self.enable_video_stream = self.image_label.after( int(1000 / frequency), self.update_image) def select_target(self): ## Allows the user to select target, and interrupt selection if wanted if not self.select_target_bool: rospy.loginfo("User is selecting target") self.select_target_bool = True self.imgClick = True self.select_target_button.configure(text="Cancel") self.image_label.bind("<Button-1>", self.target_selected) self.image_label.configure(cursor="dotbox") else: rospy.loginfo("User cancelled selection") self.select_target_bool = False self.imgClick = False self.select_target_button.configure(text="Select target") self.image_label.unbind("<Button-1>") self.image_label.configure(cursor="") def target_selected(self, event): ## Once target has been selected, variables and functions need to be reset. ## By un-commenting line 158 control will be disabled, once autonomous flight is enabled ## (For now it is possible to interfere with the drone by using the keyboard) self.select_target_bool = False rospy.loginfo("User selected target") self.imgClick = False self.save_pos(event) self.publish_pos() self.update_image() self.select_target_button.configure(text="Select target") self.image_label.unbind("<Button-1>") self.image_label.configure(cursor="") def update_distance_label(self, data): self.x_distance_label.configure( text='X Distance:\n{:02.2f} m'.format(data.data[4])) self.yaw_distance_label.configure( text='Yaw angle:\n{:02.2f} deg'.format(data.data[2])) def update_distance_error(self, data): # self.x_distance_label.configure( text = 'X Distance:\n{:02.2f} m'.format(data.x)) self.y_distance_label.configure( text='Y Distance:\n{:02.2f} m'.format(data.y)) self.z_distance_label.configure( text='Z Distance:\n{:02.2f} m'.format(data.z)) def update_battery_label(self, data): self.battery_label.configure( text='Battery level:\n{} %'.format(data.percentage)) def publish_pos(self): #publishing the position of the target position in pixels if not rospy.is_shutdown(): p = Point() p.x = self.pos_x p.y = self.pos_y p.z = 0 self.gui_target_pub.publish(p) rospy.loginfo("New Gui target published (%d, %d)", self.pos_x, self.pos_y)
class FilePickEdit(Frame): def __init__(self, master, file_mask, default_file, edit_height = None, user_onChange = None, rename_on_edit=0, font = None, coloring=True, allowNone=False, highlighter=None, directory='.'): ''' file_mask: file mask (e.g. "*.foo") or list of file masks (e.g. ["*.foo", "*.abl"]) ''' self.master = master self.directory = directory self.user_onChange = user_onChange Frame.__init__(self, master) row = 0 self.unmodified = True self.allowNone = allowNone self.file_extension = "" if type(file_mask) != list: file_mask = [file_mask] if "." in file_mask[0]: self.file_extension = file_mask[0][file_mask[0].rfind('.'):] # read filenames self.file_mask = file_mask self.updateList() # filename frame self.list_frame = Frame(self) self.list_frame.grid(row=row, column=0, sticky="WE") self.list_frame.columnconfigure(0, weight=1) # create list self.picked_name = StringVar(self) self.makelist() # refresh button self.refresh_button = Button(self.list_frame, text='<- refresh', command=self.refresh, height=1) self.refresh_button.grid(row=0, column=1, sticky='E') # save button self.save_button = Button(self.list_frame, text="save", command=self.save, height=1) self.save_button.grid(row=0, column=2, sticky="E") # editor row += 1 if coloring: self.editor = SyntaxHighlightingText(self, self.onEdit, highlighter=highlighter) else: self.editor = ScrolledText2(self, self.onEdit) if font != None: self.editor.configure(font=font) if edit_height is not None: self.editor.configure(height=edit_height) self.editor.grid(row=row, column=0, sticky="NEWS") self.rowconfigure(row, weight=1) self.columnconfigure(0, weight=1) # option to change filename on edit row += 1 self.options_frame = Frame(self) self.options_frame.grid(row=row, column=0, sticky=W) self.rename_on_edit = IntVar() self.cb = Checkbutton(self.options_frame, text="rename on edit", variable=self.rename_on_edit) self.cb.pack(side=LEFT) self.cb.configure(command=self.onChangeRename) self.rename_on_edit.set(rename_on_edit) # filename frame row += 1 self.filename_frame = Frame(self) self.filename_frame.grid(row=row, column=0, sticky="WE") self.filename_frame.columnconfigure(0, weight=1) # save as filename self.save_name = StringVar(self) self.save_edit = Entry(self.filename_frame, textvariable = self.save_name) self.save_edit.grid(row=0, column=0, sticky="WE") self.save_name.trace("w", self.onSaveChange) # pick default if applicableButton self.select(default_file) self.row = row def setDirectory(self, directory, keep=False): self.directory = directory self.updateList() self.makelist() # menu = self.list["menu"] scrolledlist # menu = self.list.listbox#["scrolledlist"] # menu.delete(0, 'end') # add the new ones # for filename in self.files: # menu.add_command(label=filename, command=_setit(self.picked_name, filename, None)) # if keep is true, only the files list will be updated but the content of the # text area will not be altered/removed if not keep: self.select("") def refresh(self): sel = self.get() self.updateList() self.select(sel, notify=False) def reloadFile(self): self.editor.delete("1.0", END) filename = self.picked_name.get() if os.path.exists(os.path.join(self.directory, filename)): new_text = file(os.path.join(self.directory, filename)).read() if new_text.strip() == "": new_text = "// %s is empty\n" % filename; new_text = new_text.replace("\r", "") else: new_text = "" self.editor.insert(INSERT, new_text) def setText(self, txt): ''' Replaces the text in the edit field as by typing into it. ''' self.select("") if txt.strip() == "": txt = "// empty database\n"; self.editor.insert(INSERT, txt) self.onEdit() def onSelChange(self, name, index=0, mode=0): self.reloadFile() filename = self.picked_name.get() self.save_name.set(filename) self.save_edit.configure(state=DISABLED) self.unmodified = True if self.user_onChange != None: self.user_onChange(filename) def onSaveChange(self, name, index, mode): pass # if self.user_onChange != None: # self.user_onChange(self.save_name.get()) def autoRename(self): # modify "save as" name filename = self.picked_name.get() if filename == "": filename = "new" + self.file_extension # if no file selected, create new filename ext = "" extpos = filename.rfind(".") if extpos != -1: ext = filename[extpos:] base = filename[:extpos] hpos = base.rfind("-") num = 0 if hpos != -1: try: num = int(base[hpos+1:]) base = base[:hpos] except: pass while True: num += 1 filename = "%s-%d%s" % (base, num, ext) if not os.path.exists(filename): break self.save_name.set(filename) # user callback if self.user_onChange != None: self.user_onChange(filename) def onEdit(self): if self.unmodified == True: self.unmodified = False # do auto rename if it's enabled or there is no file selected (editing new file) if self.rename_on_edit.get() == 1 or self.picked_name.get() == "": self.autoRename() # enable editing of save as name self.save_edit.configure(state=NORMAL) def onChangeRename(self): # called when clicking on "rename on edit" checkbox if self.rename_on_edit.get() == 1: if (not self.unmodified) and self.save_name.get() == self.picked_name.get(): self.autoRename() else: self.save_name.set(self.picked_name.get()) def updateList(self): self.files = [] if self.allowNone: self.files.append("") if os.path.exists(self.directory): for filename in os.listdir(self.directory): for fm in self.file_mask: if fnmatch(filename, fm): self.files.append(filename) self.files.sort() if len(self.files) == 0 and not self.allowNone: self.files.append("(no %s files found)" % str(self.file_mask )) def select(self, filename, notify=True): ''' selects the item given by filename ''' if filename in self.files: if not havePMW: self.picked_name.set(filename) else: self.list.selectitem(self.files.index(filename)) if notify: self.onSelChange(filename) else: self.editor.delete("1.0", END) def makelist(self): if havePMW: self.list = Pmw.ComboBox(self.list_frame, selectioncommand = self.onSelChange, scrolledlist_items = self.files, ) self.list.grid(row=0, column=0, padx=0, pady=0, sticky="NEWS") self.list.component('entryfield').component('entry').configure(state = 'readonly', relief = 'raised') self.picked_name = self.list else: self.list = apply(OptionMenu, (self.list_frame, self.picked_name) + tuple(self.files)) self.list.grid(row=0, column=0, sticky="NEW") self.picked_name.trace("w", self.onSelChange) def save(self): self.get() def set(self, selected_item): self.select(selected_item) def get(self): ''' gets the name of the currently selected file, saving it first if necessary ''' filename = self.save_name.get() if self.unmodified == False: self.unmodified = True # save the file f = file(os.path.join(self.directory, filename), "w") f.write(self.editor.get("1.0", END).encode('utf-8')) f.close() # add it to the list of files # if not filename in self.files: # self.files.append(filename) # self.files.sort() # self.list.destroy() # self.makelist() # set it as the new pick #if havePMW: # self.picked_name.selectitem(self.files.index(filename), 1) #else: # self.picked_name.set(filename) # self.select(filename) self.refresh() self.select(filename, notify=False) self.save_edit.configure(state=DISABLED) return filename def get_text(self): return self.editor.get("1.0", END) def get_filename(self): return self.save_name.get() def set_enabled(self, state): self.editor.configure(state=state) if havePMW: self.list.component('entryfield_entry').configure(state=state) # self.list.component('arrowbutton').configure(state=state) self.list.component('arrowbutton').bind('<1>', (lambda a: 'break') if state==DISABLED else self.list._postList) else: self.list.configure(state=state) self.save_button.configure(state=state) self.cb.configure(state=state) self.save_edit.configure(state=state)
def __init__(self): window = Tk() window.title('Scientific Calculator') window.configure(background="white") self.string = StringVar() entry = Entry(window, textvariable=self.string) entry.grid(row=0, column=0, columnspan=6) entry.configure(background="white") entry.focus() values = [ "7", "8", "9", "/", "%", "clear", "AC", "4", "5", "6", "*", "(", ")", "**", "1", "2", "3", "-", "=", ",", "0", ".", "min", "+", "sin", "asin", "cos", "acos", "tan()", "pow", "log10", "max", "abs", "floor", "pi", "e", "log", "ceil", "degrees", "radians" ] text = 1 i = 0 row = 1 col = 0 for txt in values: padx = 10 pady = 10 if (i == 7): row = 2 col = 0 if (i == 14): row = 3 col = 0 if (i == 19): row = 4 col = 0 if (i == 26): row = 5 col = 0 if (i == 33): row = 6 col = 0 if (txt == '='): btn = Button(window, height=2, width=4, padx=70, pady=pady, text=txt, command=lambda txt=txt: self.equals()) btn.grid(row=row, column=col, columnspan=3, padx=2, pady=2) btn.configure(background="yellow") elif (txt == 'clear'): btn = Button(window, height=2, width=4, padx=padx, pady=pady, text=txt, command=lambda txt=txt: self.delete()) btn.grid(row=row, column=col, padx=1, pady=1) btn.configure(background="grey") elif (txt == 'AC'): btn = Button(window, height=2, width=4, padx=padx, pady=pady, text=txt, command=lambda txt=txt: self.clearall()) btn.grid(row=row, column=col, padx=1, pady=1) btn.configure(background="red") else: btn = Button(window, height=2, width=4, padx=padx, pady=pady, text=txt, command=lambda txt=txt: self.addChar(txt)) btn.grid(row=row, column=col, padx=1, pady=1) btn.configure(background="cyan") col = col + 1 i = i + 1 window.mainloop()
class MainWindow(Tk): def __init__(self): Tk.__init__(self) self.wm_title("FRCA QBase Reader - Exam Mode") w, h = self.winfo_screenwidth(), self.winfo_screenheight() self.geometry("%dx%d+0+0" % (w, h)) self.bind("<Down>", self.OnSmaller) self.bind("<Up>", self.OnBigger) self.bind("<Right>", self.nextQuestion) self.logic = Logic() self.widgetwraplist = [] self.text = self.logic.prepareQuestion() self.font = tkFont.Font(size=24) self.stmtvar = StringVar() self.stmtvar.set(self.text['question'][0]) self.statement = Label(self, textvariable=self.stmtvar, font=self.font) self.statement.pack(anchor = W) self.widgetwraplist.append(self.statement) self.checkbuttons = {} self.checkbtntext = {} self.checkbuttonvar = {} for i in range(1, 6): self.checkbuttonvar[str(i)] = BooleanVar() self.checkbtntext[str(i)] = StringVar() self.checkbtntext[str(i)].set(self.text['question'][i]) self.checkbuttons['question '+str(i)] = InvokableCheckbutton(self, textvariable = self.checkbtntext[str(i)], variable = self.checkbuttonvar[str(i)], font=self.font) self.checkbuttons['question '+str(i)].pack(anchor = W) self.widgetwraplist.append(self.checkbuttons['question '+str(i)]) self.bind("<Key-"+str(i)+">", self.checkbuttons['question '+str(i)].customInvoke) self.explvar = StringVar() self.explvar.set(' '.join(self.text['question'][6:])) self.explanation = Label(self, textvariable=self.explvar, font=self.font, justify=LEFT) self.widgetwraplist.append(self.explanation) self.buttonNext = Button(self, text = 'Next question', command = lambda: self.nextQuestion(1), font=self.font) self.buttonNext.pack(anchor = S) def nextQuestion(self, event): given_answers = [] self.logic.questioncount += 1 for i in range(1, 6): given_answers.append(self.logic.str2bool(self.checkbuttonvar[str(i)].get())) self.logic.questiondict[self.logic.questionpath]['given answers'] = given_answers if (self.logic.questiondict[self.logic.questionpath]['correct answers'] == self.logic.questiondict[self.logic.questionpath]['given answers']): self.logic.questiondict[self.logic.questionpath]['is correct'] = True else: self.logic.questiondict[self.logic.questionpath]['is correct'] = False if self.logic.questioncount < self.logic.EXAM_END: if self.logic.questioncount == self.logic.EXAM_END-1: self.buttonNext.configure(text='Finish exam') self.text = self.logic.prepareQuestion() self.stmtvar.set(self.text['question'][0]) self.explvar.set(' '.join(self.text['question'][6:])) self.explanation.pack_forget() for i in range(1, 6): self.checkbuttons['question '+str(i)].configure(fg='black') self.checkbuttonvar[str(i)].set(False) self.checkbtntext[str(i)].set(self.text['question'][i]) else: self.stmtvar.set('You scored {}%'.format(str(self.logic.calculateScore()))) if self.logic.calculateScore() >= 80: self.statement.configure(foreground='#009E18') else: self.statement.configure(foreground='red') for i in range(1, 6): self.checkbuttons['question '+str(i)].pack_forget() if self.logic.calculateScore() == 100: self.buttonNext.configure(text='Start a new exam') self.buttonNext.configure(command=lambda: self.startNewExam(1)) self.bind("<Right>", self.startNewExam) else: self.bind("<Right>", self.reviewWindow) self.buttonNext.configure(text='Review wrong answers') self.buttonNext.configure(command= lambda: self.reviewWindow(1)) def reviewWindow(self, event): self.reviewed = 0 self.buttonNext.configure(text='Next') self.buttonNext.pack_forget() for i in range(1, 6): self.checkbuttons['question '+str(i)].pack(anchor = W) self.explanation.pack(anchor = W) self.buttonNext.pack(anchor = S) self.showAnswer(1) def showAnswer(self, event): if self.reviewed == 0: self.bind("<Right>", self.showAnswer) self.buttonNext.configure(command= lambda: self.showAnswer(1)) for q in self.logic.questiondict: if self.logic.questiondict[q]['is correct'] == False: f = open(q, 'r') lines = self.logic.parseQuestion(f) self.stmtvar.set(lines['question'][0]) self.statement.configure(foreground='black') self.explvar.set(' '.join(lines['question'][6:])) for i in range(1, 6): self.checkbtntext[str(i)].set(lines['question'][i]) self.checkbuttonvar[str(i)].set(self.logic.questiondict[q]['given answers'][i-1]) if (self.logic.questiondict[q]['correct answers'][i-1] == self.logic.questiondict[q]['given answers'][i-1]): self.checkbuttons['question '+str(i)].configure(fg='#009E18') else: self.checkbuttons['question '+str(i)].configure(fg='red') del self.logic.questiondict[q] self.reviewed += 1 break if self.reviewed == self.logic.EXAM_END: self.buttonNext.configure(text='Start a new exam') self.buttonNext.configure(command=lambda: self.startNewExam(1)) self.bind("<Right>", self.startNewExam) def startNewExam(self, event): self.logic.questioncount = 0 self.questiondict = {} self.text = self.logic.prepareQuestion() self.stmtvar.set(self.text['question'][0]) for i in range(1, 6): self.checkbuttons['question '+str(i)].configure(fg='black') self.checkbuttonvar[str(i)].set(False) self.checkbtntext[str(i)].set(self.text['question'][i]) self.explanation.pack_forget() self.buttonNext.configure(text='next') self.buttonNext.configure(command=lambda: self.nextQuestion(1)) self.bind("<Right>", self.nextQuestion) def OnBigger(self, event): '''Make the font 2 points bigger''' size = self.font['size'] self.font.configure(size=size+2) def OnSmaller(self, event): '''Make the font 2 points smaller''' size = self.font['size'] self.font.configure(size=size-2) def wrapWidgets(self): self.update() for widget in self.widgetwraplist: widget.configure(wraplength=self.winfo_width())
class Placer(AppShell): # Override class variables here appname = 'Placer Panel' frameWidth = 625 frameHeight = 215 usecommandarea = 0 usestatusarea = 0 def __init__(self, parent = None, **kw): INITOPT = Pmw.INITOPT optiondefs = ( ('title', self.appname, None), ('nodePath', SEditor.camera, None), ) self.defineoptions(kw, optiondefs) # Call superclass initialization function AppShell.__init__(self) self.initialiseoptions(Placer) # Accept the message from sceneEditor to update the information about the target nodePath self.accept('placerUpdate', self.updatePlacer) def appInit(self): # Initialize state self.tempCS = SEditor.group.attachNewNode('placerTempCS') self.orbitFromCS = SEditor.group.attachNewNode( 'placerOrbitFromCS') self.orbitToCS = SEditor.group.attachNewNode('placerOrbitToCS') self.refCS = self.tempCS # Dictionary keeping track of all node paths manipulated so far self.nodePathDict = {} self.nodePathDict['camera'] = SEditor.camera self.nodePathDict['widget'] = SEditor.widget self.nodePathNames = ['camera', 'widget', 'selected'] self.refNodePathDict = {} self.refNodePathDict['parent'] = self['nodePath'].getParent() self.refNodePathDict['render'] = render self.refNodePathDict['camera'] = SEditor.camera self.refNodePathDict['widget'] = SEditor.widget self.refNodePathNames = ['parent', 'self', 'render', 'camera', 'widget', 'selected'] # Initial state self.initPos = Vec3(0) self.initHpr = Vec3(0) self.initScale = Vec3(1) self.deltaHpr = Vec3(0) # Offset for orbital mode self.posOffset = Vec3(0) # Set up event hooks self.undoEvents = [('DIRECT_undo', self.undoHook), ('DIRECT_pushUndo', self.pushUndoHook), ('DIRECT_undoListEmpty', self.undoListEmptyHook), ('DIRECT_redo', self.redoHook), ('DIRECT_pushRedo', self.pushRedoHook), ('DIRECT_redoListEmpty', self.redoListEmptyHook)] for event, method in self.undoEvents: self.accept(event, method) # Init movement mode self.movementMode = 'Relative To:' def createInterface(self): # The interior of the toplevel panel interior = self.interior() interior['relief'] = Tkinter.FLAT # Add placer commands to menubar self.menuBar.addmenu('Placer', 'Placer Panel Operations') self.menuBar.addmenuitem('Placer', 'command', 'Zero Node Path', label = 'Zero All', command = self.zeroAll) self.menuBar.addmenuitem('Placer', 'command', 'Reset Node Path', label = 'Reset All', command = self.resetAll) self.menuBar.addmenuitem('Placer', 'command', 'Print Node Path Info', label = 'Print Info', command = self.printNodePathInfo) self.menuBar.addmenuitem( 'Placer', 'command', 'Toggle widget visability', label = 'Toggle Widget Vis', command = SEditor.toggleWidgetVis) self.menuBar.addmenuitem( 'Placer', 'command', 'Toggle widget manipulation mode', label = 'Toggle Widget Mode', command = SEditor.manipulationControl.toggleObjectHandlesMode) # Get a handle to the menu frame menuFrame = self.menuFrame self.nodePathMenu = Pmw.ComboBox( menuFrame, labelpos = Tkinter.W, label_text = 'Node Path:', entry_width = 20, selectioncommand = self.selectNodePathNamed, scrolledlist_items = self.nodePathNames) self.nodePathMenu.selectitem('selected') self.nodePathMenuEntry = ( self.nodePathMenu.component('entryfield_entry')) self.nodePathMenuBG = ( self.nodePathMenuEntry.configure('background')[3]) self.nodePathMenu.pack(side = 'left', fill = 'x', expand = 1) self.bind(self.nodePathMenu, 'Select node path to manipulate') modeMenu = Pmw.OptionMenu(menuFrame, items = ('Relative To:', 'Orbit:'), initialitem = 'Relative To:', command = self.setMovementMode, menubutton_width = 8) modeMenu.pack(side = 'left', expand = 0) self.bind(modeMenu, 'Select manipulation mode') self.refNodePathMenu = Pmw.ComboBox( menuFrame, entry_width = 16, selectioncommand = self.selectRefNodePathNamed, scrolledlist_items = self.refNodePathNames) self.refNodePathMenu.selectitem('parent') self.refNodePathMenuEntry = ( self.refNodePathMenu.component('entryfield_entry')) self.refNodePathMenu.pack(side = 'left', fill = 'x', expand = 1) self.bind(self.refNodePathMenu, 'Select relative node path') self.undoButton = Button(menuFrame, text = 'Undo', command = SEditor.undo) if SEditor.undoList: self.undoButton['state'] = 'normal' else: self.undoButton['state'] = 'disabled' self.undoButton.pack(side = 'left', expand = 0) self.bind(self.undoButton, 'Undo last operation') self.redoButton = Button(menuFrame, text = 'Redo', command = SEditor.redo) if SEditor.redoList: self.redoButton['state'] = 'normal' else: self.redoButton['state'] = 'disabled' self.redoButton.pack(side = 'left', expand = 0) self.bind(self.redoButton, 'Redo last operation') # Create and pack the Pos Controls posGroup = Pmw.Group(interior, tag_pyclass = Menubutton, tag_text = 'Position', tag_font=('MSSansSerif', 14), tag_activebackground = '#909090', ring_relief = Tkinter.RIDGE) posMenubutton = posGroup.component('tag') self.bind(posMenubutton, 'Position menu operations') posMenu = Menu(posMenubutton, tearoff = 0) posMenu.add_command(label = 'Set to zero', command = self.zeroPos) posMenu.add_command(label = 'Reset initial', command = self.resetPos) posMenubutton['menu'] = posMenu posGroup.pack(side='left', fill = 'both', expand = 1) posInterior = posGroup.interior() # Create the dials self.posX = self.createcomponent('posX', (), None, Floater, (posInterior,), text = 'X', relief = Tkinter.FLAT, value = 0.0, label_foreground = 'Red') self.posX['commandData'] = ['x'] self.posX['preCallback'] = self.xformStart self.posX['postCallback'] = self.xformStop self.posX['callbackData'] = ['x'] self.posX.pack(expand=1,fill='both') self.posY = self.createcomponent('posY', (), None, Floater, (posInterior,), text = 'Y', relief = Tkinter.FLAT, value = 0.0, label_foreground = '#00A000') self.posY['commandData'] = ['y'] self.posY['preCallback'] = self.xformStart self.posY['postCallback'] = self.xformStop self.posY['callbackData'] = ['y'] self.posY.pack(expand=1,fill='both') self.posZ = self.createcomponent('posZ', (), None, Floater, (posInterior,), text = 'Z', relief = Tkinter.FLAT, value = 0.0, label_foreground = 'Blue') self.posZ['commandData'] = ['z'] self.posZ['preCallback'] = self.xformStart self.posZ['postCallback'] = self.xformStop self.posZ['callbackData'] = ['z'] self.posZ.pack(expand=1,fill='both') # Create and pack the Hpr Controls hprGroup = Pmw.Group(interior, tag_pyclass = Menubutton, tag_text = 'Orientation', tag_font=('MSSansSerif', 14), tag_activebackground = '#909090', ring_relief = Tkinter.RIDGE) hprMenubutton = hprGroup.component('tag') self.bind(hprMenubutton, 'Orientation menu operations') hprMenu = Menu(hprMenubutton, tearoff = 0) hprMenu.add_command(label = 'Set to zero', command = self.zeroHpr) hprMenu.add_command(label = 'Reset initial', command = self.resetHpr) hprMenubutton['menu'] = hprMenu hprGroup.pack(side='left',fill = 'both', expand = 1) hprInterior = hprGroup.interior() # Create the dials self.hprH = self.createcomponent('hprH', (), None, AngleDial, (hprInterior,), style = 'mini', text = 'H', value = 0.0, relief = Tkinter.FLAT, label_foreground = 'blue') self.hprH['commandData'] = ['h'] self.hprH['preCallback'] = self.xformStart self.hprH['postCallback'] = self.xformStop self.hprH['callbackData'] = ['h'] self.hprH.pack(expand=1,fill='both') self.hprP = self.createcomponent('hprP', (), None, AngleDial, (hprInterior,), style = 'mini', text = 'P', value = 0.0, relief = Tkinter.FLAT, label_foreground = 'red') self.hprP['commandData'] = ['p'] self.hprP['preCallback'] = self.xformStart self.hprP['postCallback'] = self.xformStop self.hprP['callbackData'] = ['p'] self.hprP.pack(expand=1,fill='both') self.hprR = self.createcomponent('hprR', (), None, AngleDial, (hprInterior,), style = 'mini', text = 'R', value = 0.0, relief = Tkinter.FLAT, label_foreground = '#00A000') self.hprR['commandData'] = ['r'] self.hprR['preCallback'] = self.xformStart self.hprR['postCallback'] = self.xformStop self.hprR['callbackData'] = ['r'] self.hprR.pack(expand=1,fill='both') # Create and pack the Scale Controls # The available scaling modes self.scalingMode = StringVar() self.scalingMode.set('Scale Uniform') # The scaling widgets scaleGroup = Pmw.Group(interior, tag_text = 'Scale Uniform', tag_pyclass = Menubutton, tag_font=('MSSansSerif', 14), tag_activebackground = '#909090', ring_relief = Tkinter.RIDGE) self.scaleMenubutton = scaleGroup.component('tag') self.bind(self.scaleMenubutton, 'Scale menu operations') self.scaleMenubutton['textvariable'] = self.scalingMode # Scaling menu scaleMenu = Menu(self.scaleMenubutton, tearoff = 0) scaleMenu.add_command(label = 'Set to unity', command = self.unitScale) scaleMenu.add_command(label = 'Reset initial', command = self.resetScale) scaleMenu.add_radiobutton(label = 'Scale Free', variable = self.scalingMode) scaleMenu.add_radiobutton(label = 'Scale Uniform', variable = self.scalingMode) scaleMenu.add_radiobutton(label = 'Scale Proportional', variable = self.scalingMode) self.scaleMenubutton['menu'] = scaleMenu # Pack group widgets scaleGroup.pack(side='left',fill = 'both', expand = 1) scaleInterior = scaleGroup.interior() # Create the dials self.scaleX = self.createcomponent('scaleX', (), None, Floater, (scaleInterior,), text = 'X Scale', relief = Tkinter.FLAT, min = 0.0001, value = 1.0, resetValue = 1.0, label_foreground = 'Red') self.scaleX['commandData'] = ['sx'] self.scaleX['callbackData'] = ['sx'] self.scaleX['preCallback'] = self.xformStart self.scaleX['postCallback'] = self.xformStop self.scaleX.pack(expand=1,fill='both') self.scaleY = self.createcomponent('scaleY', (), None, Floater, (scaleInterior,), text = 'Y Scale', relief = Tkinter.FLAT, min = 0.0001, value = 1.0, resetValue = 1.0, label_foreground = '#00A000') self.scaleY['commandData'] = ['sy'] self.scaleY['callbackData'] = ['sy'] self.scaleY['preCallback'] = self.xformStart self.scaleY['postCallback'] = self.xformStop self.scaleY.pack(expand=1,fill='both') self.scaleZ = self.createcomponent('scaleZ', (), None, Floater, (scaleInterior,), text = 'Z Scale', relief = Tkinter.FLAT, min = 0.0001, value = 1.0, resetValue = 1.0, label_foreground = 'Blue') self.scaleZ['commandData'] = ['sz'] self.scaleZ['callbackData'] = ['sz'] self.scaleZ['preCallback'] = self.xformStart self.scaleZ['postCallback'] = self.xformStop self.scaleZ.pack(expand=1,fill='both') # Make sure appropriate labels are showing self.setMovementMode('Relative To:') # Set up placer for inital node path self.selectNodePathNamed('init') self.selectRefNodePathNamed('parent') # Update place to reflect initial state self.updatePlacer() # Now that you're done setting up, attach commands self.posX['command'] = self.xform self.posY['command'] = self.xform self.posZ['command'] = self.xform self.hprH['command'] = self.xform self.hprP['command'] = self.xform self.hprR['command'] = self.xform self.scaleX['command'] = self.xform self.scaleY['command'] = self.xform self.scaleZ['command'] = self.xform ### WIDGET OPERATIONS ### def setMovementMode(self, movementMode): # Set prefix namePrefix = '' self.movementMode = movementMode if (movementMode == 'Relative To:'): namePrefix = 'Relative ' elif (movementMode == 'Orbit:'): namePrefix = 'Orbit ' # Update pos widgets self.posX['text'] = namePrefix + 'X' self.posY['text'] = namePrefix + 'Y' self.posZ['text'] = namePrefix + 'Z' # Update hpr widgets if (movementMode == 'Orbit:'): namePrefix = 'Orbit delta ' self.hprH['text'] = namePrefix + 'H' self.hprP['text'] = namePrefix + 'P' self.hprR['text'] = namePrefix + 'R' # Update temp cs and initialize widgets self.updatePlacer() def setScalingMode(self): if self['nodePath']: scale = self['nodePath'].getScale() if ((scale[0] != scale[1]) or (scale[0] != scale[2]) or (scale[1] != scale[2])): self.scalingMode.set('Scale Free') def selectNodePathNamed(self, name): nodePath = None if name == 'init': nodePath = self['nodePath'] # Add Combo box entry for the initial node path self.addNodePath(nodePath) elif name == 'selected': nodePath = SEditor.selected.last # Add Combo box entry for this selected object self.addNodePath(nodePath) else: nodePath = self.nodePathDict.get(name, None) if (nodePath == None): # See if this evaluates into a node path try: nodePath = eval(name) if isinstance(nodePath, NodePath): self.addNodePath(nodePath) else: # Good eval but not a node path, give up nodePath = None except: # Bogus eval nodePath = None # Clear bogus entry from listbox listbox = self.nodePathMenu.component('scrolledlist') listbox.setlist(self.nodePathNames) else: if name == 'widget': # Record relationship between selected nodes and widget SEditor.selected.getWrtAll() # Update active node path self.setActiveNodePath(nodePath) def setActiveNodePath(self, nodePath): self['nodePath'] = nodePath if self['nodePath']: self.nodePathMenuEntry.configure( background = self.nodePathMenuBG) # Check to see if node path and ref node path are the same if ((self.refCS != None) and (self.refCS.id() == self['nodePath'].id())): # Yes they are, use temp CS as ref # This calls updatePlacer self.setReferenceNodePath(self.tempCS) # update listbox accordingly self.refNodePathMenu.selectitem('parent') else: # Record initial value and initialize the widgets self.updatePlacer() # Record initial position self.updateResetValues(self['nodePath']) # Set scaling mode based on node path's current scale self.setScalingMode() else: # Flash entry self.nodePathMenuEntry.configure(background = 'Pink') def selectRefNodePathNamed(self, name): nodePath = None if name == 'self': nodePath = self.tempCS elif name == 'selected': nodePath = SEditor.selected.last # Add Combo box entry for this selected object self.addRefNodePath(nodePath) elif name == 'parent': nodePath = self['nodePath'].getParent() else: nodePath = self.refNodePathDict.get(name, None) if (nodePath == None): # See if this evaluates into a node path try: nodePath = eval(name) if isinstance(nodePath, NodePath): self.addRefNodePath(nodePath) else: # Good eval but not a node path, give up nodePath = None except: # Bogus eval nodePath = None # Clear bogus entry from listbox listbox = self.refNodePathMenu.component('scrolledlist') listbox.setlist(self.refNodePathNames) # Check to see if node path and ref node path are the same if (nodePath != None) and (nodePath.id() == self['nodePath'].id()): # Yes they are, use temp CS and update listbox accordingly nodePath = self.tempCS self.refNodePathMenu.selectitem('parent') # Update ref node path self.setReferenceNodePath(nodePath) def setReferenceNodePath(self, nodePath): self.refCS = nodePath if self.refCS: self.refNodePathMenuEntry.configure( background = self.nodePathMenuBG) # Update placer to reflect new state self.updatePlacer() else: # Flash entry self.refNodePathMenuEntry.configure(background = 'Pink') def addNodePath(self, nodePath): self.addNodePathToDict(nodePath, self.nodePathNames, self.nodePathMenu, self.nodePathDict) def addRefNodePath(self, nodePath): self.addNodePathToDict(nodePath, self.refNodePathNames, self.refNodePathMenu, self.refNodePathDict) def addNodePathToDict(self, nodePath, names, menu, dict): if not nodePath: return # Get node path's name name = nodePath.getName() if name in ['parent', 'render', 'camera']: dictName = name else: # Generate a unique name for the dict dictName = name + '-' + `nodePath.id()` if not dict.has_key(dictName): # Update combo box to include new item names.append(dictName) listbox = menu.component('scrolledlist') listbox.setlist(names) # Add new item to dictionary dict[dictName] = nodePath menu.selectitem(dictName) def updatePlacer(self): pos = Vec3(0) hpr = Vec3(0) scale = Vec3(1) np = self['nodePath'] if (np != None) and isinstance(np, NodePath): # Update temp CS self.updateAuxiliaryCoordinateSystems() # Update widgets if self.movementMode == 'Orbit:': pos.assign(self.posOffset) hpr.assign(ZERO_VEC) scale.assign(np.getScale()) elif self.refCS: pos.assign(np.getPos(self.refCS)) hpr.assign(np.getHpr(self.refCS)) scale.assign(np.getScale()) self.updatePosWidgets(pos) self.updateHprWidgets(hpr) self.updateScaleWidgets(scale) def updateAuxiliaryCoordinateSystems(self): # Temp CS self.tempCS.setPosHpr(self['nodePath'], 0,0,0,0,0,0) # Orbit CS # At reference self.orbitFromCS.setPos(self.refCS, 0,0,0) # But aligned with target self.orbitFromCS.setHpr(self['nodePath'], 0,0,0) # Also update to CS self.orbitToCS.setPosHpr(self.orbitFromCS, 0,0,0,0,0,0) # Get offset from origin self.posOffset.assign(self['nodePath'].getPos(self.orbitFromCS)) ### NODE PATH TRANSFORMATION OPERATIONS ### def xform(self, value, axis): if axis in ['sx', 'sy', 'sz']: self.xformScale(value,axis) elif self.movementMode == 'Relative To:': self.xformRelative(value, axis) elif self.movementMode == 'Orbit:': self.xformOrbit(value, axis) if self.nodePathMenu.get() == 'widget': if SEditor.manipulationControl.fSetCoa: # Update coa based on current widget position SEditor.selected.last.mCoa2Dnp.assign( SEditor.widget.getMat(SEditor.selected.last)) else: # Move the objects with the widget SEditor.selected.moveWrtWidgetAll() def xformStart(self, data): # Record undo point self.pushUndo() # If moving widget kill follow task and update wrts if self.nodePathMenu.get() == 'widget': taskMgr.remove('followSelectedNodePath') # Record relationship between selected nodes and widget SEditor.selected.getWrtAll() # Record initial state self.deltaHpr = self['nodePath'].getHpr(self.refCS) # Update placer to reflect new state self.updatePlacer() def xformStop(self, data): # Throw event to signal manipulation done # Send nodepath as a list messenger.send('DIRECT_manipulateObjectCleanup', [[self['nodePath']]]) # Update placer to reflect new state self.updatePlacer() # If moving widget restart follow task if self.nodePathMenu.get() == 'widget': # Restart followSelectedNodePath task SEditor.manipulationControl.spawnFollowSelectedNodePathTask() def xformRelative(self, value, axis): nodePath = self['nodePath'] if (nodePath != None) and (self.refCS != None): if axis == 'x': nodePath.setX(self.refCS, value) elif axis == 'y': nodePath.setY(self.refCS, value) elif axis == 'z': nodePath.setZ(self.refCS, value) else: if axis == 'h': self.deltaHpr.setX(value) elif axis == 'p': self.deltaHpr.setY(value) elif axis == 'r': self.deltaHpr.setZ(value) # Put node path at new hpr nodePath.setHpr(self.refCS, self.deltaHpr) def xformOrbit(self, value, axis): nodePath = self['nodePath'] if ((nodePath != None) and (self.refCS != None) and (self.orbitFromCS != None) and (self.orbitToCS != None)): if axis == 'x': self.posOffset.setX(value) elif axis == 'y': self.posOffset.setY(value) elif axis == 'z': self.posOffset.setZ(value) elif axis == 'h': self.orbitToCS.setH(self.orbitFromCS, value) elif axis == 'p': self.orbitToCS.setP(self.orbitFromCS, value) elif axis == 'r': self.orbitToCS.setR(self.orbitFromCS, value) nodePath.setPosHpr(self.orbitToCS, self.posOffset, ZERO_VEC) def xformScale(self, value, axis): if self['nodePath']: mode = self.scalingMode.get() scale = self['nodePath'].getScale() if mode == 'Scale Free': if axis == 'sx': scale.setX(value) elif axis == 'sy': scale.setY(value) elif axis == 'sz': scale.setZ(value) elif mode == 'Scale Uniform': scale.set(value,value,value) elif mode == 'Scale Proportional': if axis == 'sx': sf = value/scale[0] elif axis == 'sy': sf = value/scale[1] elif axis == 'sz': sf = value/scale[2] scale = scale * sf self['nodePath'].setScale(scale) def updatePosWidgets(self, pos): self.posX.set(pos[0]) self.posY.set(pos[1]) self.posZ.set(pos[2]) def updateHprWidgets(self, hpr): self.hprH.set(hpr[0]) self.hprP.set(hpr[1]) self.hprR.set(hpr[2]) def updateScaleWidgets(self, scale): self.scaleX.set(scale[0]) self.scaleY.set(scale[1]) self.scaleZ.set(scale[2]) def zeroAll(self): self.xformStart(None) self.updatePosWidgets(ZERO_VEC) self.updateHprWidgets(ZERO_VEC) self.updateScaleWidgets(UNIT_VEC) self.xformStop(None) def zeroPos(self): self.xformStart(None) self.updatePosWidgets(ZERO_VEC) self.xformStop(None) def zeroHpr(self): self.xformStart(None) self.updateHprWidgets(ZERO_VEC) self.xformStop(None) def unitScale(self): self.xformStart(None) self.updateScaleWidgets(UNIT_VEC) self.xformStop(None) def updateResetValues(self, nodePath): self.initPos.assign(nodePath.getPos()) self.posX['resetValue'] = self.initPos[0] self.posY['resetValue'] = self.initPos[1] self.posZ['resetValue'] = self.initPos[2] self.initHpr.assign(nodePath.getHpr()) self.hprH['resetValue'] = self.initHpr[0] self.hprP['resetValue'] = self.initHpr[1] self.hprR['resetValue'] = self.initHpr[2] self.initScale.assign(nodePath.getScale()) self.scaleX['resetValue'] = self.initScale[0] self.scaleY['resetValue'] = self.initScale[1] self.scaleZ['resetValue'] = self.initScale[2] def resetAll(self): if self['nodePath']: self.xformStart(None) self['nodePath'].setPosHprScale( self.initPos, self.initHpr, self.initScale) self.xformStop(None) def resetPos(self): if self['nodePath']: self.xformStart(None) self['nodePath'].setPos(self.initPos) self.xformStop(None) def resetHpr(self): if self['nodePath']: self.xformStart(None) self['nodePath'].setHpr(self.initHpr) self.xformStop(None) def resetScale(self): if self['nodePath']: self.xformStart(None) self['nodePath'].setScale(self.initScale) self.xformStop(None) def pushUndo(self, fResetRedo = 1): SEditor.pushUndo([self['nodePath']]) def undoHook(self, nodePathList = []): # Reflect new changes self.updatePlacer() def pushUndoHook(self): # Make sure button is reactivated self.undoButton.configure(state = 'normal') def undoListEmptyHook(self): # Make sure button is deactivated self.undoButton.configure(state = 'disabled') def pushRedo(self): SEditor.pushRedo([self['nodePath']]) def redoHook(self, nodePathList = []): # Reflect new changes self.updatePlacer() def pushRedoHook(self): # Make sure button is reactivated self.redoButton.configure(state = 'normal') def redoListEmptyHook(self): # Make sure button is deactivated self.redoButton.configure(state = 'disabled') def printNodePathInfo(self): np = self['nodePath'] if np: name = np.getName() pos = np.getPos() hpr = np.getHpr() scale = np.getScale() posString = '%.2f, %.2f, %.2f' % (pos[0], pos[1], pos[2]) hprString = '%.2f, %.2f, %.2f' % (hpr[0], hpr[1], hpr[2]) scaleString = '%.2f, %.2f, %.2f' % (scale[0], scale[1], scale[2]) print 'NodePath: %s' % name print 'Pos: %s' % posString print 'Hpr: %s' % hprString print 'Scale: %s' % scaleString print ('%s.setPosHprScale(%s, %s, %s)' % (name, posString, hprString, scaleString)) def onDestroy(self, event): # Remove hooks for event, method in self.undoEvents: self.ignore(event) self.tempCS.removeNode() self.orbitFromCS.removeNode() self.orbitToCS.removeNode() # send out a message to let sceneEditor know that placer panel has been closed. # Also, stop accepting the updata message from sceneEditor messenger.send('Placer_close') self.ignore('placerUpdate')
class GameFrame(Frame): def __init__(self, parent): Frame.__init__(self, parent, width=600, height=250) self.parent = parent def init_gui(self): correct = """R0lGODlhQABAAOeqAAAAAAABAAACAAADAAAEAAAFAAAFAQAGAQAHAQEHAQEIAQEJAQEKAQEKAgEL AgEMAgENAgEPAgIPAgIQAgIRAwITAwIUAwIVBAMVBAIWAwIWBAIXBAMXBAMYAwIZBAMZBAMaBQMb BAMdBQMeBQMfBQMgBQQgBQQiBgQkBgQlBgQmBwQnBwUnBgUoBwUqBwUrBwUsBwUsCAUtCAUuCAUv CAYvCAUxCAYyCQYzCAY0CQY1CgY2CQY3CQc3CgY5Cgc5Cgc7Cgc+Cwg/CwdACwhACwhBCwhCCwhG DAhHDAhIDQlLDQlMDglNDglPDglQDglRDglSDgpUDwpWDwtWDwpXDwpZDwtaEAtfEQtgEQthEQxk EQxkEgxlEgxnEgxoEw1oEgxpEgxqEw1qEg1rEwxsEw1sEg1tEw1vEw1wFA1yFA5yFA1zFA50FA50 FQ51FA52FQ95Fg56FQ57Fg97FQ99Fg9+Fg9/Fg+AFhCAFg+BFhCCFhCEFxCGFxCHGBCIGBCKGBGK GBCLGBGMGRGNGRGOGRGQGRGRGRGRGhGSGRGTGhKTGRKTGhGUGhKVGhKXGhKXGxKYGhKaGxKbGxKc GxKdGxKdHBOdGxOdHBKeHBOeGxOeHBOfHBOgHBOhHBOiHBOiHROjHBOjHROkHRSkHROlHRSlHRSm HRSnHRSoHRSrHv////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH SU1QACH5BAEKAP8ALAAAAABAAEAAAAj+AP8JHEiwoMGDCBMqPAhgocOHEB0CaBixosWFEyde3MhR YEaKHUNC/CiyJMYHCTSaXGkQgAcVKVnKHAhgBZIIIGeanAiki4acOkVOlJInBNCgHQEIELOIxFGk GwFASLNJxVOoFgFUiFOKx1WsEQFY0GOqiQCwIQF0ECSqi4KvaDGKWNRJjgW4cRMCOEGI06AWePMy ROGnU6QggQUXBIBij6dPUBIrptk4lKkuAiRPBpCCT6hQdipoVgxgBB9PnAzBGC0YQAY7mzRJWsI6 L4AIazTpVkNg8kgFXDhpwqTorm+JA6aE0kRpk47acQEkMUVJU6cs0NEC8FGKEiVOfQb+ZMcKgMWk TM0joRgPFQCIQMw1bXpy9rjC22+Ea+IUZwJ7pAZcIVx1jdjwX1AAKFHJJt5lgsWBOgGwAyScUHKJ JoJIAKFMpRlSIXOj3LAhSwAkgMeHlIDixYgkauGdJpds4ggFLO5EhCOaWMKcKUMEEGFaJfzBoG6d vAEBgipl9cAZoFRXXSQ41OgRAAHUJgATp1Sn2yZjJNBeARi8FZYMoGByoW6IrEbeD04Y9RAAFBwy JHOYdCFlS1T8UQROCwVgxocwapIIB3cuBsAWppgxQ5KLGfGibpSI4kShLTnQRiqEWPHBUQCYAJ9u zHHCxwGUtiQCH6RwYscRBOS0QBjKsYGqCSk1lMpQDoxs0okjaVjVEABCVBIfc6CwccBxADwxCaiF VEHqBosAqhsnMdiaUABoDCsJIDq40YmZkIJCBgP2/VMiIAxWd4kkTsr6SA7W3ndBJMPJai8naSBQ Lk0zxKalvZo00kO8DgXAxID2UmLJHARLtAAYsdorCQ0NS/TBHcMytwkdFb8JgyHDYuKJCx2/OcQm mFhCSScM73tfFNRhMsoLJY+UwBeneAKHly7fZ0EdqOxQc0UAvFBGBT0/JEAD9SWN0XEBAQA7 """ wrong = """R0lGODlhQABAAOexAAAAAAEAAAIAAAMAAAQAAAUAAAYAAAgAAAkAAAoAAAwAAA0AAA4AAA8AABAA ABEAABIAABMAABQAABUAABYAABcAABgAABkAABoAABsAABwAAB0AAB4AAB8AACAAACEAACIAACMA ACQAACUAACYAACgAACkAACoAACsAACwAAC0AAC4AADEAADMAADQAADUAADYAADgAADkAADoAADsA ADwAAD0AAD4AAD8AAEEAAEIAAEQAAEUAAEkAAEoAAEsAAFQAAFUAAFgAAFkAAF0AAF8AAGEAAGIA AGQAAGcAAGgAAGoAAGsAAG0AAG4AAG8AAHAAAHMAAHgAAHsAAHwAAIEAAIYAAIoAAI4AAJMAAJQA AJUAAJYAAJcAAJgAAJkAAJoAAJsAAJwAAJ0AAJ4AAKAAAKEAAKQAAKcAAKgAAKkAAKoAAK0AAK4A AK8AALAAALEAALMAALUAALcAALgAALkAALoAALsAAL4AAL8AAMAAAMEAAMQAAMUAAMYAAMgAAMkA AMoAAMwAAM0AAM4AAM8AANAAANEAANIAANMAANQAANUAANYAANcAANgAANkAANoAANsAAN0AAN4A AOAAAOEAAOIAAOMAAOQAAOYAAOgAAOkAAOoAAOwAAO0AAO4AAO8AAPAAAPEAAPIAAPMAAPQAAPUA APYAAPcAAPgAAPkAAPoAAPsAAPwAAP0AAP4AAP8AAP////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH SU1QACH5BAEKAP8ALAAAAABAAEAAAAj+AP8JHEhwIAAABRMqXLjwIMOHCQFAgIAQosWGFjRUvNhQ A5sxDTZyvAggwhpAK0SOFAigwxxXo7aEXGmxZBlSqwbFUMmx5Z1To0qN4oKAJ02DCsiQEmqKUA2j DwFsoFOKFKlRpE55CQB1JQABZE5dtVqqEIyuES28STXW6ihWXxweNQhAzCqsVq+eMpQCrUEKamCN wpt3VKsvBPwyBEDASyvChVcdKuEXQIU0giEXVtVFgWKFCbKo0lyY1SEVXQFcaJM5r+u8pbY4+ExQ AZbXuK+uQjTDKAAMckaTdh00pueRCK6IEpqb+ClEOVSqliN0+OugpbgkrinASinmzYn+l0KEYyMA Cm3EWseNVZUXuQ0BVFnVNvxrU4peIATQ4AzM9c0ZtlVqVAhmX4CpKBLCQR8UYkp9BxLHShdFKUTA FDBFyB4ppugBwn4m8CGWhuydIpNKBkxhCoD2mXLHhwad8MeKJLKnBQMbFSAFKODVeJUpe4ggHQiH 0OjjVUJtcQBCAkTBI4u5jXLKIBz4VsEjQB05FipdHLTEKdUdKWUjE6QmQSMPQskeK1sQ4QqEGmJl SiMSVKbBIOppOYoqj6lJXFaFbPAZACT0kaeYcEaI1SmBnEDbPwCgYKiWlOZ1iiAsPMoSCYMYWSmJ QTGS0lwAaNBIlp8qWoolJGhaEAD+EjziaapRlpIJjHMZVEGRiaYqJyWU5foqCH8cSuuWjrTgalQn iHisa6csYsOyEAFgAiCzVhqUJOUJG5UHiWSL6Ca9eVstBYw8mKonZ5lbUxOspJoKGvC5q1AASbDi Z4CrgFGhvQkN0ESatI6CChgPUAvRAFB40uOxYkSg8EIBONGJuNpWZcYCE7+qxFKDPesWh2psZy4A R7TS67F7viFAxwAg8UrIIrO3ShwJKCwAE6nQXDN7qLxBwbIDPBHKyj9bZUobGq0kwBOdPJz0dUvB cQFtADARSpg+yrlvYRzaMVtNSLDlM6ikdJLu1yOfwse/DR0xM9tYlcLJCxIgQrD+mKgAMtO9SvSJ 6CmUTAsAB37s3TUqfmTA0wBOjKwlKpDsUBGheIyo5yl6tEoQw1Gz/eMkPIgEwAh5oKrlKXl4/s8B DWN8IFaadPtqBn2gIrqcf6BwUAaCCIdoKDs1xMAfPW+uiQv7vaCIumiX8ol+USHg7NelYPKDeTgg InWAWWFSbrUN1KG4fVhVIoR0OSCiOvioRKID1mpVxWJQlhDhmwyI3HXgKZEonVcywAboBegUmghC alRwCH0FKHvzOwoAJuAG3R3QEz2oTAkM4T+qfWJ8EkwAHDronE9EsCYpKMT7sBIK6gkLAAFow2jE wwkfPAoAMCBEVcZiCk0U72RWBEiD4jAxBFcBgAaEoBEqJmE7dwFgATcRSikuYQRqASAGg1DFKSAh QIBBCgJh4NAmijAxAKxAEJiwnBcN4gAwdAIIHYNUB24Qx8U8QFn2guEaI/KZgAAAOw==""" self.correct_img = PhotoImage(data=correct) self.wrong_img = PhotoImage(data=wrong) self.entry = Entry(self.parent, width=15, font=('Helvetica', 20, 'normal'), justify=CENTER) self.entry.bind("<Return>", lambda x:self.buttonSubmit.invoke()) self.buttonNext = Button(self.parent, width=10, text="Next Word", command=self.next_word, state=DISABLED) self.buttonSubmit = Button(self.parent, width=10, text="Submit", command=self.submit_word) buttonReplay = Button(self.parent, width=10, text="Repeat Word", command=self.replay_word) self.game_canvas = Canvas(self, width=600, height=250, bg="#FFFFFF") self.word_display = self.game_canvas.create_text((300, 105), text="?", font=("Helvetica", 50, "bold"), fill="#004183") self.progress_display = self.game_canvas.create_text((593, 5), text="%d/%d"%(1, self.parent.list_length), font=("Helvetica", 25, "bold"), anchor=NE) self.timer_display = self.game_canvas.create_text(10, 5, anchor=NW, font=("Helvetica", 25)) self.progress_bar = ProgressBar(self, width=300, increments=len(self.parent.current_list.words)) self.game_canvas.create_window(500, 10, anchor=NE, window=self.progress_bar) self.game_canvas.create_window(300, 180, window=self.entry) self.game_canvas_image = self.game_canvas.create_image(500, 170) self.game_canvas.create_window(150, 230, window=buttonReplay) self.game_canvas.create_window(300, 230, window=self.buttonSubmit) self.game_canvas.create_window(450, 230, window=self.buttonNext) self.game_canvas.pack() def start(self): self.current_list_iter = iter(self.parent.current_list.words) self.current_word = self.current_list_iter.next() self.parent.festival.speech(self.current_word) self.time_elapsed = 0 self.init_gui() self.tick() def next_word(self): try: self.current_word = self.current_list_iter.next() index = self.parent.current_list.words.index(self.current_word) + 1 self.game_canvas.itemconfig(self.progress_display, text="%d/%d" %(index, self.parent.list_length)) if index == self.parent.list_length: self.buttonNext.configure(text="Finish") self.game_canvas.itemconfig(self.word_display, text="?", fill="#004183") self.game_canvas.itemconfig(self.game_canvas_image, state=HIDDEN) self.buttonSubmit.configure(state=NORMAL) self.buttonNext.configure(state=DISABLED) self.parent.festival.speech(self.current_word) except StopIteration: self.list_complete() def list_complete(self): self.parent.after_cancel(self.timer) self.parent.show_results(self.time_elapsed) def replay_word(self): self.parent.festival.speech(self.current_word) def submit_word(self, event=None): guess = self.entry.get() self.entry.delete(0, END) if guess == self.current_word.word: self.correct(guess) else: self.incorrect(guess) self.game_canvas.itemconfig(self.word_display, text='%s'%(self.current_word)) self.buttonNext.configure(state=NORMAL) self.buttonSubmit.configure(state=DISABLED) self.game_canvas.itemconfig(self.game_canvas_image, state=NORMAL) def correct(self, guess): self.current_word.setAnswer(guess, True) self.game_canvas.itemconfig(self.game_canvas_image, image=self.correct_img) self.game_canvas.itemconfig(self.word_display, fill="#139E1C") self.progress_bar.increment(True) def incorrect(self, guess): self.current_word.setAnswer(guess, False) self.game_canvas.itemconfig(self.game_canvas_image, image=self.wrong_img) self.game_canvas.itemconfig(self.word_display, fill="#F30000") self.progress_bar.increment(False) def tick(self): seconds = (self.time_elapsed)%60 minutes = self.time_elapsed/60 separator = ":" if seconds > 9 else ":0" formatted_time = "%d%s%d"%(minutes, separator, seconds) self.game_canvas.itemconfig(self.timer_display, text=formatted_time) self.time_elapsed +=1 self.timer = self.parent.after(1000, self.tick)
class VideoScanProgressScreen(GuiBaseFrame): def __init__(self, parent, controller, **kw): GuiBaseFrame.__init__(self, parent, controller, **kw) self.counting_left_frames = None def init_widgets(self): self.content_wrapper = Frame(self) self.content_wrapper.configure(background="white") self.screen_title = Header1Label( self.content_wrapper, text="Scanning video for information...\n") self.progress_bar = Progressbar(self.content_wrapper, orient=HORIZONTAL, mode="indeterminate", length=WINDOW_WIDTH / 2) self.wait_text = PLabel( self.content_wrapper, text="\nThis might take a few minutes." "\nPlease do not change the video files while this is running.\n") self.left_frames_count = PLabel(self.content_wrapper, text=LEFT_FRAMES_COUNT_PREFIX + "0") self.right_frames_count = PLabel(self.content_wrapper, text=RIGHT_FRAMES_COUNT_PREFIX + "0") self.elapsed_time_label = PLabel(self.content_wrapper) self.empty_space = PLabel(self.content_wrapper, text=" ") self.next_button = Button( self.content_wrapper, text="Next", state=DISABLED, command=lambda: self.controller.show_next_frame()) def add_widgets_to_frame(self): self.screen_title.pack() self.progress_bar.pack() self.wait_text.pack() self.left_frames_count.pack() self.right_frames_count.pack() self.elapsed_time_label.pack() self.empty_space.pack() self.next_button.pack() self.content_wrapper.place(relx=SCREENS_REL_X, rely=SCREEN_REL_Y_45, anchor=CENTER) def on_show_frame(self): self.start_time = time.time() self.progress_bar.start() self.frame_count_thread = threading.Thread( target=self.controller.video_frame_loader.count_frames_in_videos, kwargs={"controller": self.controller}) self.frame_count_thread.start() self.master.after(50, self.check_thread) def update_frame(self, data): if LEFT_FRAMES_COUNT_PREFIX in data: self.left_frames_count.configure(text=data) if RIGHT_FRAMES_COUNT_PREFIX in data: self.right_frames_count.configure(text=data) self.elapsed_time_label.configure( text=ELAPSED_TIME_PREFIX + str(datetime.timedelta(seconds=int(time.time() - self.start_time)))) def on_hide_frame(self): self.progress_bar.stop() def check_thread(self): if self.frame_count_thread.is_alive(): self.master.after(50, self.check_thread) else: self.progress_bar.stop() self.wait_text.configure(text="\nDone!\nPress Next to continue.\n") self.next_button.configure(state=NORMAL)
class editPool(Frame): font_decorations = ("italic", "bold", "subscript", "superscript") font_decorations_to_names = { "italic": _("italic"), "bold": _("bold"), "subscript": _("subscript"), "superscript": _("superscript"), } font_decorations_to_html = {"italic": "i", "bold": "b", "subscript": "sub", "superscript": "sup"} def __init__(self, master, buttons=("interpret", "asis"), **kw): Frame.__init__(self, master, **kw) self.text = "" self.interpret = 1 self.editPool = Entry(self, width=50, state="disabled", font="Helvetica 12") self.editPool.pack(side="left") self.editPool.bind("<Return>", self._interpretButtonPressed) self.editPool.bind("<Escape>", self._cancel) self.editPool.bind("<Control-s>", lambda e: self._tag_it("sub")) self.editPool.bind("<Control-S>", lambda e: self._tag_it("sup")) self.editPool.bind("<Control-i>", lambda e: self._tag_it("i")) self.editPool.bind("<Control-b>", lambda e: self._tag_it("b")) self.editPool.bind("<KeyPress>", self._key) if "interpret" in buttons: pix = Store.app.request("pixmap", name="interpret") self.interpretButton = Button( self, text=_("Interpret"), image=pix, command=self._interpretButtonPressed, state="disabled", bd=config.border_width, ) Store.app.balloon.bind(self.interpretButton, _("Interpret text (where applicable)")) self.interpretButton.pack(side="left") else: self.interpretButton = None if "asis" in buttons: pix = Store.app.request("pixmap", name="asis") self.setButton = Button( self, image=pix, text=_("As is"), command=self._setButtonPressed, state="disabled", bd=config.border_width, ) Store.app.balloon.bind(self.setButton, _("Leave text as is - do not interpret")) self.setButton.pack(side="left") else: self.setButton = None pix = Store.app.request("pixmap", name="subnum") self.numbersToSubButton = Button( self, image=pix, text=_("Sub numbers"), command=self._numbersToSubButtonPressed, state="disabled", bd=config.border_width, ) Store.app.balloon.bind(self.numbersToSubButton, _("Convert numbers to subscript")) self.numbersToSubButton.pack(side="left") # text decoration decorFrame = Frame(self) decorFrame.pack(padx=5, side="left") for i in self.font_decorations: pix = Store.app.request("pixmap", name=i) self.__dict__[i] = Button( self, image=pix, command=misc.lazy_apply(self._tag_it, (self.font_decorations_to_html[i],)), state="disabled", text=self.font_decorations_to_names[i], bd=config.border_width, ) Store.app.balloon.bind(self.__dict__[i], self.font_decorations_to_names[i]) self.__dict__[i].pack(side="left") # special characters pix = Store.app.request("pixmap", name="specialchar") self.specialCharButton = Button( self, image=pix, text=_("Special Character"), command=self._specialCharButtonPressed, state="disabled", bd=config.border_width, ) Store.app.balloon.bind(self.specialCharButton, _("Insert a special character")) self.specialCharButton.pack(side="left") self.active = False def _interpretButtonPressed(self, *e): t = self.editPool.get() if string.lower(t) in groups_table: self._setText(t) # self._setText( groups_table[ string.lower(t)]['text']) # self.editPool.insert(0, self.text) else: self._setText(t) self.text = re.sub("\\\\n", "\n", self.text) self._quit() def _setButtonPressed(self, *e): self._setText(self.editPool.get()) self.interpret = 0 self._quit() def _numbersToSubButtonPressed(self, *e): self._setText(re.sub("\d+", "<sub>\g<0></sub>", self.editPool.get())) self._quit() def _cancel(self, e): self._setText(None) self.active = False self._quit() def _quit(self): self.grab_release() self._disable() self._normaly_terminated = 1 self.active = False self.quit() def _disable(self): self.interpretButton.configure(state="disabled") self.numbersToSubButton.configure(state="disabled") self.setButton.configure(state="disabled") self.editPool.configure(state="disabled") self.italic.configure(state="disabled") self.bold.configure(state="disabled") self.superscript.configure(state="disabled") self.subscript.configure(state="disabled") self.specialCharButton.configure(state="disabled") def _enable(self): self.interpretButton.configure(state="normal") self.numbersToSubButton.configure(state="normal") self.setButton.configure(state="normal") self.editPool.configure(state="normal") self.italic.configure(state="normal") self.bold.configure(state="normal") self.superscript.configure(state="normal") self.subscript.configure(state="normal") self.specialCharButton.configure(state="normal") def _setText(self, text): self.text = text self._update() def _update(self): self.editPool.delete(0, last="end") if self.text: self.editPool.insert(0, self.text) def activate(self, text=None, select=1): """activates edit_pool and returns inserted value (None if cancel occured), if parameter text is None it preserves the old one, use text='' to delete old text""" self.active = True self.interpret = 1 self.focus_set() self.grab_set() self._enable() # this is because I need to distinguish whether the mainloop was terminated "from inside" # or from outside (this most of the time means the application was killed and the widgets are no longer available) self._normaly_terminated = 0 if text != None: self._setText(text) self.editPool.focus_set() if select: self.editPool.selection_range(0, "end") self.mainloop() if self._normaly_terminated: return self.text else: return None def _tag_it(self, tag): if self.editPool.selection_present(): self.editPool.insert(Tkinter.SEL_FIRST, "<%s>" % tag) self.editPool.insert(Tkinter.SEL_LAST, "</%s>" % tag) else: self.editPool.insert(Tkinter.INSERT, "<%s></%s>" % (tag, tag)) self.editPool.icursor(self.editPool.index(Tkinter.INSERT) - len(tag) - 3) def _key(self, event): if len(event.keysym) > 1 and event.keysym in keysyms: if self.editPool.selection_present(): self.editPool.delete("anchor", "insert") self.editPool.insert("insert", unicode(keysyms[event.keysym])) return "break" def _specialCharButtonPressed(self): dialog = special_character_menu(self._insertText) dialog.post(self.specialCharButton.winfo_rootx(), self.specialCharButton.winfo_rooty()) def _insertText(self, text): if text != None: self.editPool.insert(Tkinter.INSERT, text) self.grab_set()
class GuessingGame: def __init__(self, master): self.master = master master.title("Ultra Difficult Phrasing") self.secret_number = random.randint(1, 100) self.guess = None self.num_guesses = 0 self.message = "Try to type the message!" self.label_text = StringVar() self.label_text.set(self.message) self.label = Label(master, textvariable=self.label_text) vcmd = master.register(self.validate) # we have to wrap the command self.entry = Entry(master, validate="key", validatecommand=(vcmd, '%P')) self.guess_button = Button(master, text="Check", command=self.guess_number, foreground="green") self.reset_button = Button(master, text="Reset", command=self.reset, foreground="red") self.label.grid(row=0, column=0, columnspan=2, sticky=W+E) self.entry.grid(row=1, column=0, columnspan=2, sticky=W+E) self.guess_button.grid(row=2, column=0) self.reset_button.grid(row=2, column=1) def validate(self, new_text): if not new_text: # the field is being cleared self.guess = None return True try: guess = String(new_text) if 1 <= guess <= 100: self.guess = guess return True else: return False except ValueError: return False def guess_number(self): self.num_guesses += 1 if self.guess is None: self.message = "Try to type the message!" elif self.guess == self.secret_number: suffix = '' if self.num_guesses == 1 else 'es' self.message = "Congratulations! You guessed the number after %d guess%s." % (self.num_guesses, suffix) self.guess_button.configure(state=DISABLED) self.reset_button.configure(state=NORMAL) elif self.guess < self.secret_number: self.message = "Too low! Guess again!" else: self.message = "Too high! Guess again!" self.label_text.set(self.message) def reset(self): self.entry.delete(0, END) self.secret_number = random.randint(1, 100) self.guess = 0 self.num_guesses = 0 self.message = "Try to type the message:" self.label_text.set(self.message) self.guess_button.configure(state=NORMAL) self.reset_button.configure(state=NORMAL)
class App: def __init__(self, master): self.master = master column0_padx = 24 row_pady = 40 self.imgck = IntVar() self.latck = IntVar() self.lonck = IntVar() self.timeck = IntVar() self.dateck = IntVar() self.datestate = int() self.imgval = StringVar() self.latval = StringVar() self.lonval = StringVar() self.timeval = StringVar() self.dateval = StringVar() self.headerVal = IntVar() self.rbv = IntVar() vcmd = (master.register(self.validate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') self.entryExif = Entry(master, relief="sunken") self.entryExif.insert(0, "EXIF csv file") self.entryExif.grid(row=0, columnspan=4, sticky='EW', padx=5, pady=10) exifbtn = Button(master, text="OPEN CSV file", command=self.getEXIFfile) exifbtn.grid(row=1, column=0, padx=5, sticky='w') ##added to allow header line self.headerOpt = Checkbutton(master, text="Select if CSV file has header line", variable=self.headerVal) self.headerOpt.grid(row=2, column=0, padx=5, sticky='w') self.entryJPGS = Entry(master, relief="sunken") self.entryJPGS.insert(0, "JPEG folder") self.entryJPGS.grid(row=3, columnspan=4, sticky='EW', padx=5, pady=10) JPGbtn = Button(master, text="OPEN JPEG folder", command=self.getJPEGFolder) JPGbtn.grid(row=4, column=0, padx=5, sticky='w') self.paramFile = Entry(master, relief="sunken") self.paramFile.insert(0, "Param file") self.paramFile.grid(row=5, columnspan=4, sticky='EW', padx=5, pady=10) parambtn = Button(master, text="OPEN PARAM file", command=self.getParamfile) parambtn.grid(row=6, column=0, padx=5, sticky='w') lbl_exiftag = Label(master, text="EXIF tag", wraplength=100, anchor='w', justify='left') lbl_column = Label(master, text="CSV column (zero based)", wraplength=100, anchor='w', justify='left') cbImage = Checkbutton(master, text='Image name', variable=self.imgck, command=self.imgcheck) cbLatitude = Checkbutton(master, text='Latitude', variable=self.latck, command=self.latcheck) cbLongitude = Checkbutton(master, text='Longitude', variable=self.lonck, command=self.loncheck) cbTime = Checkbutton(master, text='GPSTime', variable=self.timeck, command=self.timecheck) cbDate = Checkbutton(master, text='GPSDate', variable=self.dateck, command=self.datecheck) lblText = Label(master, text="Free text fields:") lblArtist = Label(master, text="Artist:") ## lbl_analysis = Label(master, text="Analysis Library") self.entryImage = Entry(master, validate='key', validatecommand=vcmd, width=5, state='disabled') self.entryLat = Entry(master, validate='key', validatecommand=vcmd, width=5, state='disabled') self.entryLon = Entry(master, validate='key', validatecommand=vcmd, width=5, state='disabled') self.entryTime = Entry(master, validate='key', validatecommand=vcmd, width=5, state='disabled') self.entryDate = Entry(master, validate='key', validatecommand=vcmd, width=5, state='disabled') self.entryArtist = Entry(master, width=40) #lbl_testcase_exec.grid(row=0, column=2, padx=20, pady=12, sticky='w') lbl_exiftag.grid(row=7, column=0, padx=20, pady=12, sticky='w') lbl_column.grid(row=7, column=1, padx=10, pady=12, sticky='w') cbImage.grid(row=8, column=0, padx=20, sticky='w') cbLatitude.grid(row=9, column=0, padx=20, sticky='w') cbLongitude.grid(row=10, column=0, padx=20, sticky='w') cbTime.grid(row=11, column=0, padx=20, sticky='w') cbDate.grid(row=12, column=0, padx=20, sticky='w') lblText.grid(row=13, column=0, padx=30, sticky='w') lblArtist.grid(row=14, column=0, padx=20, sticky='w') self.entryImage.grid(row=8, column=1, padx=10, sticky='w') self.entryLat.grid(row=9, column=1, padx=10, sticky='w') self.entryLon.grid(row=10, column=1, padx=10, sticky='w') self.entryTime.grid(row=11, column=1, padx=10, sticky='w') self.entryDate.grid(row=12, column=1, padx=10, sticky='w') lbl_datefmt = Label(master, text="Select date format:", wraplength=500, anchor='w', justify='left') lbl_datefmt.grid(row=12, column=1, padx=50, sticky='w') self.entryArtist.grid(row=14, column=1, padx=10, sticky='w') ## ##added to allow header line ## self.dateOpt1 = Checkbutton(master, text="YYYYMMDD", variable=self.headerVal) ## self.dateOpt1.grid(row=10, column=1, padx=160, sticky='w') ## self.dateOpt2 = Checkbutton(master, text="YYYY:MM:DD", variable=self.headerVal) ## self.dateOpt2.grid(row=10, column=1, padx=260, sticky='w') ## self.dateOpt3 = Checkbutton(master, text="MM/DD/YYYY", variable=self.headerVal) ## self.dateOpt3.grid(row=10, column=1, padx=360, sticky='w') #try radio buttons Radiobutton(master, text="YYYYMMDD", variable=self.rbv, value=1, command=self.rdioInvoke).grid(row=10, column=1, padx=190, sticky='w') Radiobutton(master, text="YYYY:MM:DD", variable=self.rbv, value=2, command=self.rdioInvoke).grid(row=11, column=1, padx=190, sticky='w') Radiobutton(master, text="MM/DD/YYYY", variable=self.rbv, value=3, command=self.rdioInvoke).grid(row=12, column=1, padx=190, sticky='w') Radiobutton(master, text="MM/DD/YY", variable=self.rbv, value=4, command=self.rdioInvoke).grid(row=13, column=1, padx=190, sticky='w') # buttons bottom_frame = Frame(master) bottom_frame.grid(row=30, column=1, columnspan=3, sticky='w') #I had to add the self to the prefix, otherwise my rdioInvoke wouldn't work. #I'm guessing the self is sort of the global aspect. #temporarily commenting this out so I can just test reading the param file self.btn_start = Button(bottom_frame, text="Submit", width=7, command=self.MergeExif) #self.btn_start = Button(bottom_frame, text = "Submit", width=7, command=self.readParamfile) self.btn_start.pack(side='left', pady=20) self.btn_start.config(state='disabled') ## btn_commit = Button(bottom_frame, text="Commit", width=7) ## btn_commit.pack(side='left', padx=80) btn_exit = Button(bottom_frame, text="Exit", width=7, command=self.cbtnClick) btn_exit.pack(side='left', padx=10) def rdioInvoke(self): print "rdioInvoke" self.btn_start.configure(state='normal') def cbtnClick(self): print "close button event handler" self.master.destroy() def imgcheck(self): print "check" if self.imgck.get() == 0: self.entryImage.configure(state='disabled') else: self.entryImage.configure(state='normal') def latcheck(self): print "check" if self.latck.get() == 0: self.entryLat.configure(state='disabled') else: self.entryLat.configure(state='normal') def loncheck(self): print "check" if self.lonck.get() == 0: self.entryLon.configure(state='disabled') else: self.entryLon.configure(state='normal') def timecheck(self): print "check" if self.timeck.get() == 0: self.entryTime.configure(state='disabled') else: self.entryTime.configure(state='normal') def datecheck(self): print "check" if self.dateck.get() == 0: self.entryDate.configure(state='disabled') else: self.entryDate.configure(state='normal') #self.datestate == 1 def validate(self, action, index, value_if_allowed, prior_value, text, validation_type, trigger_type, widget_name): if text in '0123456789': return True else: return False def getEXIFfile(self): EXIFcsvfile = tkFileDialog.askopenfilename(title='Image EXIF CSV file') #need to fix the next line self.entryExif.delete(0, END) if len(EXIFcsvfile) > 0: self.entryExif.insert(0, EXIFcsvfile) def getJPEGFolder(self): #by not specifying an intial directory, it starts where the script is located. JPGfolder = tkFileDialog.askdirectory(title='Pick JPEG folder') #need to clear anything that's there self.entryJPGS.delete(0, END) if len(JPGfolder) > 0: #print "now read JPEG folder %s" % JPGfolder #for entry widget self.entryJPGS.insert(0, JPGfolder) def getParamfile(self): PARAMtxtfile = tkFileDialog.askopenfilename(title='Paramter text file') self.paramFile.delete(0, END) if len(PARAMtxtfile) > 0: self.paramFile.insert(0, PARAMtxtfile) def readParamfile(self): params = self.paramFile.get() inputparams = open(params, "r") allparams = inputparams.read() for cmd3 in allparams.splitlines(): if "-comment" in cmd3: ## print cmd3 ## print " " val3 = cmd3 for cmd4 in allparams.splitlines(): if "-sep" in cmd4: ## print cmd4 ## print " " #return cmd4 val4 = cmd4 for cmd6 in allparams.splitlines(): if "-Caption=" in cmd6: ## print cmd6 ## print " " #return cmd6 val6 = cmd6 for cmd9 in allparams.splitlines(): if "-Caption-Abstract" in cmd9: ## print cmd9 ## print " " #return cmd9 val9 = cmd9 for cmd10 in allparams.splitlines(): if "-ImageDescription=" in cmd10: ## print cmd10 ## print " " #return cmd10 val10 = cmd10 ## print "read params" ## print "val3" ## print val3 return (val3, val4, val6, val9, val10) #self.MergeExif() def MergeExif(self): try: test = self.entryExif.get() print test ## print "date format" ## print str(self.rbv.get()) inputfile = open(test, "r") #print "made it here 1" imgval = int(self.entryImage.get()) #print self.entryImage.get() #print str(imgval) if self.latck.get() <> 0: latval = int(self.entryLat.get()) #print "made it here 1a" if self.lonck.get() <> 0: lonval = int(self.entryLon.get()) print "made it here 1b" if self.timeck.get() <> 0: timeval = int(self.entryTime.get()) print "made it here 1c" if self.dateck.get() <> 0: dateval = int(self.entryDate.get()) print "got date" print str(dateval) print "made it here 2" ##add this if statement to deal with header value if self.headerVal.get() == 1: print "have a header value" line = inputfile.readline() else: print "no header value" print "getting return" ## retcmd3, retcmd4, retcmd6, retcmd9, retcmd10 = self.readParamfile() ## print "just cmd3" ## print retcmd3 allreturns = self.readParamfile() print "allreturns" print allreturns ## print "first return" ## print allreturns[0] while 1: line = inputfile.readline() print "made it here 3" values = str.split(line, ",") ## print line ## print "imgval" ## print imgval ##if extension is included in text file img = values[imgval].strip() ##if extension is NOT included in text file ##img = values[imgval].strip() + '.JPG' vlat = values[latval].strip() vlon = values[lonval].strip() ingpsdate = values[dateval].strip() ## #section to read date formats if self.rbv.get() == 1: vyr = str(ingpsdate)[0:4] vmm = str(ingpsdate)[4:6] vdd = str(ingpsdate)[6:8] vgpsdate = vyr + ":" + vmm + ":" + vdd if self.rbv.get() == 2: vgpsdate = ingpsdate if self.rbv.get() == 3: vmm, vdd, vyr = ingpsdate.split("/") if len(vmm) == 1: vmm = "0" + vmm if len(vdd) == 1: vdd = "0" + vdd vgpsdate = vyr + ":" + vmm + ":" + vdd if self.rbv.get() == 4: vmm, vdd, vyr = ingpsdate.split("/") if len(vmm) == 1: vmm = "0" + vmm if len(vdd) == 1: vdd = "0" + vdd if int(vyr) < 50: vyr = "20" + vyr else: vyr = "19" + vyr vgpsdate = vyr + ":" + vmm + ":" + vdd ## if ingpsdate.find(':')==-1: ## vyr=str(ingpsdate)[0:4] ## vmm=str(ingpsdate)[4:6] #### print ingpsdate #### print "year" #### print vyr #### print "month" #### print vmm ## vdd=ingpsdate[6:8] ## vgpsdate=vyr+":"+vmm+":"+vdd ## else: ## vgpsdate=ingpsdate print vgpsdate vgpstime = values[timeval].strip() imagefolder = self.entryJPGS.get() fullimg = os.path.join(imagefolder, img) fullimg = fullimg.replace('\\', '/') vartist = self.entryArtist.get() vartistquotes = '"' + vartist + '"' ## print str(fullimg) ## print str(vlat) ## print str(vlon) ## print str(vgpsdate) ## print str(vgpstime) if (float(vlat)) > 0: print "latref1" vlatref = 'N' else: print "latref2" vlatref = 'S' if (float(vlon)) > 0: vlonref = 'E' else: vlonref = 'W' ## print str(vlatref) ## print str(vlonref) cmd = "exiftool -GPSDateStamp=" + vgpsdate + " -GPSTimeStamp="+vgpstime+" -GPSLatitude="+vlat+" -GPSLatitudeRef="+ vlatref+\ " -GPSLongitude="+vlon+" -GPSLongitudeRef="+vlonref+" "+ " -Artist=" +vartistquotes +" "+fullimg print cmd #print "made it past first os.system" subprocess.check_call(cmd, shell=True) print "executed" cmd2 = """exiftool -Credit="U.S. Geological Survey" -Contact="[email protected] " """ + fullimg subprocess.check_call(cmd2, shell=True) #jpeg comment print "in command 3 section" cmd3 = allreturns[0] cmd3new = cmd3 + " " + fullimg print cmd3new #print cmd3 #cmd3 = """exiftool -comment="Photo from down-looking camera on the USGS SEABOSS deployed from the R/V Rafael during survey 2012-003-FA (http://woodshole.er.usgs.gov/operations/ia/public_ds_info.php?fa=2012-003-FA). Released as part of publication DOI:10.3133/ds937. " """+ fullimg subprocess.check_call(cmd3new, shell=True) #iptc info #cmd4 = """exiftool -sep ", " -keywords="Barnegat Bay, New Jersey, 2012-003-FA, SEABOSS, sea floor, USGS " """+ fullimg cmd4 = allreturns[1] cmd4new = cmd4 + " " + fullimg #subprocess.check_call(cmd4, shell=True) subprocess.check_call(cmd4new, shell=True) #cmd5 unused and skipped #xmp info #cmd6 = """exiftool -Caption="Photograph of the sea floor in Barnegat Bay, New Jersey from survey 2012-003-FA " """+ fullimg cmd6 = allreturns[2] cmd6new = cmd6 + " " + fullimg #subprocess.check_call(cmd6, shell=True) subprocess.check_call(cmd6new, shell=True) print "did caption" #EXIF info cmd7 = """exiftool -Copyright="Public Domain - please credit U.S. Geological Survey " """ + fullimg subprocess.check_call(cmd7, shell=True) print "did copyright" #iptc info cmd8 = """exiftool -CopyrightNotice="Public Domain - please credit U.S. Geological Survey " """ + fullimg subprocess.check_call(cmd8, shell=True) #iptc info #cmd9 = """exiftool -Caption-Abstract="Photograph of the sea floor in Barnegat Bay, New Jersey from survey 2012-003-FA " """+ fullimg cmd9 = allreturns[3] cmd9new = cmd9 + " " + fullimg #subprocess.check_call(cmd9, shell=True) subprocess.check_call(cmd9new, shell=True) #exif info - software such as Picasso use this as the caption #cmd10 = """exiftool -ImageDescription="Photograph of the sea floor in Barnegat Bay, New Jersey from survey 2012-003-FA " """+ fullimg cmd10 = allreturns[4] cmd10new = cmd10 + " " + fullimg #subprocess.check_call(cmd10, shell=True) subprocess.check_call(cmd10new, shell=True) except: print "booboo maybe?" inputfile.close() print "done"
class LispTKButtonClass(BuildInFunction): def __init__(self,root,text,command,env): self.value=Button(root.value,text=text.value,command=command.execute_ea) def execute(self,env, *unEvalArgs): arg = LISP.Eval.evall(unEvalArgs[0], env) if(arg == new(LispSymbol,"pack")): self.value.pack(side="left") if(arg == new(LispSymbol,"setCMD")): arg1 = LISP.Eval.evall(unEvalArgs[1], env) self.value.configure(command=arg1.execute_ea) if(arg ==new(LispSymbol,'setBG')): val = LISP.Eval.evall(unEvalArgs[1], env) self.value.configure(bg=val.value) if(arg ==new(LispSymbol,'setFG')): val = LISP.Eval.evall(unEvalArgs[1], env) self.value.configure(fg=val.value) def execute_ea(self,*args): if(args[0] == new(LispSymbol,"pack")): self.value.pack(side="left") if(args[0] == new(LispSymbol,"setCMD")): self.value.configure(command=args[1].execute_ea) if(args[0]==new(LispSymbol,'setBG')): self.value.configure(bg=args[1]) if(args[0]==new(LispSymbol,'setFG')): self.value.configure(fg=args[1])
class Example(Frame): def __init__(self, parent): self.catFactors = {} Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): if hasattr(self, 'frame0'): self.frame0.destroy() self.initUIRoot() self.initUIFrame() def initUIRoot(self): self.parent.title("集总模型") self.pack(fill=BOTH, expand=1) menubar = Menu(self.parent) self.parent.config(menu=menubar) self.frame0 = Frame(self, relief=RAISED) self.frame0.pack(fill=BOTH, expand=True) fileMenu = Menu(menubar) fileMenu.add_command(label=u"新建催化剂", command=self.onNewCata) fileMenu.add_command(label=u"精确预测", command=self.onNewPre) fileMenu.add_command(label=u"趋势预测", command=self.onNewGraph) fileMenu.add_command(label=u"最优条件预测", command=self.onNewBest) helpMenu = Menu(menubar) helpMenu.add_command(label=u"关于", command=self.onHelp) mainPageMenu = Menu(menubar) mainPageMenu.add_command(label=u"主页", command=self.initUI) menubar.add_cascade(label="主页", menu=mainPageMenu) menubar.add_cascade(label="操作", menu=fileMenu) menubar.add_cascade(label="帮助", menu=helpMenu) def initUIFrame(self): self.frame0.columnconfigure(0, pad=5, weight=1) self.frame0.columnconfigure(1, pad=5, weight=1) self.frame0.columnconfigure(2, pad=5, weight=1) self.frame0.columnconfigure(3, pad=5, weight=1) self.frame0.columnconfigure(4, pad=5, weight=1) self.frame0.columnconfigure(5, pad=5, weight=1) self.frame0.rowconfigure(0, pad=37) self.frame0.rowconfigure(1, pad=7) self.frame0.rowconfigure(2, pad=7, weight=1) titleImg = ImageTk.PhotoImage(file="./imgs/title.png") catImg = ImageTk.PhotoImage(file="./imgs/cat.png") preImg = ImageTk.PhotoImage(file="./imgs/pre.png") chartImg = ImageTk.PhotoImage(file="./imgs/chart.png") bestImg = ImageTk.PhotoImage(file="./imgs/bestPoint.png") rareImg = ImageTk.PhotoImage(file="./imgs/rare.png") lbl = Label(self.frame0, image=titleImg) lbl.grid(row=0, column=1,columnspan=5,sticky=S+W) lbl.image = titleImg lbl = Label(self.frame0, image=rareImg) lbl.grid(row=3, column=1,columnspan=5,sticky=S) lbl.image = rareImg preButton = Button(self.frame0, command=self.onNewPre) preButton.config(image=preImg) preButton.image = preImg preButton.grid(row=1, column=2) cateButton = Button(self.frame0, command=self.onNewCata) cateButton.config(image=catImg) cateButton.image = catImg cateButton.grid(row=1, column=1) chartButton = Button(self.frame0, command=self.onNewGraph) chartButton.config(image=chartImg) chartButton.image = chartImg chartButton.grid(row=1, column=3) chartButton = Button(self.frame0, command=self.onNewBest) chartButton.config(image=bestImg) chartButton.image = bestImg chartButton.grid(row=1, column=4) lbl = Label(self.frame0, text="新建催化剂") lbl.grid(row=2, column=1, sticky=N) lbl = Label(self.frame0, text="精确预测") lbl.grid(row=2, column=2, sticky=N) lbl = Label(self.frame0, text="趋势预测") lbl.grid(row=2, column=3, sticky=N) lbl = Label(self.frame0, text="最优条件预测") lbl.grid(row=2, column=4, sticky=N) def bestUI(self): self.frame0.destroy() self.initUIRoot() frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame1.pack(fill=BOTH, expand=False) frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame2.pack(fill=BOTH, expand=True) frame1.columnconfigure(1, weight=1) # frame1.columnconfigure(9, weight=1) frame1.columnconfigure(10, pad=7) frame1.rowconfigure(5, weight=1) frame1.rowconfigure(5, pad=7) frame2.columnconfigure(11, pad=7, weight=1) frame2.rowconfigure(8, pad=7) lbl = Label(frame1, text="催化剂性质") lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5) # K_Mat_Tree = ttk.Treeview(frame1) # K_Mat_Tree['show'] = 'headings' # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model) # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5) K_Mat_Tree = Text(frame1, height=18) self.makeMatrixUI(K_Mat_Tree, self.catObj) K_Mat_Tree.configure(state='normal') K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="优化方法:") lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.optMethod) txt.configure(state='readonly') txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="集总数:") lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.n) txt.configure(state='readonly') txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="精确度:") lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.tol) txt.configure(state='readonly') txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) cateDetailButton = Button(frame1, text="查看催化剂详情") cateDetailButton.grid(row=3, column=8) # ________________________________________ lbl = Label(frame2, text="待预测条件") lbl.grid(row=0, column=0, sticky=W, columnspan=5, rowspan=1, pady=4, padx=5) lbl = Label(frame2, text="初始组成(<1 英文逗号分割):") lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.Y0_input = Entry(frame2) self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="温度范围(K 英文逗号分割 )") lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.T_input = Entry(frame2) if not self.catObj.withTemp: self.T_input.insert(0, self.catObj.t) self.T_input.configure(state='readonly') self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="压力范围(KPa 英文逗号分割)") lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.p_input = Entry(frame2) self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="剂油比范围 (英文逗号分割)") lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.roil_input = Entry(frame2) self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="停留时间范围(英文逗号分割s)") lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.t_input = Entry(frame2) self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="碱氮含量(<1)") lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.yn_input = Entry(frame2) self.yn_input.insert(0, 0.0) self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="重芳烃含量(<1)") lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.ya_input = Entry(frame2) self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="微分方程步长") lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.step_input = Entry(frame2) self.step_input.insert(0, 0.1) self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="待预测组分编号(,)") lbl.grid(row=9, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.target = Entry(frame2) self.target.insert(0, '5,6,7') self.target.grid(row=9, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="结果组成") lbl.grid(row=0, column=7, columnspan=2, rowspan=1, pady=4, padx=5, sticky=W) self.preResult_LB = Listbox(frame2) self.preResult_LB.grid(row=1, column=7, columnspan=2, rowspan=8, pady=4, padx=5, sticky=W) lbl = Label(frame2, text="最优温度:") lbl.grid(row=0, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.bestT = Entry(frame2) self.bestT.delete(0, 'end') self.bestT.configure(state='readonly') self.bestT.grid(row=0, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="最优压力:") lbl.grid(row=1, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.bestP = Entry(frame2) self.bestP.delete(0, 'end') self.bestP.configure(state='readonly') self.bestP.grid(row=1, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="最优剂油比:") lbl.grid(row=2, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.bestR = Entry(frame2) self.bestR.delete(0, 'end') self.bestR.configure(state='readonly') self.bestR.grid(row=2, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="最优反应时间:") lbl.grid(row=3, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.bestTime = Entry(frame2) self.bestTime.delete(0, 'end') self.bestTime.configure(state='readonly') self.bestTime.grid(row=3, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="目标结果:") lbl.grid(row=4, column=9, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.bestSum = Entry(frame2) self.bestSum.delete(0, 'end') self.bestSum.configure(state='readonly') self.bestSum.grid(row=4, column=11, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) cateDetailButton = Button(frame2, text="预测", command=self.doBest) cateDetailButton.grid(row=9, column=6, columnspan=2) def preUI(self): self.frame0.destroy() self.initUIRoot() frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame1.pack(fill=BOTH, expand=False) frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame2.pack(fill=BOTH, expand=True) frame1.columnconfigure(1, weight=1) # frame1.columnconfigure(9, weight=1) frame1.columnconfigure(10, pad=7) frame1.rowconfigure(5, weight=1) frame1.rowconfigure(5, pad=7) frame2.columnconfigure(8, pad=7, weight=1) frame2.rowconfigure(8, pad=7) lbl = Label(frame1, text="催化剂性质") lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5) # K_Mat_Tree = ttk.Treeview(frame1) # K_Mat_Tree['show'] = 'headings' # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model) # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5) K_Mat_Tree = Text(frame1, height=18) self.makeMatrixUI(K_Mat_Tree, self.catObj) K_Mat_Tree.configure(state='normal') K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="优化方法:") lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.optMethod) txt.configure(state='readonly') txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="集总数:") lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.n) txt.configure(state='readonly') txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="精确度:") lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.tol) txt.configure(state='readonly') txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) cateDetailButton = Button(frame1, text="查看催化剂详情") cateDetailButton.grid(row=3, column=8) # ________________________________________ lbl = Label(frame2, text="待预测条件") lbl.grid(row=0, column=0, sticky=W, columnspan=5, rowspan=1, pady=4, padx=5) lbl = Label(frame2, text="初始组成(<1 英文逗号分割):") lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.Y0_input = Entry(frame2) self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="温度(K)") lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.T_input = Entry(frame2) if not self.catObj.withTemp: self.T_input.insert(0, self.catObj.t) self.T_input.configure(state='readonly') self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="压力(KPa)") lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.p_input = Entry(frame2) self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="剂油比") lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.roil_input = Entry(frame2) self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="停留时间(s)") lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.t_input = Entry(frame2) self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="碱氮含量(<1)") lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.yn_input = Entry(frame2) self.yn_input.insert(0, 0.0) self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="重芳烃含量(<1)") lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.ya_input = Entry(frame2) self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="微分方程步长") lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.step_input = Entry(frame2) self.step_input.insert(0, 0.1) self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5) self.preResult_LB = Listbox(frame2) self.preResult_LB.grid(row=1, column=7, columnspan=2, rowspan=6, pady=4, padx=5) cateDetailButton = Button(frame2, text="预测", command=self.doPre) cateDetailButton.grid(row=8, column=7, columnspan=2) def cateUI(self): self.frame0.destroy() self.initUIRoot() frame4 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame4.pack(fill=BOTH) frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame1.pack(fill=BOTH, expand=True) frame1.columnconfigure(0, weight=1) # frame1.columnconfigure(9, weight=1) frame1.rowconfigure(0, weight=1) lbl = Label(frame4, text="已输入温度组数") lbl.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.varCountT = StringVar() self.countT = Message(frame4, textvariable=self.varCountT) self.varCountT.set('0') self.countT.grid(row=0, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) factor_Tree = ttk.Treeview(frame1) factor_Tree['show'] = 'headings' factor_Tree["columns"] = ['t_resid', 't', 'r_oil', 'p', 'Y0', 'Y_results', 'w_aro', 'w_nitro'] # factor_Tree.heading("t", text="温度") factor_Tree.column("t", width=self.winfo_width() / 8) factor_Tree.heading("r_oil", text="剂油比") factor_Tree.column("r_oil", width=self.winfo_width() / 8) factor_Tree.heading("p", text="压力") factor_Tree.column("p", width=self.winfo_width() / 8) factor_Tree.heading("Y0", text="初始组成") factor_Tree.column("Y0", width=self.winfo_width() / 8) factor_Tree.heading("Y_results", text="产物组成") factor_Tree.column("Y_results", width=self.winfo_width() / 8) factor_Tree.heading("w_aro", text="重芳烃含量") factor_Tree.column("w_aro", width=self.winfo_width() / 8) factor_Tree.heading("w_nitro", text="碱氮含量") factor_Tree.column("w_nitro", width=self.winfo_width() / 8) factor_Tree.heading("t_resid", text="停留时间") factor_Tree.column("t_resid", width=self.winfo_width() / 8) factor_Tree.grid(row=0, column=0, pady=4, padx=5) self.factor_Tree = factor_Tree frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame2.pack(fill=BOTH, expand=True) frame2.columnconfigure(0, weight=1) frame2.columnconfigure(8, weight=1) lbl = Label(frame2, text="停留时间(s)") lbl.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.t_input = Entry(frame2) self.t_input.grid(row=0, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="温度(K)") lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.T_input = Entry(frame2) self.T_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="剂油比") lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.roil_input = Entry(frame2) self.roil_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="压力(KPa)") lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.p_input = Entry(frame2) self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="初始组成(<1 英文逗号分割):") lbl.grid(row=0, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.Y0_input = Entry(frame2) self.Y0_input.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="产物组成(<1 英文逗号分割):") lbl.grid(row=1, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.Y_results_input = Entry(frame2) self.Y_results_input.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="碱氮含量(<1)") lbl.grid(row=2, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.yn_input = Entry(frame2) self.yn_input.insert(0, 0.0) self.yn_input.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="重芳烃含量(<1)") lbl.grid(row=3, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.ya_input = Entry(frame2) self.ya_input.grid(row=3, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="分子质量(逗号分割)") lbl.grid(row=4, column=4, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.Molmasses_input = Entry(frame2) self.Molmasses_input.grid(row=4, column=6, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.Molmasses_input.insert('0.8,1.1,1.8,0.2,0.2,0.2,0.11,0.016,0.042,0.056,0.05,0.012') addButton = Button(frame2, command=self.addFactors, text="添加条件") addButton.grid(row=9, column=2, sticky=E) self.newCatButton = Button(frame2, command=self.newCata, text="开始计算", state=DISABLED) self.newCatButton.grid(row=9, column=6, sticky=E) def graphUI(self): self.frame0.destroy() self.initUIRoot() frame1 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame1.pack(fill=BOTH, expand=False) frame2 = Frame(self.frame0, relief=RAISED, borderwidth=1) frame2.pack(fill=BOTH, expand=True) frame1.columnconfigure(1, weight=1) # frame1.columnconfigure(9, weight=1) frame1.columnconfigure(10, pad=7) frame1.rowconfigure(5, weight=1) frame1.rowconfigure(5, pad=7) frame2.columnconfigure(8, pad=7, weight=1) frame2.columnconfigure(1, weight=1) frame2.columnconfigure(6, weight=1) frame2.rowconfigure(8, pad=7) lbl = Label(frame1, text="催化剂性质") lbl.grid(row=0, column=0, columnspan=8, rowspan=1, sticky=W, pady=4, padx=5) # K_Mat_Tree = ttk.Treeview(frame1) # K_Mat_Tree['show'] = 'headings' # K_Mat_Tree = self.makeMatrixUI(7, K_Mat_Tree, sourceDate.K_model) # K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=5, sticky=E + W + S + N, pady=4, padx=5) K_Mat_Tree = Text(frame1, height=18) self.makeMatrixUI(K_Mat_Tree, self.catObj) K_Mat_Tree.configure(state='normal') K_Mat_Tree.grid(row=1, column=0, columnspan=6, rowspan=6, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="优化方法:") lbl.grid(row=0, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.optMethod) txt.configure(state='readonly') txt.grid(row=0, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="集总数:") lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.n) txt.configure(state='readonly') txt.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) lbl = Label(frame1, text="精确度:") lbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) txt = Entry(frame1) txt.insert(0, self.catObj.tol) txt.configure(state='readonly') txt.grid(row=2, column=8, columnspan=2, rowspan=1, sticky=E + W + S + N, pady=4, padx=5) cateDetailButton = Button(frame1, text="查看催化剂详情") cateDetailButton.grid(row=3, column=8) # ________________________________________ lbl = Label(frame2, text="待预测条件") lbl.grid(row=0, column=0, columnspan=5, rowspan=1, pady=4, padx=5) lbl = Label(frame2, text="初始组成(<1 英文逗号分割):") lbl.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.Y0_input = Entry(frame2) self.Y0_input.grid(row=1, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="温度(K)") lbl.grid(row=2, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.T_input = Entry(frame2) self.T_input.grid(row=2, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="压力(KPa)") lbl.grid(row=3, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.p_input = Entry(frame2) self.p_input.grid(row=3, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="剂油比") lbl.grid(row=4, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.roil_input = Entry(frame2) self.roil_input.grid(row=4, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="停留时间(s)") lbl.grid(row=5, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.t_input = Entry(frame2) self.t_input.grid(row=5, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="碱氮含量(<1)") lbl.grid(row=6, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.yn_input = Entry(frame2) self.yn_input.insert(0, 0.0) self.yn_input.grid(row=6, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="重芳烃含量(<1)") lbl.grid(row=7, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.ya_input = Entry(frame2) self.ya_input.grid(row=7, column=2, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="微分方程步长") lbl.grid(row=8, column=0, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.step_input = Entry(frame2) self.step_input.insert(0, 0.1) self.step_input.grid(row=8, column=2, columnspan=3, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="图表设置") lbl.grid(row=0, column=6, columnspan=5, rowspan=1, pady=4, padx=5) lbl = Label(frame2, text="条件变量") lbl.grid(row=1, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.var = ttk.Combobox(frame2, textvariable=StringVar()) if not self.catObj.withTemp: self.var['values'] = (u'压力', u'剂油比', u'停留时间') self.p_input.insert(0, 0) self.T_input.insert(0, self.catObj.t) self.T_input.configure(state='readonly') self.p_input.configure(state='readonly') self.lastVar = u'压力' else: self.T_input.delete(0, 'end') self.T_input.insert(0, 0) self.T_input.configure(state='readonly') self.var['values'] = (u'温度', u'压力', u'剂油比', u'停留时间', u'温度+压力',u'温度+剂油比',u'剂油比+压力') self.lastVar = u'温度' self.var.bind('<<ComboboxSelected>>', self.onSelecetedVar) self.var.current(0) self.var.grid(row=1, column=8, columnspan=2, rowspan=1, sticky=W, pady=4, padx=5) self.rangeLbl = Label(frame2, text="条件范围") self.rangeLbl.grid(row=2, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="上限") lbl.grid(row=3, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) lbl = Label(frame2, text="下限") lbl.grid(row=4, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.rangeMin = Entry(frame2) self.rangeMax = Entry(frame2) self.rangeMin.grid(row=3, column=8, columnspan=1, sticky=W, rowspan=1, pady=4, padx=5) self.rangeMax.grid(row=4, column=8, columnspan=1, sticky=W, rowspan=1, pady=4, padx=5) lbl = Label(frame2, text="结果集(英文逗号分割)") lbl.grid(row=5, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.chartResultId = Entry(frame2) self.chartResultId.insert(0, '1,2,3,4,5,6,7,8,9,10,11,12') self.chartResultId.grid(row=5, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="结果名(英文逗号分割\n尽量使用英文)") lbl.grid(row=6, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.chartResultName = Entry(frame2) #TODO,get the default value from lump model self.chartResultName.insert(0, 'HS,HA,HR,DIESEL,GS,GO,GA,DGAS,LO3,LO4,LPGD,COKE') self.chartResultName.grid(row=6, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) lbl = Label(frame2, text="点数") lbl.grid(row=7, column=6, columnspan=2, rowspan=1, sticky=E, pady=4, padx=5) self.stepNum = Entry(frame2) self.stepNum.grid(row=7, column=8, columnspan=3, rowspan=1, sticky=W, pady=4, padx=5) cateDetailButton = Button(frame2, text="预测趋势", command=self.doChart) cateDetailButton.grid(row=8, column=6, columnspan=2) def onSelecetedVar(self, event): varName = self.var.get() if self.lastVar == u'温度': # u'温度',,,u'停留时间' self.T_input.configure(state="normal") elif self.lastVar == u'压力': self.p_input.configure(state="normal") elif self.lastVar == u'剂油比': self.roil_input.configure(state="normal") elif self.lastVar == u'停留时间': self.t_input.configure(state="normal") elif self.lastVar == u'温度+压力': self.T_input.configure(state="normal") self.p_input.configure(state="normal") elif self.lastVar == u'温度+剂油比': self.roil_input.configure(state="normal") self.T_input.configure(state="normal") elif self.lastVar == u'剂油比+压力': self.roil_input.configure(state="normal") self.p_input.configure(state="normal") if varName == u'温度': self.rangeLbl.config(text='条件范围') self.T_input.delete(0, 'end') self.T_input.insert(0, 0) self.T_input.configure(state="readonly") elif varName == u'压力': self.rangeLbl.config(text='条件范围') self.p_input.delete(0, 'end') self.p_input.insert(0, 0) self.p_input.configure(state="readonly") elif varName == u'剂油比': self.rangeLbl.config(text='条件范围') self.roil_input.delete(0, 'end') self.roil_input.insert(0, 0) self.roil_input.configure(state="readonly") elif varName == u'停留时间': self.rangeLbl.config(text='条件范围') self.t_input.delete(0, 'end') self.t_input.insert(0, 0) self.t_input.configure(state="readonly") elif varName == u'温度+压力': self.rangeLbl.config(text='条件范围,格式:温度,压力') self.T_input.delete(0, 'end') self.T_input.insert(0, 0) self.T_input.configure(state="readonly") self.p_input.delete(0, 'end') self.p_input.insert(0, 0) self.p_input.configure(state="readonly") elif varName == u'温度+剂油比': self.rangeLbl.config(text='条件范围,格式:温度,剂油比') self.roil_input.delete(0, 'end') self.roil_input.insert(0, 0) self.roil_input.configure(state="readonly") self.T_input.delete(0, 'end') self.T_input.insert(0, 0) self.T_input.configure(state="readonly") elif varName == u'剂油比+压力': self.rangeLbl.config(text='条件范围,格式:剂油比,压力') self.roil_input.delete(0, 'end') self.roil_input.insert(0, 0) self.roil_input.configure(state="readonly") self.p_input.delete(0, 'end') self.p_input.insert(0, 0) self.p_input.configure(state="readonly") self.lastVar = varName def onNewCata(self): self.catFactors = {} ftypes = [('集总模型', '*.lp')] dlg = tkFileDialog.Open(self, filetypes=ftypes) fl = dlg.show() # print flmakePreResultUI if fl != '': self.lumpObj = self.readFile(fl) print self.lumpObj self.cateUI() def onNewPre(self): ftypes = [('催化剂存档文件', '*.cat')] dlg = tkFileDialog.Open(self, filetypes=ftypes) fl = dlg.show() print fl if fl != '': self.catObj = self.readFile(fl) self.preUI() def onNewBest(self): ftypes = [('催化剂存档文件', '*.cat')] dlg = tkFileDialog.Open(self, filetypes=ftypes) fl = dlg.show() print fl if fl != '': self.catObj = self.readFile(fl) self.bestUI() def onNewGraph(self): ftypes = [('催化剂存档文件', '*.cat')] dlg = tkFileDialog.Open(self, filetypes=ftypes) fl = dlg.show() print fl if fl != '': self.catObj = self.readFile(fl) self.graphUI() def saveCate(self): ftypes = [('催化剂存档文件', '*.cat')] filename = tkFileDialog.asksaveasfilename(title='保存催化剂存档文件', defaultextension='.cat', filetypes=ftypes) return filename def onHelp(self): mbox.showinfo("集总模型软件", "中国石油\n兰州化工研究中心") def doPre(self): catObj = self.catObj t_resid = float(self.t_input.get()) p = float(self.p_input.get()) Y0 = numpy.mat(self.Y0_input.get().split(',')).astype(numpy.float) const_r = 8.3145 w_aro = float(self.ya_input.get()) w_nitro = float(self.yn_input.get()) t = float(self.T_input.get()) r_oil = float(self.roil_input.get()) stepLength = float(self.step_input.get()) n = catObj.n print [t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n] result = newPre(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, stepLength).tolist()[0] self.makePreResultUI(self.preResult_LB, result) def doBest(self): catObj = self.catObj t_resid = [float(self.t_input.get().split(',')[0]),float(self.t_input.get().split(',')[1])] p = [float(self.p_input.get().split(',')[0]),float(self.p_input.get().split(',')[1])] Y0 = numpy.mat(self.Y0_input.get().split(',')).astype(numpy.float) const_r = 8.3145 w_aro = float(self.ya_input.get()) w_nitro = float(self.yn_input.get()) t = [float(self.T_input.get().split(',')[0]),float(self.T_input.get().split(',')[1])] r_oil = [float(self.roil_input.get().split(',')[0]),float(self.roil_input.get().split(',')[1])] stepLength = float(self.step_input.get()) n = catObj.n target = self.target.get().split(',') print [t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n,target] result = newBest(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, stepLength,target) self.bestP.configure(state='normal') self.bestT.configure(state='normal') self.bestR.configure(state='normal') self.bestTime.configure(state='normal') self.bestSum.configure(state='normal') self.bestP.insert('end',round(result['bestP'], 4)) self.bestT.insert('end',round(result['bestT'], 4)) self.bestR.insert('end',round(result['bestR'], 4)) self.bestTime.insert('end',round(result['bestTime'], 4)) self.bestSum.insert('end',round(result['sum'], 4)) self.makePreResultUI(self.preResult_LB, result['Y']) def doChart(self): catObj = self.catObj t_resid = float(self.t_input.get()) p = float(self.p_input.get()) Y0 = numpy.mat(self.Y0_input.get().split(',')).astype(numpy.float) const_r = 8.3145 w_aro = float(self.ya_input.get()) w_nitro = float(self.yn_input.get()) t = float(self.T_input.get()) r_oil = float(self.roil_input.get()) stepNum = int(self.stepNum.get()) resultId = self.chartResultId.get() resultName = self.chartResultName.get() stepLength = float(self.step_input.get()) n = catObj.n varName = '' if self.lastVar == u'温度': varName = 't' varMin = float(self.rangeMin.get()) varMax = float(self.rangeMax.get()) elif self.lastVar == u'压力': varName = 'p' varMin = float(self.rangeMin.get()) varMax = float(self.rangeMax.get()) elif self.lastVar == u'剂油比': varName = 'r' varMin = float(self.rangeMin.get()) varMax = float(self.rangeMax.get()) elif self.lastVar == u'停留时间': varName = 'time' varMin = float(self.rangeMin.get()) varMax = float(self.rangeMax.get()) elif self.lastVar == u'温度+压力': varName = 't,p'.split(',') varMin = self.rangeMin.get().split(',') varMax = self.rangeMax.get().split(',') elif self.lastVar == u'温度+剂油比': varName = 't,r'.split(',') varMin = self.rangeMin.get().split(',') varMax = self.rangeMax.get().split(',') elif self.lastVar == u'剂油比+压力': varName = 'r,p'.split(',') varMin = self.rangeMin.get().split(',') varMax = self.rangeMax.get().split(',') chartConfig = {} chartConfig['varName'] = varName chartConfig['stepNum'] = stepNum chartConfig['varMin'] = varMin chartConfig['varMax'] = varMax chartConfig['resultId'] = resultId chartConfig['resultName'] = resultName # t_resid=3 # p=175 # const_r=8.3145 # Y0=mat([0.481,0.472,0.047,0,0,0,0]) # w_aro=0.472 # w_nitro=0 # t=685 # n=7 # r_oil=8.79 # chartConfig={'varName': 'time', 'varMax': 0.001, 'varMin': 15.0, 'resultId': '1,2,3,4,5,6,7', 'stepNum': 100,'resultName':u'Hs,Ha,Hr,柴油,汽油,气体,焦炭'} print chartConfig print [catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, chartConfig] if len(varName)>1: result = new3dChart(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, chartConfig, stepLength) else: result = new2dChart(catObj, t_resid, p, Y0, const_r, w_aro, w_nitro, t, r_oil, n, chartConfig, stepLength) def addFactors(self): t_resid = float(self.t_input.get()) p = float(self.p_input.get()) Y0_raw = self.Y0_input.get() Y0 = numpy.mat(Y0_raw.split(',')).astype(numpy.float) Y_results_raw = self.Y_results_input.get() Y_results = numpy.mat(Y_results_raw.split(',')).astype(numpy.float) w_aro = float(self.ya_input.get()) w_nitro = float(self.yn_input.get()) t = float(self.T_input.get()) r_oil = float(self.roil_input.get()) self.Molmasses = numpy.mat(self.Molmasses_input.get().split(',')).astype(numpy.float) self.factor_Tree.insert('', END, values=[t_resid, t, r_oil, p, Y0_raw, Y_results_raw, w_aro, w_nitro]) if self.catFactors.has_key(t): self.catFactors[t].append( {'t_resid': t_resid, 't': t, 'r_oil': r_oil, 'p': p, 'Y0': Y0, 'Y_results': Y_results, 'w_aro': w_aro, 'w_nitro': w_nitro}) else: self.catFactors[t] = [ {'t_resid': t_resid, 't': t, 'r_oil': r_oil, 'p': p, 'Y0': Y0, 'Y_results': Y_results, 'w_aro': w_aro, 'w_nitro': w_nitro}] print self.catFactors self.varCountT.set(len(self.catFactors)) self.Molmasses_input.configure(state='readonly') self.newCatButton.configure(state='active') def newCata(self): filename = self.saveCate() print filename if len(self.catFactors) == 1: newCatNoKa(filename, self.lumpObj, 1, 0, 1, self.lumpObj, self.Molmasses, self.catFactors.values()[0], 'L-BFGS-B', 1e-5, self.lumpObj.shape[0]) else: newCatWithKa(filename, self.lumpObj, 1, 0, 1, self.lumpObj, self.Molmasses, self.catFactors, 'L-BFGS-B', 1e-5, self.lumpObj.shape[0]) def makeMatrixUI(self, targetTree, catObj): n = catObj.n if not catObj.withTemp: targetTree.insert('end', '催化剂模型是在同一温度下,只能计算K\n------------------\nK=\n') K = numpy.around(self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['K_result'], 4) self.makeMatrixOutput(n, targetTree, K) targetTree.insert('end', '\n------------------\n重芳烃影响因数:\n') targetTree.insert('end', self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['Ka']) targetTree.insert('end', '\n------------------\n碱氮影响因数:\n') targetTree.insert('end', self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['Kn']) targetTree.insert('end', '\n------------------\n') else: K = self.makeMatrixByResult(catObj.K_model, catObj.X0_result, catObj.n)['K_result'] print catObj.X0_result Ka = numpy.around(self.makeMatrixByResult(catObj.K_model, catObj.Ka, catObj.n)['K_result'], 4) print catObj.Ka Ea = numpy.around(self.makeMatrixByResult(catObj.K_model, catObj.Ea, catObj.n)['K_result'], 4) print catObj.Ea targetTree.insert('end', '\n------------------\nK=\n') print len(K) for i in K: self.makeMatrixOutput(n, targetTree, numpy.round(i, 4)) targetTree.insert('end', '\n------------------\n') targetTree.insert('end', '\n------------------\nKa=\n') self.makeMatrixOutput(n, targetTree, Ka) targetTree.insert('end', '\n------------------\n') targetTree.insert('end', '\n------------------\nEa=\n') self.makeMatrixOutput(n, targetTree, Ea) targetTree.insert('end', '\n------------------\n') def makeMatrixOutput(self, n, targetTree, mat): for i in range(n): targetTree.insert('end', ','.join(mat[i].astype(numpy.string_).tolist())) targetTree.insert('end', '\n') return targetTree def makeMatrixByResult(self, K_model, result, n): if type(result) != type([]): K = result[:-3].tolist() args = result[-3:] K_raw_result = [] for i in K_model.T.flat: if i: K_raw_result.append(K.pop(0)) else: K_raw_result.append(0) K_result = reshape(K_raw_result, (n, n)).T.T.T ka_result, kn_result, cata_result = args return {'K_result': K_result, 'ka_result': ka_result, 'kn_result': kn_result, 'cata_result': cata_result} else: K_results = [] args = result[0][-3:] for i in result: K = i[:-3].tolist() K_raw_result = [] for i in K_model.T.flat: if i: K_raw_result.append(K.pop(0)) else: K_raw_result.append(0) K_result = reshape(K_raw_result, (n, n)).T.T.T K_results.append(K_result) ka_result, kn_result, cata_result = args return {'K_result': K_results, 'ka_result': ka_result, 'kn_result': kn_result, 'cata_result': cata_result} def makePreResultUI(self, target, result): target.delete(0, END) if type(result)!=type([]): result=result.tolist()[0] for i in result: target.insert(END, round(i, 3)) return target def readFile(self, filename): f = open(filename, "r") obj = pickle.load(f) return obj
class VoiceEditor(HasTraits): """Editor for a L{Voice}.""" voice = Instance(Voice) """The voice being edited.""" def __init__(self, toplevel, voice): self.toplevel = toplevel title_frame = Frame(self.toplevel, padx=8) title_frame.pack(side=LEFT) Label(title_frame, text="Title").pack(side=LEFT) self.title_entry_manager = EntryManager( title_frame, self, 'voice.name' ) self.title_entry_manager.entry.pack(side=LEFT) channel_frame = Frame(self.toplevel, padx=8) channel_frame.pack(side=LEFT) Label(channel_frame, text="Channel").pack(side=LEFT) self.channel_spinbox_manager = SpinboxManager( channel_frame, self, 'voice.channel' ) self.channel_spinbox_manager.spinbox.pack(side=LEFT) instrument_frame = Frame(self.toplevel, padx=8) instrument_frame.pack(side=LEFT) Label(instrument_frame, text="Instrument").pack(side=LEFT) self.instrument_spinbox_manager = SpinboxManager( instrument_frame, self, 'voice.instrument' ) self.instrument_spinbox_manager.spinbox.pack(side=LEFT) volume_frame = Frame(self.toplevel, padx=8) volume_frame.pack(side=LEFT) Label(volume_frame, text="Volume").pack(side=LEFT) self.volume_scale_manager = ScaleManager( volume_frame, self, 'voice.volume', orient=HORIZONTAL, ) self.volume_scale_manager.scale.pack(side=LEFT) self.mute_checkbutton_manager = CheckbuttonManager( volume_frame, self, 'voice.mute', text="Mute" ) self.mute_checkbutton_manager.checkbutton.pack(side=LEFT) def select_color(): triple, color = tkColorChooser.askcolor(self.voice.color) if color: self.voice.color = color self.color_button = Button( self.toplevel, command=select_color, ) self.color_button.pack(side=LEFT) super(VoiceEditor, self).__init__(voice=voice) def close(self): #del self.voice self.toplevel.destroy() @on_trait_change('voice.color') def _color_changed(self): if self.voice is None: return self.color_button.configure(bg=self.voice.color) @on_trait_change('voice.name') def _voice_name_changed(self): if self.voice is None: return self.toplevel.title("Voice: %s" % self.voice.name)
class DroneGUI: def __init__(self, master): self.master = master master.title("Drone GUI") ## Initialising framework of GUI self.frame1 = Frame(master, height=480, width=200, bd=2, relief="sunken") self.frame1.grid(row=3, column=1, rowspan=15) self.frame1.grid_propagate(False) explanation_label = Label( master, justify='left', text= "How you control the drone \nW - move forwards \nS - move down \nA - move let \nD - move right \nI - move up \nK - move down \nJ - rotate counterclockwise \nL - rotate clockwise \nENTER - Takeoff/Land" ) explanation_label.grid(row=4, column=1, rowspan=15) self.abort_button = Button(master, text="ABORT", command=self.abort_auto_flight, bg="grey", fg="lightgrey", state="disabled") self.abort_button.grid(row=17, column=1) frame2 = Frame(master, height=480, width=200, bd=2, relief="sunken") frame2.grid(row=3, column=3, rowspan=15) frame2.grid_propagate(False) self.select_target_button = Button(master, text="Select target", command=self.select_target) self.select_target_button.grid(row=4, column=3) self.distance_label = Label(master, text="Distance: NA") self.distance_label.grid(row=6, column=3) self.battery_label = Label(master, text="Battery level: NA") self.battery_label.grid(row=8, column=3) header_label = Label(master, text="Choosing target for drone") header_label.grid(row=1, column=8) self.close_button = Button(master, text="Close", command=master.quit) self.close_button.grid(row=1, column=20) self.image_label = Label(text="", height=480, width=640) self.image_label.grid(row=3, column=6, columnspan=15, rowspan=15) ## Initialising variables for selecting target self.imgClick = False self.bridge = CvBridge() self.enable_video_stream = None self.prev_img = None self.select_target_bool = False self.circle_center = [None, None] ## Initialising variables for autonoumous flight self.flying = False self.auto_flying = False self.abort_bool = False ## Enabling keyboard control of drone self.master.bind("<Key>", self.move_drone) self.master.bind("<KeyRelease>", self.key_release) self.master.bind("<Return>", self.return_key_pressed) ## Initialising of publishers and subscribers self.distance_sub = rospy.Subscriber('distance', Pose, self.update_distance_label) self.pid_enable_sub = rospy.Subscriber('pid_enable', Bool, self.pid_enabled) self.battery_sub = rospy.Subscriber( 'bebop/CommonStates/BatteryLevelChanged', UInt8, self.update_battery_label) self.target_sub = rospy.Subscriber("target", Pose, self.draw_target) self.image_sub = rospy.Subscriber('/webcam/image_raw', SensorImage, self.image_subscriber_callback) self.gui_target_pub = rospy.Publisher('gui_target', Pose, queue_size=10) self.abort_pub = rospy.Publisher('abort', Bool, queue_size=10) self.drone_vel_pub = rospy.Publisher('bebop/cmd_vel', Twist, queue_size=10) self.takeoff_pub = rospy.Publisher('bebop/takeoff', Empty, queue_size=10) self.land_pub = rospy.Publisher('bebop/land', Empty, queue_size=10) rospy.init_node('gui', anonymous=True) self.rate = rospy.Rate(10) rospy.loginfo("GUI initialised") self.abort_pub.publish(self.abort_bool) def image_subscriber_callback(self, image): cv_image = CvBridge().imgmsg_to_cv2(image, "rgb8") # cv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB) if self.circle_center[0] != None: cv2.circle( cv_image, (int(self.circle_center[0]), int(self.circle_center[1])), 3, (0, 255, 0), 10) self.img = Image.fromarray(cv_image) # print("got image") def draw_target(self, data): self.circle_center = [data.position.x, data.position.y] def update_image(self): ## Updating the image from the 'drone_cam_sub.py', if it's new. The update is automatic with a frequency 20 Hz (50 ms) frequency = 20 try: if self.img != self.prev_img: self.imgtk = ImageTk.PhotoImage(self.img) self.image_label.pic = self.imgtk self.image_label.configure(image=self.imgtk) self.prev_img = self.img except: print("Image not updated") self.enable_video_stream = self.image_label.after( int(1000 / frequency), self.update_image) def select_target(self): ## Allows the user to select target, and interrupt selection if wanted if not self.select_target_bool: rospy.loginfo("User is selecting target") self.select_target_bool = True self.imgClick = True self.select_target_button.configure(text="Cancel") self.image_label.bind("<Button-1>", self.target_selected) self.image_label.configure(cursor="dotbox") else: rospy.loginfo("User cancelled selection") self.select_target_bool = False self.imgClick = False self.select_target_button.configure(text="Select target") self.image_label.unbind("<Button-1>") self.image_label.configure(cursor="") def target_selected(self, event): ## Once target has been selected, variables and functions need to be reset. ## By un-commenting line 158 control will be disabled, once autonomous flight is enabled ## (For now it is possible to interfere with the drone by using the keyboard) self.select_target_bool = False rospy.loginfo("User selected target") self.imgClick = False save_pos(event) self.publish_pos() self.update_image() self.select_target_button.configure(text="Select target") self.image_label.unbind("<Button-1>") self.image_label.configure(cursor="") #self.auto_flying = True def move_drone(self, event): ## if auto_flying = True no other option than pressing 'g' is possible if self.flying and not self.auto_flying: cmd = Twist() factor = 0.5 rospy.loginfo("User pressed " + repr(event.char)) if event.char == 'a': cmd.linear.y = factor elif event.char == 'd': cmd.linear.y = -factor elif event.char == 'w': cmd.linear.x = factor elif event.char == 's': cmd.linear.x = -factor elif event.char == 'j': cmd.angular.z = factor elif event.char == 'l': cmd.angular.z = -factor elif event.char == 'i': cmd.linear.z = factor elif event.char == 'k': cmd.linear.z = -factor elif event.char == 'g': if not self.abort_bool: self.abort_auto_flight() cmd.linear.x = -factor self.drone_vel_pub.publish(cmd) elif self.flying: if event.char == 'g': if not self.abort_bool: self.abort_auto_flight() cmd.linear.x = -factor self.drone_vel_pub.publish(cmd) def key_release(self, event): cmd = Twist() cmd.linear.x = 0 cmd.linear.y = 0 cmd.linear.z = 0 cmd.angular.z = 0 self.drone_vel_pub.publish(cmd) def return_key_pressed(self, event): ## enabling takeoff and landing if not self.flying: self.flying = True e = Empty() self.takeoff_pub.publish(e) else: self.abort_pub.publish(True) self.flying = False e = Empty() self.land_pub.publish(e) def abort_auto_flight(self): ## aborting autonousmous flight and allowing the user the have full control of the drone again rospy.loginfo("Aborting") self.abort_bool = True self.abort_pub.publish(self.abort_bool) cmd = Twist() cmd.linear.x = 0 cmd.linear.y = 0 cmd.linear.z = 0 cmd.angular.z = 0 self.drone_vel_pub.publish(cmd) def pid_enabled(self, data): ## cheching whether the move_to_target program is running data = str(data) if data == 'data: True': self.abort_button.configure(state="active", bg="grey", fg="black") if data == False and self.abort_bool == True: self.abort_bool = False self.abort_pub.publish(self.abort_bool) def update_distance_label(self, data): self.distance_label.configure( text='Distance: {:02.2f} m'.format(data.position.x)) def update_battery_label(self, data): self.battery_label.configure(text='Battery level: {}'.format(data)) def publish_pos(self): #publishing the position of the target position in pixels if not rospy.is_shutdown(): p = Pose() p.position.x = pos_x p.position.y = pos_y self.gui_target_pub.publish(p) self.rate.sleep()
def setupHomeAndZeroSection(): global homeAllButton, homeStoreAllButton, storeCurrentButton, returnToStoredButton, zeroAllButton, returnZeroAllButton global buttonWidth, buttonHeight, buttonBGColor, buttonFGColor global divisions homeAndZeroLabel = Label(mFrame, text="Home and Zero Commands", font=("Times New Roman", 16), wraplength=200, bg="white") homeAndZeroLabel.place(relx=.5, rely=1.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) homeAllButton = Button(mFrame, text="Home All", command=homeAll, bg=buttonBGColor, fg=buttonFGColor) homeAllButton.place(relx=.5, rely=3.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) homeAllButton.configure(state=DISABLED) homeStoreAllButton = Button(mFrame, text="Home All and Store", command=homeStoreAll, bg=buttonBGColor, fg=buttonFGColor) homeStoreAllButton.place(relx=.5, rely=5.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) homeStoreAllButton.configure(state=DISABLED) zeroAllButton = Button(mFrame, text="Set Zero Point", command=setZeroPoint, bg=buttonBGColor, fg=buttonFGColor) zeroAllButton.place(relx=.5, rely=7.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) zeroAllButton.configure(state=DISABLED) returnZeroAllButton = Button(mFrame, text="Return to Zero Point", command=returnToZeroPoint, bg=buttonBGColor, fg=buttonFGColor) returnZeroAllButton.place(relx=.5, rely=9.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) returnZeroAllButton.configure(state=DISABLED) storeCurrentButton = Button(mFrame, text="Store Current Position", command=storeCurrent, bg=buttonBGColor, fg=buttonFGColor) storeCurrentButton.place(relx=.5, rely=11.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) storeCurrentButton.configure(state=DISABLED) returnToStoredButton = Button(mFrame, text="Return to Stored Position", command=moveToStored, bg=buttonBGColor, fg=buttonFGColor) returnToStoredButton.place(relx=.5, rely=13.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) returnToStoredButton.configure(state=DISABLED) return
def setupMoveSection(): global defaultWidth, defaultHeight global buttonWidth, buttonHeight, buttonBGColor, buttonFGColor global stage1Entry, stage2Entry, stage3Entry, stage4Entry global moveAllRelativeButton, moveAllAbsoluteButton global divisions moveLabel = Label(rFrame, text="Move Commands", font=("Times New Roman", 16), wraplength=200, bg="white") moveLabel.place(relx=.5, rely=1.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) stageEntryFrame = Frame(rFrame, width=buttonWidth, bg="white") stageEntryFrame.place(relx=.5, rely=7.0 / divisions, anchor="c") stage1Label = Label(stageEntryFrame, text="Slide Mouse in", bg="white", fg="black", font=("Times New Roman", 12)) stage1Label.grid(row=0, columnspan=2) stage1Entry = Entry(stageEntryFrame, font=("Times New Roman", 12), width=15) stage1Entry.grid(row=1, column=0) stage1Entry.configure(state=DISABLED) stage1Units = Label(stageEntryFrame, text="mm", anchor=W, bg="white", fg="black", font=("Times New Roman", 12)) stage1Units.grid(row=1, column=1) stage2Label = Label(stageEntryFrame, text="Rotation about Axis", bg="white", fg="black", font=("Times New Roman", 12)) stage2Label.grid(row=2, columnspan=2) stage2Entry = Entry(stageEntryFrame, font=("Times New Roman", 12), width=15) stage2Entry.grid(row=3, column=0) stage2Entry.configure(state=DISABLED) stage2Units = Label(stageEntryFrame, text="degrees", anchor=W, bg="white", fg="black", font=("Times New Roman", 12)) stage2Units.grid(row=3, column=1) stage3Label = Label(stageEntryFrame, text="Rotary Axis Y-point", bg="white", fg="black", font=("Times New Roman", 12)) stage3Label.grid(row=4, columnspan=2) stage3Entry = Entry(stageEntryFrame, font=("Times New Roman", 12), width=15) stage3Entry.grid(row=5, column=0) stage3Entry.configure(state=DISABLED) stage3Units = Label(stageEntryFrame, text="mm", anchor=W, bg="white", fg="black", font=("Times New Roman", 12)) stage3Units.grid(row=5, column=1) stage4Label = Label(stageEntryFrame, text="Rotary Axis X-point", bg="white", fg="black", font=("Times New Roman", 12)) stage4Label.grid(row=6, columnspan=2) stage4Entry = Entry(stageEntryFrame, font=("Times New Roman", 12), width=15) stage4Entry.grid(row=7, column=0) stage4Entry.configure(state=DISABLED) stage4Units = Label(stageEntryFrame, text="mm", anchor=W, bg="white", fg="black", font=("Times New Roman", 12)) stage4Units.grid(row=7, column=1) moveAllRelativeButton = Button(rFrame, text="Move All Stages Relative", bg=buttonBGColor, fg=buttonFGColor, command=moveAllRelative) moveAllRelativeButton.place(relx=.5, rely=13.0 / divisions, relwidth=buttonWidth, relheight=buttonHeight, anchor="c") moveAllRelativeButton.configure(state=DISABLED) moveAllAbsoluteButton = Button(rFrame, text="Move All Stages Absolute", bg=buttonBGColor, fg=buttonFGColor, command=moveAllAbsolute) moveAllAbsoluteButton.place(relx=.5, rely=15.0 / divisions, relwidth=buttonWidth, relheight=buttonHeight, anchor="c") moveAllAbsoluteButton.configure(state=DISABLED) return
class GUI: def __init__(self, model, title='PyCX Simulator', interval=0, stepSize=1, param_gui_names=None): self.model = model self.titleText = title self.timeInterval = interval self.stepSize = stepSize self.param_gui_names = param_gui_names if param_gui_names is None: self.param_gui_names = {} self.param_entries = {} self.statusStr = "" self.running = False self.modelFigure = None self.currentStep = 0 self.initGUI() def initGUI(self): #create root window self.rootWindow = Tk() self.statusText = StringVar(value=self.statusStr) self.setStatusStr("Simulation not yet started") self.rootWindow.wm_title(self.titleText) self.rootWindow.protocol('WM_DELETE_WINDOW', self.quitGUI) self.rootWindow.geometry('550x700') self.rootWindow.columnconfigure(0, weight=1) self.rootWindow.rowconfigure(0, weight=1) self.frameSim = Frame(self.rootWindow) self.frameSim.pack(expand=YES, fill=BOTH, padx=5, pady=5, side=TOP) self.status = Label(self.rootWindow, width=40, height=3, relief=SUNKEN, bd=1, textvariable=self.statusText) self.status.pack(side=TOP, fill=X, padx=1, pady=1, expand=NO) self.runPauseString = StringVar() self.runPauseString.set("Run") self.buttonRun = Button(self.frameSim, width=30, height=2, textvariable=self.runPauseString, command=self.runEvent) self.buttonRun.pack(side=TOP, padx=5, pady=5) self.showHelp( self.buttonRun, "Runs the simulation (or pauses the running simulation)") self.buttonStep = Button(self.frameSim, width=30, height=2, text="Step Once", command=self.stepOnce) self.buttonStep.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonStep, "Steps the simulation only once") self.buttonReset = Button(self.frameSim, width=30, height=2, text="Reset", command=self.resetModel) self.buttonReset.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonReset, "Resets the simulation") for param in self.model.params: var_text = self.param_gui_names.get(param, param) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1 + var_text.count('\n'), text=var_text, anchor=W, takefocus=0) lab.pack(side='left') ent = Entry(can, width=11) val = getattr(self.model, param) if isinstance(val, bool): val = int(val) # Show 0/1 which can convert back to bool ent.insert(0, str(val)) ent.pack(side='left') can.pack(side='top') self.param_entries[param] = ent if self.param_entries: self.buttonSaveParameters = Button( self.frameSim, width=50, height=1, command=self.saveParametersCmd, text="Save parameters to the running model", state=DISABLED) self.showHelp( self.buttonSaveParameters, "Saves the parameter values.\n" + "Not all values may take effect on a running model\n" + "A model reset might be required.") self.buttonSaveParameters.pack(side='top', padx=5, pady=5) self.buttonSaveParametersAndReset = Button( self.frameSim, width=50, height=1, command=self.saveParametersAndResetCmd, text="Save parameters to the model and reset the model") self.showHelp( self.buttonSaveParametersAndReset, "Saves the given parameter values and resets the model") self.buttonSaveParametersAndReset.pack(side='top', padx=5, pady=5) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step size ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepScale = Scale(can, from_=1, to=500, resolution=1, command=self.changeStepSize, orient=HORIZONTAL, width=25, length=150) self.stepScale.set(self.stepSize) self.showHelp( self.stepScale, "Skips model redraw during every [n] simulation steps\n" + "Results in a faster model run.") self.stepScale.pack(side='left') can.pack(side='top') can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step visualization delay in ms ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepDelay = Scale(can, from_=0, to=max(2000, self.timeInterval), resolution=10, command=self.changeStepDelay, orient=HORIZONTAL, width=25, length=150) self.stepDelay.set(self.timeInterval) self.showHelp( self.stepDelay, "The visualization of each step is " + "delays by the given number of " + "milliseconds.") self.stepDelay.pack(side='left') can.pack(side='top') def setStatusStr(self, newStatus): self.statusStr = newStatus self.statusText.set(self.statusStr) #model control functions def changeStepSize(self, val): self.stepSize = int(val) def changeStepDelay(self, val): self.timeInterval = int(val) def saveParametersCmd(self): for param, entry in self.param_entries.items(): val = entry.get() if isinstance(getattr(self.model, param), bool): val = bool(int(val)) setattr(self.model, param, val) # See if the model changed the value (e.g. clipping) new_val = getattr(self.model, param) if isinstance(new_val, bool): new_val = int(new_val) entry.delete(0, END) entry.insert(0, str(new_val)) self.setStatusStr("New parameter values have been set") def saveParametersAndResetCmd(self): self.saveParametersCmd() self.resetModel() def runEvent(self): if not self.running: self.running = True self.rootWindow.after(self.timeInterval, self.stepModel) self.runPauseString.set("Pause") self.buttonStep.configure(state=DISABLED) if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.buttonSaveParametersAndReset.configure(state=DISABLED) else: self.stopRunning() def stopRunning(self): self.running = False self.runPauseString.set("Continue Run") self.buttonStep.configure(state=NORMAL) self.drawModel() if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.buttonSaveParametersAndReset.configure(state=NORMAL) def stepModel(self): if self.running: if self.model.step() is True: self.stopRunning() self.currentStep += 1 self.setStatusStr("Step " + str(self.currentStep)) self.status.configure(foreground='black') if (self.currentStep) % self.stepSize == 0: self.drawModel() self.rootWindow.after(int(self.timeInterval * 1.0 / self.stepSize), self.stepModel) def stepOnce(self): self.running = False self.runPauseString.set("Continue Run") self.model.step() self.currentStep += 1 self.setStatusStr("Step " + str(self.currentStep)) self.drawModel() if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) def resetModel(self): self.running = False self.runPauseString.set("Run") self.model.reset() self.currentStep = 0 self.setStatusStr("Model has been reset") self.drawModel() def drawModel(self): if self.modelFigure is None: self.modelFigure = plt.figure() plt.ion() # plt.show() will cause the plot to be actually displayed plt.show() self.model.draw() # Tell matplotlib to redraw too. The darwin-version works with more # types of matplotlib backends, but seems to fail on some Linux # machines. Hence we use the TkAgg specific method when available. if sys.platform == 'darwin': self.modelFigure.canvas.manager.show() else: self.modelFigure.canvas.manager.window.update() def start(self): if self.model.step.__doc__: self.showHelp(self.buttonStep, self.model.step.__doc__.strip()) self.model.reset() self.drawModel() self.rootWindow.mainloop() def quitGUI(self): plt.close('all') self.rootWindow.quit() self.rootWindow.destroy() def showHelp(self, widget, text): def setText(self): self.statusText.set(text) self.status.configure(foreground='blue') def showHelpLeave(self): self.statusText.set(self.statusStr) self.status.configure(foreground='black') widget.bind("<Enter>", lambda e: setText(self)) widget.bind("<Leave>", lambda e: showHelpLeave(self))
class Conversion(Frame): ''' Script creation graphical user interface. Since this page was crowding the main in order to neat this is a better place for it ''' def __init__(self, master=None, **options): #if not master and options.get('parent'): # master = options['parent'] self.master = master Frame.__init__(self, master) self.im_gear = self.master.im_gear # inner class object container self.objt_c = [] def create_conversion_gui(self): # first header row row = Frame(self) TEXT1= "\nSelect the parameters to perform the conversion: " Label(row, text=TEXT1, anchor='w').pack(side='top', padx=2, pady=10) row.pack( side='top', fill='x', padx=5) bottom_hline_deco(self) # file section #======================= DEFAULTS ========================= ex_files=['./Examples/IONP/Original/SPIO_part-water-em.gro', './Examples/IONP/Original/SPIO_part.top', './Examples/IONP/Original/forcefield.itp', './Examples/IONP/Original/ffoplsaaSI_FE_WATnb.itp', './Examples/IONP/Original/ffoplsaaSI_FE_WATbon.itp' ] #ex_files=['conf.gro','topol.top','forcefield.itp','nb.itp','bon.itp'] _atomstyle_ = 'full' _radio_ = 1 data_cont = self.master._convert_['setup'] if data_cont <> []: ex_files = data_cont[:-2] _atomstyle_ = data_cont[-2] _radio_ = data_cont[-1] fi_txt=['Enter the gro file', 'Enter the top file', 'Enter the forcefield file', 'Enter the non bonded file', 'Enter the bonded file' ] for fi in range( len( ex_files)): self.objt_c.append( self.master.createfileentry( self, fi_txt[fi], ex_files[fi], ) ) bottom_hline_deco( self) bottom_hline_deco( self, self.atomstyle) self.objt_c[-1].set( _atomstyle_) self.sol_buffer = _radio_ bottom_hline_deco( self, self.build_solvation_section) self.objt_c[-1].set( _radio_) # Final Buttons self.build_finalbuttons() def build_solvation_section( self): row = Frame(self) self.radio_part( row, 'Solvation atoms', [' yes',' no']) self.solv_b = Button( row, image= self.im_gear, width = 25, height=23, command= self.config_solvation ) self.solv_b.pack( side='right', padx=0) row.pack( side='top', fill='x', pady=3) def radio_part(self, _s_row_, _text_, _desc_=[''], _vals_=[]): _f_labels = format_dec([_s_row_, _text_])#, _pack_=False) radio_var = IntVar() for d in range( len( _desc_)): label_rb = Radiobutton(_s_row_, width=0, text= _desc_[d] ,variable = radio_var , value= len( _desc_)-1-d ,command = self.solvastuff , anchor='w' ) label_rb.pack(side='left', padx=6) self.objt_c.append( radio_var) def solvastuff(self): '''If this point is reached, some button changed ''' _solvation_ = self.objt_c[-1].get() if self.sol_buffer <> _solvation_: self.sol_buffer = _solvation_ if _solvation_: self.solv_b.configure( state = 'normal') else: pop_wrg_1('You are choosing to not consider solvation.' ,' If some solvent molecules are in the' +' .gro file they will be ignored!', _i_=0) self.solv_b.configure( state = 'disabled') def atomstyle( self): ''' in this case just one, but could be modified to be generic, accepting <row>, <text> and <options>''' a_mainrow= Frame( self) row_fst = Frame( a_mainrow) #from self-ttk import Combobox TEXT2= 'Choose an atom style' format_dec([row_fst, TEXT2]) row_fsep = Frame(row_fst) atom_var = StringVar() atom_style_ddl = Drop_Down_List(row_fsep, textvariable = atom_var, #state="readonly" ) atom_style_ddl['values'] = ('full', 'charge', 'molecular', 'angle', 'bond','atomic') atom_style_ddl.bind("<Key>", lambda e: "break") # Magic atom_style_ddl.pack() self.objt_c.append( atom_var) row_fsep.pack(side='left', fill='x', pady=0) # row packing row_fst.pack(side='left', pady=0) a_mainrow.pack(side='top', fill='x', pady=3) def build_finalbuttons(self): Frame(self).pack(side="top", fill='x', pady=20) # Space _row_= self self.b1 = Button(_row_, text='Convert', command = self.getdata_and_convert) self.b1.pack( side = 'right', padx=30, pady=15) b2 = Button(_row_, text = 'Quit', command = self.quit) b2.pack( side = 'right', padx=10, pady=4) def getdata_and_convert(self): _solvatedinfo_ = self.master._convert_['solvation'] if ( self.objt_c[-1].get() and _solvatedinfo_ == []): pop_wrg_1( 'First perform the solvation configuration.' + ' You can do it pressing in solvation settings gears', _i_=0 ) self.solv_b.invoke() elif self.get_entriesvalues(): data_cont = self.master._convert_['setup'] config = data_cont[-2:]+[0] sim_data, flag_done_ = extract_gromacs_data(data_cont[:-2], _solvatedinfo_, config[1:]) if flag_done_: flag_done_ = write_lammps_data( sim_data, 'data.gro2lam', config ) if flag_done_: print_dec_g( 'Data file generated as "data.gro2lam"' ) self._convertdata_ = sim_data self._convertdata_['config'] = config # Returning the values self.master._convertdata_ = self._convertdata_ self.master.swapbody(2) else: pop_wrg_1('The setup needs some further improvements' +'to be runed. Please check your inputs') def get_entriesvalues(self): ''' --- app entry getter ---- mainly to obtain values beside check buttons''' e_values=[] _flag_ = True ent_rang = range(len(self.objt_c)) for ent in ent_rang:#[1:]: e_values.append(self.objt_c[ent].get()) if ent <= 4: _flag_ *= check_file(e_values[-1]) self.master._convert_['setup'] = e_values return _flag_ def createWidgets(self): self.create_conversion_gui() def config_solvation( self): title_txt = ' '*15+'Input Water name' instructions = 'Enter the atom tag letters of:' askfor = ['O in the non bonded file', 'H in the non bonded file', 'O in the .gro file', 'H in the .gro file', 'H - O partial charge' #'Na+ in the .gro file (if are present)', #'Cl- in the .gro file (if are present)' ] _solvatedinfo_ = self.master._convert_['solvation'] if _solvatedinfo_ == []: defaultanswer = ['opls_116','opls_117','OW','HW1, HW2','0.4238' #,'Na','Cl' ] else: defaultanswer = _solvatedinfo_ self.solv_b.config(bg = 'gray40', width = 45) #cyan') self.master._aux_ = [] pop = PromptPopUp(master = self.master, title = title_txt, briefing = instructions, entries_txt = askfor, entries_val = defaultanswer ) pop.wait_window() if self.master._aux_ <> [] and self.get_entriesvalues(): _app_aux_ = self.master._aux_ #============ Check inputs ================= _flag_ = 1 nb_Ox, nbHy, gro_Oxs, gro_Hys, pch= _app_aux_ _gro_f, _, _, _nbn_f, _, _, _= self.master._convert_['setup'] _flags = check_in_file( _nbn_f, nb_Ox, nbHy) print ([nb_Ox, nbHy]) list_aux = [Ox.strip(' ') for Ox in gro_Oxs.split(',')] list_aux += [Ox.strip(' ') for Ox in gro_Hys.split(',')] _flags += check_in_file( _gro_f, *list_aux) print (list_aux) try: x = float(pch) if -10<x<10: _flags += [1] partial_charges = 'Partial charges for H: {} and for O: {}' print partial_charges.format( x, x*-2) else: _flags += [0] except: _flags += [0] list_aux = [nb_Ox, nbHy] + list_aux for v in range(len(_flags)): err_txt = '' if not _flags[v] and v <> (len(_flags)-1): filename = _nbn_f if v>1: filename = _gro_f err_txt = 'Atom tag {} not found in {}' if '/' in filename: filename = filename.split('/')[-1] err_txt = err_txt.format( list_aux[v], filename) _flag_*=0 elif not _flags[v]: err_txt = 'Non valid partial charge {}'.format( pch) _flag_*=0 if err_txt<>'': pop_err_1(err_txt+'\nSetup not saved') #============ Done! ================= if _flag_: self.master._convert_['solvation'] = _app_aux_ print_dec_g('Solvation setup saved!') #self.solv_b.focus() self.solv_b.config(bg = 'lightgrey', width = 28)
class VideoSelectionScreen(GuiBaseFrame): def __init__(self, parent, controller, **kw): GuiBaseFrame.__init__(self, parent, controller, **kw) def init_widgets(self): self.content_wrapper = Frame(self) self.init_video_info() self.screen_title_label = Header1Label(self.content_wrapper, text="Video Selection") self.instruction_label = PLabel( self.content_wrapper, text="Please choose your left and right video files. " "Press Next when finished.\n" "(Files must be in MKV format).") self.left_video_filename_preview_label = PLabel( self.content_wrapper, text="No Video Selected") self.left_video_button = Button( self.content_wrapper, text="Choose Left Video", command=lambda: self.select_video_through_button_press(LEFT)) self.right_video_filename_preview_label = PLabel( self.content_wrapper, text="No Video Selected") self.right_video_button = Button( self.content_wrapper, text="Choose Right Video", command=lambda: self.select_video_through_button_press(RIGHT)) self.next_button = Button(self.content_wrapper, text="Next", state=DISABLED, command=lambda: self.next_screen()) self.add_img_previews() def add_widgets_to_frame(self): self.content_wrapper.grid_columnconfigure(0, weight=1) self.content_wrapper.grid_columnconfigure(1, weight=1) self.screen_title_label.grid(row=SCREEN_TITLE_ROW, column=0, columnspan=CENTER_SCREEN_COLSPAN) self.instruction_label.grid(row=INSTRUCTION_ROW, column=LEFT_VIDEO_THUMBNAIL_COL, columnspan=CENTER_SCREEN_COLSPAN) self.left_video_thumbnail.grid(row=THUMBNAIL_ROW, column=LEFT_VIDEO_THUMBNAIL_COL) self.left_video_filename_preview_label.grid( row=FILENAME_PREVIEW_ROW, column=LEFT_VIDEO_THUMBNAIL_COL) self.left_video_button.grid(row=CHOOSE_VIDEO_BUTTON_ROW, column=LEFT_VIDEO_THUMBNAIL_COL) self.right_video_thumbnail.grid(row=THUMBNAIL_ROW, column=RIGHT_VIDEO_THUMBNAIL_COL) self.right_video_filename_preview_label.grid( row=FILENAME_PREVIEW_ROW, column=RIGHT_VIDEO_THUMBNAIL_COL) self.right_video_button.grid(row=CHOOSE_VIDEO_BUTTON_ROW, column=RIGHT_VIDEO_THUMBNAIL_COL) self.next_button.grid(row=NEXT_BUTTON_ROW, column=0, columnspan=CENTER_SCREEN_COLSPAN) self.content_wrapper.place(relx=SCREENS_REL_X, rely=SCREEN_REL_Y_47, anchor=CENTER) def init_video_info(self): self.left_video_selected = False self.right_video_selected = False self.left_video_filename = None self.right_video_filename = None def next_screen(self): self.controller.set_video_filenames(self.left_video_filename, self.right_video_filename) self.controller.show_next_frame() def add_img_previews(self): img_not_available = cv2.imread( get_asset_filename(IMG_NOT_AVAILABLE_FILENAME)) img_not_available = cv2_bgr_image_to_tkinter_with_resize( img_not_available, VIDEO_PREVIEW_WIDTH, VIDEO_PREVIEW_HEIGHT) self.left_video_thumbnail = Label(self.content_wrapper, image=img_not_available) self.left_video_thumbnail.image = img_not_available self.right_video_thumbnail = Label(self.content_wrapper, image=img_not_available) self.right_video_thumbnail.image = img_not_available def select_video_through_button_press(self, video_side=LEFT): selected_video_filename = select_video_filename() self.set_video_thumbnail_based_on_filename(selected_video_filename, video_side) def set_next_button_state(self): if self.left_video_selected and self.right_video_selected: self.next_button.configure(state=NORMAL) def on_show_frame(self): if does_tmp_file_exist_basename(VIDEOS_SELECTED_TMP_FILENAME): video_filenames = read_tmp_file(VIDEOS_SELECTED_TMP_FILENAME) video_filenames = ast.literal_eval(video_filenames) self.set_video_thumbnail_based_on_filename(video_filenames[LEFT], LEFT) self.set_video_thumbnail_based_on_filename(video_filenames[RIGHT], RIGHT) def on_hide_frame(self): video_filenames_used = { LEFT: self.left_video_filename, RIGHT: self.right_video_filename } write_to_tmp_file(VIDEOS_SELECTED_TMP_FILENAME, str(video_filenames_used)) def set_video_thumbnail_based_on_filename(self, video_filename, video_side=LEFT): if os.path.isfile( os.path.join(os.path.dirname(video_filename), os.path.basename(video_filename))): vc_object = cv2.VideoCapture(video_filename) _, img = vc_object.read() vc_object.release() img = cv2_bgr_image_to_tkinter_with_resize(img, VIDEO_PREVIEW_WIDTH, VIDEO_PREVIEW_HEIGHT) self.update_ui(video_filename, img, True, video_side) def update_ui(self, filename, img, video_selected, video_side=LEFT): if video_selected and video_side == LEFT: self.left_video_selected = True self.left_video_filename = filename self.left_video_filename_preview_label.config( text=os.path.basename(os.path.normpath(filename))) self.set_next_button_state() self.left_video_thumbnail.configure(image=img) self.left_video_thumbnail.image = img elif video_selected and video_side == RIGHT: self.right_video_selected = True self.right_video_filename = filename self.right_video_filename_preview_label.config( text=os.path.basename(os.path.normpath(filename))) self.set_next_button_state() self.right_video_thumbnail.configure(image=img) self.right_video_thumbnail.image = img
class GuessingGame: def __init__(self, master): self.master = master master.title("Guessing Game") self.secret_number = random.randint(1, 100) self.guess = None self.num_guesses = 0 self.message = "Guess a number from 1 to 100" self.label_text = StringVar() self.label_text.set(self.message) self.label = Label(master, textvariable=self.label_text) vcmd = master.register(self.validate) # we have to wrap the command self.entry = Entry(master, validate="key", validatecommand=(vcmd, '%P')) self.guess_button = Button(master, text="Guess", command=self.guess_number) self.reset_button = Button(master, text="Play again", command=self.reset, state=DISABLED) self.label.grid(row=0, column=0, columnspan=2, sticky=W+E) self.entry.grid(row=1, column=0, columnspan=2, sticky=W+E) self.guess_button.grid(row=2, column=0) self.reset_button.grid(row=2, column=1) def validate(self, new_text): if not new_text: # the field is being cleared self.guess = None return True try: guess = int(new_text) if 1 <= guess <= 100: self.guess = guess return True else: return False except ValueError: return False def guess_number(self): self.num_guesses += 1 if self.guess is None: self.message = "Guess a number from 1 to 100" elif self.guess == self.secret_number: suffix = '' if self.num_guesses == 1 else 'es' self.message = "Congratulations! You guessed the number after %d guess%s." % (self.num_guesses, suffix) self.guess_button.configure(state=DISABLED) self.reset_button.configure(state=NORMAL) elif self.guess < self.secret_number: self.message = "Too low! Guess again!" else: self.message = "Too high! Guess again!" self.label_text.set(self.message) def reset(self): self.entry.delete(0, END) self.secret_number = random.randint(1, 100) self.guess = 0 self.num_guesses = 0 self.message = "Guess a number from 1 to 100" self.label_text.set(self.message) self.guess_button.configure(state=NORMAL) self.reset_button.configure(state=DISABLED)
class SigBridgeUI(Tk): server = None server_thread = None def __init__(self): Tk.__init__(self) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) # 2 rows: firts with settings, second with registrar data self.main_frame = Frame(self) # Commands row doesn't expands self.main_frame.rowconfigure(0, weight=0) # Logs row will grow self.main_frame.rowconfigure(1, weight=1) # Main frame can enlarge self.main_frame.columnconfigure(0, weight=1) self.main_frame.columnconfigure(1, weight=1) self.main_frame.grid(row=0, column=0) # Run/Stop button self.server_button = Button(self.main_frame, text="Connect", command=self.start_server) self.server_button.grid(row=0, column=0) # Clear button self.clear_button = Button(self.main_frame, text="Clear Log", command=self.clear_log) self.clear_button.grid(row=0, column=1) # Logs Widget self.log_widget = ScrolledText(self.main_frame) self.log_widget.grid(row=1, column=0, columnspan=2) # made not editable self.log_widget.config(state='disabled') # Queue where the logging handler will write self.log_queue = Queue.Queue() # Setup the logger self.uilogger = logging.getLogger('SigBridgeUI') self.uilogger.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # Use the QueueLogger as Handler hl = QueueLogger(queue=self.log_queue) hl.setFormatter(formatter) self.uilogger.addHandler(hl) # self.log_widget.update_idletasks() self.set_geometry() # Setup the update_widget callback reading logs from the queue self.start_log() def clear_log(self): self.log_widget.config(state='normal') self.log_widget.delete(0.0, END) self.log_widget.config(state='disabled') def start_log(self): self.uilogger.info("SigBridge Started.") self.update_widget() # self.control_log_button.configure(text="Pause Log", command=self.stop_log) def update_widget(self): self.log_widget.config(state='normal') # Read from the Queue and add to the log widger while not self.log_queue.empty(): line = self.log_queue.get() tag = "error" if " ERROR " in line else 'info' self.log_widget.insert(END, line, tag) self.log_widget.see(END) # Scroll to the bottom self.log_widget.update_idletasks() self.log_widget.tag_config('error', foreground="red") self.log_widget.config(state='disabled') self.log_widget.after(10, self.update_widget) def set_geometry(self): # set position in window w = 600 # width for the Tk h = 300 # height for the Tk # get screen width and height ws = self.winfo_screenwidth() # width of the screen hs = self.winfo_screenheight() # height of the screen # calculate x and y coordinates for the Tk window x = (ws/2) - (w/2) y = (hs/2) - (h/2) # set the dimensions of the screen # and where it is placed self.geometry('%dx%d+%d+%d' % (w, h, x, y)) def start_server(self): try: self.server = SigServer(('0.0.0.0', 25), None, self.uilogger) self.server_thread = threading.Thread(name='server', target=self.server.run) self.server_thread.daemon = True self.server_thread.start() self.server_button.configure(text="Disconnect", command=self.stop_server) except Exception as err: self.uilogger("Cannot start the server: %s" % err.message) # self.label_variable.set(self.entry_variable.get()+"(Started Signal Server)") # self.entry.focus_set() # self.entry.selection_range(0, END) def stop_server(self): self.server.shutdown() self.server_button.configure(text="Connect", command=self.start_server) self.server = None
class Master: def __init__(self, master): self.master = master master.title("HTTP FLOOD") self.IP = None self.message = "Type IP to be attacked:" self.label_text = StringVar() self.label_text.set(self.message) self.label = Label(master, textvariable=self.label_text) vcmd = master.register(self.validate) # we have to wrap the command self.entry = Entry(master, validate="key", validatecommand=(vcmd, '%P')) self.atack_button = Button(master, text="Start Atack", command=self.validate_IP) self.stop_button = Button(master, text="Stop Atack", command=self.reset, state=DISABLED) self.label.grid(row=0, column=0, columnspan=2, sticky=W + E) self.entry.grid(row=1, column=0, columnspan=2, sticky=W + E) self.atack_button.grid(row=2, column=0) self.stop_button.grid(row=2, column=1) def validate(self, new_text): if not new_text: # the field is being cleared self.IP = None return True else: IP = new_text self.IP = IP return True def validate_IP(self): if (is_valid_ipv4(str(self.IP))): self.message = "Valid IP, Contacting Slaves!" self.atack_button.configure(state=DISABLED) self.stop_button.configure(state=NORMAL) else: self.message = "Invalid IP, Try Again" if self.IP is None: self.message = "Type IP to be attacked:" self.label_text.set(self.message) def reset(self): self.entry.delete(0, END) self.IP = None self.message = "Type IP to be attacked:" self.label_text.set(self.message) self.atack_button.configure(state=NORMAL) self.stop_button.configure(state=DISABLED)
class GUI: def __init__(self, model, title='PyCX Simulator', interval=0, stepSize=1, param_gui_names=None): self.model = model self.titleText = title self.timeInterval = interval self.stepSize = stepSize self.param_gui_names = param_gui_names if param_gui_names is None: self.param_gui_names = {} self.param_entries = {} self.statusStr = "" self.running = False self.modelFigure = None self.currentStep = 0 self.initGUI() def initGUI(self): #create root window self.rootWindow = Tk() self.statusText = StringVar(value=self.statusStr) self.setStatusStr("Simulation not yet started") self.rootWindow.wm_title(self.titleText) self.rootWindow.protocol('WM_DELETE_WINDOW', self.quitGUI) self.rootWindow.geometry('550x700') self.rootWindow.columnconfigure(0, weight=1) self.rootWindow.rowconfigure(0, weight=1) self.frameSim = Frame(self.rootWindow) self.frameSim.pack(expand=YES, fill=BOTH, padx=5, pady=5, side=TOP) self.status = Label(self.rootWindow, width=40, height=3, relief=SUNKEN, bd=1, textvariable=self.statusText) self.status.pack(side=TOP, fill=X, padx=1, pady=1, expand=NO) self.runPauseString = StringVar() self.runPauseString.set("Run") self.buttonRun = Button(self.frameSim, width=30, height=2, textvariable=self.runPauseString, command=self.runEvent) self.buttonRun.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonRun, "Runs the simulation (or pauses the running simulation)") self.buttonStep = Button(self.frameSim, width=30, height=2, text="Step Once", command=self.stepOnce) self.buttonStep.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonStep, "Steps the simulation only once") self.buttonReset = Button(self.frameSim, width=30, height=2, text="Reset", command=self.resetModel) self.buttonReset.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonReset, "Resets the simulation") for param in self.model.params: var_text = self.param_gui_names.get(param, param) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1 + var_text.count('\n'), text=var_text, anchor=W, takefocus=0) lab.pack(side='left') ent = Entry(can, width=11) val = getattr(self.model, param) if isinstance(val, bool): val = int(val) # Show 0/1 which can convert back to bool ent.insert(0, str(val)) ent.pack(side='left') can.pack(side='top') self.param_entries[param] = ent if self.param_entries: self.buttonSaveParameters = Button(self.frameSim, width=50, height=1, command=self.saveParametersCmd, text="Save parameters to the running model", state=DISABLED) self.showHelp(self.buttonSaveParameters, "Saves the parameter values.\n" + "Not all values may take effect on a running model\n" + "A model reset might be required.") self.buttonSaveParameters.pack(side='top', padx=5, pady=5) self.buttonSaveParametersAndReset = Button(self.frameSim, width=50, height=1, command=self.saveParametersAndResetCmd, text="Save parameters to the model and reset the model") self.showHelp(self.buttonSaveParametersAndReset, "Saves the given parameter values and resets the model") self.buttonSaveParametersAndReset.pack(side='top', padx=5, pady=5) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step size ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepScale = Scale(can, from_=1, to=500, resolution=1, command=self.changeStepSize, orient=HORIZONTAL, width=25, length=150) self.stepScale.set(self.stepSize) self.showHelp(self.stepScale, "Skips model redraw during every [n] simulation steps\n" + "Results in a faster model run.") self.stepScale.pack(side='left') can.pack(side='top') can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step visualization delay in ms ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepDelay = Scale(can, from_=0, to=max(2000, self.timeInterval), resolution=10, command=self.changeStepDelay, orient=HORIZONTAL, width=25, length=150) self.stepDelay.set(self.timeInterval) self.showHelp(self.stepDelay, "The visualization of each step is " + "delays by the given number of " + "milliseconds.") self.stepDelay.pack(side='left') can.pack(side='top') def setStatusStr(self, newStatus): self.statusStr = newStatus self.statusText.set(self.statusStr) #model control functions def changeStepSize(self, val): self.stepSize = int(val) def changeStepDelay(self, val): self.timeInterval = int(val) def saveParametersCmd(self): for param, entry in self.param_entries.items(): val = entry.get() if isinstance(getattr(self.model, param), bool): val = bool(int(val)) setattr(self.model, param, val) # See if the model changed the value (e.g. clipping) new_val = getattr(self.model, param) if isinstance(new_val, bool): new_val = int(new_val) entry.delete(0, END) entry.insert(0, str(new_val)) self.setStatusStr("New parameter values have been set") def saveParametersAndResetCmd(self): self.saveParametersCmd() self.resetModel() def runEvent(self): if not self.running: self.running = True self.rootWindow.after(self.timeInterval, self.stepModel) self.runPauseString.set("Pause") self.buttonStep.configure(state=DISABLED) if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.buttonSaveParametersAndReset.configure(state=DISABLED) else: self.stopRunning() def stopRunning(self): self.running = False self.runPauseString.set("Continue Run") self.buttonStep.configure(state=NORMAL) self.drawModel() if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.buttonSaveParametersAndReset.configure(state=NORMAL) def stepModel(self): if self.running: if self.model.step() is True: self.stopRunning() self.currentStep += 1 self.setStatusStr("Step " + str(self.currentStep)) self.status.configure(foreground='black') if (self.currentStep) % self.stepSize == 0: self.drawModel() self.rootWindow.after(int(self.timeInterval * 1.0 / self.stepSize), self.stepModel) def stepOnce(self): self.running = False self.runPauseString.set("Continue Run") self.model.step() self.currentStep += 1 self.setStatusStr("Step " + str(self.currentStep)) self.drawModel() if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) def resetModel(self): self.running = False self.runPauseString.set("Run") self.model.reset() self.currentStep = 0 self.setStatusStr("Model has been reset") self.drawModel() def drawModel(self): if self.modelFigure is None: self.modelFigure = plt.figure() plt.ion() self.model.draw() # Tell matplotlib to redraw too. The darwin-version works with more # types of matplotlib backends, but seems to fail on some Linux # machines. Hence we use the TkAgg specific method when available. if sys.platform == 'darwin': self.modelFigure.canvas.manager.show() else: self.modelFigure.canvas.manager.window.update() def start(self): if self.model.step.__doc__: self.showHelp(self.buttonStep, self.model.step.__doc__.strip()) self.model.reset() self.drawModel() self.rootWindow.mainloop() def quitGUI(self): plt.close('all') self.rootWindow.quit() self.rootWindow.destroy() def showHelp(self, widget, text): def setText(self): self.statusText.set(text) self.status.configure(foreground='blue') def showHelpLeave(self): self.statusText.set(self.statusStr) self.status.configure(foreground='black') widget.bind("<Enter>", lambda e: setText(self)) widget.bind("<Leave>", lambda e: showHelpLeave(self))
class App(Tk): def __init__(self): Tk.__init__(self) self.label = Label(self, text="Stopper.") self.label.pack() self.label2 = Label(self, text="") self.label2.pack() self.play_button = Button(self, text="Play", command=self.play) self.play_button.pack(side="left", padx=2, pady=2) self.stop_button = Button(self, text="Stop", command=self.stop) self.stop_button.pack(side="left", padx=2, pady=2) self._thread, self._pause, self._stop = None, False, True def action(self): while True: if self._stop: print('on ferme le port') ser.close() break while self._pause: self.label["text"] = "Pause... " sleep(0.1) if not ser.isOpen(): ser.open() ser.reset_output_buffer() print('On attend que la balance envoie le poids') response = ser.read_until('\r\n') response = response.strip().split(' ') ser.reset_output_buffer() poids = response print('m :' + poids[0] + '-unité :' + poids[1]) self.label2["text"] = 'm :' + poids[0] + '-unité :' + poids[1] # for i in range(1000): # if self._stop: # break # while self._pause: # self.label["text"] = "Pause... (count: {})".format(i) # sleep(0.1) # self.label["text"] = "Playing... (count: {})".format(i) # sleep(0.1) # self.label["text"] = "Stopped." def play(self): if self._thread is None: self._stop = False self._thread = Thread(name="test", target=self.action) self._thread.start() self._pause = False self.play_button.configure(text="Pause", command=self.pause) self.label["text"] = "En attente de poids..." def pause(self): self._pause = True self.play_button.configure(text="Play", command=self.play) def stop(self): if self._thread is not None: #ser.close() self._thread, self._pause, self._stop = None, False, True self.play_button.configure(text="Play", command=self.play) self.label["text"] = "Stopper" self.label2["text"] = ""
def setupSerialSection(): global submitButton, rescanButton, serialOptionMenu, setSettingsButton global closeSerialButton, clearSettingsButton global buttonWidth, buttonHeight, buttonBGColor, buttonFGColor global divisions serialLabel = Label(lFrame, text="Serial Commands", font=("Times New Roman", 16), wraplength=200, bg="white") serialLabel.place(relx=.5, rely=1.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) rescanButton = Button(lFrame, text="Rescan", command=updateOptionMenu, bg=buttonBGColor, fg=buttonFGColor) rescanButton.place(relx=.5, rely=3.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) serialOptionMenu = OptionMenu(lFrame, var, *values) serialOptionMenu.place(relx=.5, rely=5.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) serialOptionMenu['bg'] = buttonBGColor serialOptionMenu['fg'] = buttonFGColor serialOptionMenu.configure(activebackground=buttonBGColor, activeforeground=buttonFGColor, highlightthickness=0) serialOptionMenu.configure(borderwidth=0) dropMenu = serialOptionMenu['menu'] dropMenu.configure(bg=buttonBGColor, fg=buttonFGColor, activeborderwidth=0) submitButton = Button(lFrame, text="Submit", command=setSerial, bg=buttonBGColor, fg=buttonFGColor) submitButton.place(relx=.5, rely=7.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) submitButton.configure(state=DISABLED) setSettingsButton = Button(lFrame, text="Set Stage Settings", command=setSettings, bg=buttonBGColor, fg=buttonFGColor) setSettingsButton.place(relx=.5, rely=9.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) setSettingsButton.configure(state=DISABLED) clearSettingsButton = Button(lFrame, text="Clear Stage Settings", command=clearSettings, bg=buttonBGColor, fg=buttonFGColor) clearSettingsButton.place(relx=.5, rely=11.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) clearSettingsButton.configure(state=DISABLED) closeSerialButton = Button(lFrame, text="Close Serial", command=closeSerial, bg=buttonBGColor, fg=buttonFGColor) closeSerialButton.place(relx=.5, rely=13.0 / divisions, anchor="c", relwidth=buttonWidth, relheight=buttonHeight) closeSerialButton.configure(state=DISABLED) return
class DisplayQuadTree(object): def __init__(self, width, height, scale=1, show_grid=False): self._scale = scale self._grid_width = 1 if show_grid else 0 self.size = (width*scale, height*scale) self._is_animate = False self._anime_time = 0.1 self._tk_root = Tk() self._canvas = Canvas(self._tk_root, width=self.size[0], height=self.size[1]) self._canvas.pack() self._button = Button(self._tk_root, text='Finished', command=self._stop_animate) self._button.configure(width=10, relief=FLAT) self._canvas.create_window(10, 10, anchor=NW, window=self._button) self._labelstr = StringVar() self._labelstr.set('0%') self._label = Label(self._tk_root, textvariable=self._labelstr) self._canvas.create_window(self.size[0] - 10, self.size[1] - 10, anchor=SE, window=self._label) def static(self, qtree): """ Draw the final output. """ if qtree is None: return stack = [qtree] while len(stack): qnode = stack.pop() if qnode.children: for child in qnode.children: stack.append(child) else: colour = '#{0:02x}{1:02x}{2:02x}'.format(*qnode.ave_color) self._canvas.create_rectangle(qnode.x * self._scale, qnode.y * self._scale, (qnode.x + qnode.width) * self._scale, (qnode.y + qnode.height) * self._scale, width=self._grid_width, outline='grey', fill=colour) self._labelstr.set('100%') def _stop_animate(self): """ Stop the animation. Called by the "Stop" button """ self._is_animate = False self._button.configure(text='Finished') def animate(self, qtree): """ Animate the development of the quadtree as it was generated. Press the "Stop" to stop the animation """ if qtree is None: return self._is_animate = True self._button.configure(text='Stop') q = Queue.Queue() q.put(qtree) count, max_qtrees = 0.0, qtree.sq_num while not q.empty() and self._is_animate: qnode = q.get() if qnode.children: for child in qnode.children: q.put(child) count += 1.0 colour = '#{0:02x}{1:02x}{2:02x}'.format(*qnode.ave_color) self._canvas.create_rectangle(qnode.x * self._scale, qnode.y * self._scale, (qnode.x + qnode.width) * self._scale, (qnode.y + qnode.height) * self._scale, width=self._grid_width, outline='grey', fill=colour) self._canvas.update() self._labelstr.set('{}%'.format(int(count/max_qtrees * 100))) time.sleep(self._anime_time) self._stop_animate() def show(self): """ Call this to start the display. """ self._tk_root.mainloop()
def _init_ui(self): self.parent.title("GridWorld") self.config(bg='#F0F0F0') self.pack(fill=BOTH, expand=1) # create canvas self.canvas = Canvas(self, width=self.board_width, height=self.board_height, bg='#CCFF99', borderwidth=0, highlightthickness=0) for row in range(self.max_row): for col in range(self.max_col): if self.algorithm.gw.is_terminal_state((row, col)): is_terminal, value = self.algorithm.gw.is_terminal_state((row, col)) if value == -100: self.canvas.create_rectangle(col * self.sq_size, row * self.sq_size, (col + 1) * self.sq_size, (row + 1) * self.sq_size, outline='gray', fill='#FF3300', width=1) else: self.canvas.create_rectangle(col * self.sq_size, row * self.sq_size, (col + 1) * self.sq_size, (row + 1) * self.sq_size, outline='gray', fill='#0066FF', width=1) continue nx0 = col * self.sq_size ny0 = row * self.sq_size nx1 = nx0 + self.sq_size ny1 = ny0 nx2 = nx0 + self.sq_size / 2 ny2 = ny0 + self.sq_size / 2 n_points = [nx0, ny0, nx1, ny1, nx2, ny2] n_polygon = self.canvas.create_polygon(n_points, outline='gray', fill='#CCFF99', width=1) self.polygons.add_polygon(n_polygon, (row, col), "N") ex0 = (col + 1) * self.sq_size ey0 = row * self.sq_size ex1 = ex0 ey1 = ey0 + self.sq_size ex2 = ex0 - self.sq_size / 2 ey2 = ey0 + self.sq_size / 2 e_points = [ex0, ey0, ex1, ey1, ex2, ey2] e_polygon = self.canvas.create_polygon(e_points, outline='gray', fill='#CCFF99', width=1) self.polygons.add_polygon(e_polygon, (row, col), "E") sx0 = col * self.sq_size sy0 = (row + 1) * self.sq_size sx1 = sx0 + self.sq_size sy1 = sy0 sx2 = sx0 + self.sq_size / 2 sy2 = sy0 - self.sq_size / 2 s_points = [sx0, sy0, sx1, sy1, sx2, sy2] s_polygon = self.canvas.create_polygon(s_points, outline='gray', fill='#CCFF99', width=1) self.polygons.add_polygon(s_polygon, (row, col), "S") wx0 = col * self.sq_size wy0 = row * self.sq_size wx1 = wx0 wy1 = wy0 + self.sq_size wx2 = wx0 + self.sq_size / 2 wy2 = wy0 + self.sq_size / 2 w_points = [wx0, wy0, wx1, wy1, wx2, wy2] w_polygon = self.canvas.create_polygon(w_points, outline='gray', fill='#CCFF99', width=1) self.polygons.add_polygon(w_polygon, (row, col), "W") self.canvas.pack(side=TOP, padx=10, pady=10) start_button = Button(self, text="Start", command=self.start_algorithm) start_button.configure(width=10) start_button.pack(side=LEFT) pause_button = Button(self, text="Pause", command=self.pause_algorithm) pause_button.configure(width=10) pause_button.pack(side=RIGHT)
class File_Entry(Frame): ''' Quite self explanatoy... creates a row in which is possible to search for a file''' def __init__(self, master=None, **kwargs): # this was a nice frame, but considering that needs # from popup import FilePopUp, was moved elsewere # meaning this is not as low level as tk_lib #if not master and options.get('parent'): # master = options['parent'] self.master = master Frame.__init__(self, master) self.entries_txt = None self.entries_val = None if 'e_txt' in kwargs.keys(): self.entries_txt = kwargs['e_txt'] if 'e_val' in kwargs.keys(): self.entries_val = kwargs['e_val'] # File extension if 'f_ext' in kwargs.keys(): self.file_ext = kwargs['f_ext'] else: self.file_ext = [ '.' + self.entries_val.split('.')[-1], ] # File extension description if 'f_ext_d' in kwargs.keys(): self.fex_description = kwargs['f_ext_d'] else: self.fex_description = [ self.entries_txt, ] # file icon image, part of the master's personal library self.file_img = self.master.img['file'] # inner class object container self._entry = [] self._button = [] self._strvar = StringVar() self.createWidgets() def createWidgets(self): '''creates the row content and stores the objects ''' # INIT file_row = Frame(self) fi_text = self.entries_txt _def_file_ = self.entries_val f_ext_txt = () for i in range(len(self.file_ext)): f_ext_txt += ((self.fex_description[i], self.file_ext[i]), ) # Building _f_labels = format_dec([file_row, fi_text], _pack_=False) self._entry = Entry(file_row, width=13, textvariable=self._strvar) self._entry.insert('end', _def_file_) self._entry.bind("<Key>", lambda e: "break") # Magic self._entry.xview_moveto(1) self._button = Button( file_row, image=self.file_img, command=(lambda El=self._entry: self.browsefile(El, f_ext_txt))) # Just packing format_dec(_f_labels, _create_=False) self._entry.pack(side='left', expand='yes', fill='x') self._button.pack(side='right', padx=0, pady=0) file_row.pack(side='top', fill='x', pady=3) def browsefile(self, entry, ext=None): '''Browse a file <button> action binder''' pop = FilePopUp(master=self) if ext <> None and isinstance(ext, tuple): #print '--- ', ext, type(ext) pop.filetypes['filetypes'] = ext #(("All","*"),) # filepath = pop.getfilepath() try: fito = open(filepath, "r") fito.close() entry.delete(0, 'end') entry.insert(0, filepath) entry.xview_moveto(1) except: if filepath not in ['', ()]: print "Could not open File: ", filepath print exc_info()[1] def setter(self, value): if value: self.enable_entr() else: self.disable_entr() def disable_entr(self): self._entry.configure(state='disabled') self._button.configure(state='disabled') def enable_entr(self): self._entry.configure(state='normal') self._button.configure(state='normal')
def draw_board(root): """ Create the graphical user interface. """ # provide the title that will be shown in the header root.title("Bonbon Crumble") # Indicate which variables of the program will be altered # ! In order to manipulate variables that are part of the program # ! but exist outside of the function, you need to indicate that you want # ! to use and alter these variables by declaring them as "global" global canvas, board, ovals, progress_label, points_label, points_field, \ max_label, max_field, swaps_left_label, swaps_left_field # canvas will be the main board used for mastermind # ! to create a canvas, the constructor is called # ! (i.e. name of the class and required parameters) canvas = Canvas(root, bg="white", height=DIMENSION * (BONBON_SIZE + BONBON_SPACING) + 100, width=DIMENSION * (BONBON_SIZE + BONBON_SPACING)) # Draw the empty circles representing the guesses create_ovals(DIMENSION, DIMENSION) # Fill circles with initial colors init_board(DIMENSION) canvas.create_line(0, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING), bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 10, width=2) # Draw the progress label progress_label = Label(canvas, text=">> Select first bonbon.") canvas.create_window(10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 15, anchor=NW, window=progress_label) canvas.create_line(0, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 40, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING), bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 40, width=1) # Draw the swaps left label and field swaps_left_label = Label(canvas, text="Swaps left:") canvas.create_window(10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50, anchor=NW, window=swaps_left_label) swaps_left_field = Label(canvas, text=remaining_swaps, bg="white") canvas.create_window(2 * (BONBON_SIZE + BONBON_SPACING) + 10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50, anchor=NW, window=swaps_left_field) # Draw the points label and field points_label = Label(canvas, text="Score:", font=16) canvas.create_window(3 * (BONBON_SIZE + BONBON_SPACING), bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50, anchor=NW, window=points_label) points_field = Label(canvas, text="0", font=16) canvas.create_window(4 * (BONBON_SIZE + BONBON_SPACING) + 10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50, anchor=NW, window=points_field) # Draw the max points label and field max_label = Label(canvas, text="Max score:") canvas.create_window(5 * (BONBON_SIZE + BONBON_SPACING) + 10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50, anchor=NW, window=max_label) max_field = Label(canvas, text="n/a", bg="white") canvas.create_window(7 * (BONBON_SIZE + BONBON_SPACING) + 10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50, anchor=NW, window=max_field) canvas.itemconfig(max_field, fill="red") # Draw the quit button quit_button = Button(canvas, text="Quit", command=root.destroy) quit_button.configure(width=5, relief=FLAT) canvas.create_window(10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 75, anchor=NW, window=quit_button) # Draw the max button max_button = Button(canvas, text="Calculate maximum score", command=get_maximum_score) max_button.configure(width=20, relief=FLAT) canvas.create_window(100, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 75, anchor=NW, window=max_button) # draw the canvas canvas.pack()
class GUI: def __init__(self, model, title='PyCX Simulator', interval=0, step_size=1, param_gui_names=None): self.model = model self.titleText = title self.timeInterval = interval self.stepSize = step_size self.param_gui_names = param_gui_names if param_gui_names is None: self.param_gui_names = {} self.param_entries = {} self.statusStr = "" self.running = False self.modelFigure = None self.currentStep = 0 self.init_gui() def init_gui(self): # create root window self.rootWindow = Tk() self.statusText = StringVar(value=self.statusStr) self.set_status_str("Simulation not yet started") self.rootWindow.wm_title(self.titleText) self.rootWindow.protocol('WM_DELETE_WINDOW', self.quit_gui) self.rootWindow.geometry('550x700') self.rootWindow.columnconfigure(0, weight=1) self.rootWindow.rowconfigure(0, weight=1) self.frameSim = Frame(self.rootWindow) self.frameSim.pack(expand=YES, fill=BOTH, padx=5, pady=5, side=TOP) self.status = Label(self.rootWindow, width=40, height=3, relief=SUNKEN, bd=1, textvariable=self.statusText) self.status.pack(side=TOP, fill=X, padx=1, pady=1, expand=NO) self.runPauseString = StringVar() self.runPauseString.set("Run") self.buttonRun = Button(self.frameSim, width=30, height=2, textvariable=self.runPauseString, command=self.run_event) self.buttonRun.pack(side=TOP, padx=5, pady=5) self.show_help( self.buttonRun, "Runs the simulation (or pauses the running simulation)") self.buttonStep = Button(self.frameSim, width=30, height=2, text="Step Once", command=self.step_once) self.buttonStep.pack(side=TOP, padx=5, pady=5) self.show_help(self.buttonStep, "Steps the simulation only once") self.buttonReset = Button(self.frameSim, width=30, height=2, text="Reset", command=self.reset_model) self.buttonReset.pack(side=TOP, padx=5, pady=5) self.show_help(self.buttonReset, "Resets the simulation") for param in self.model.params: var_text = self.param_gui_names.get(param, param) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1 + var_text.count('\n'), text=var_text, anchor=W, takefocus=0) lab.pack(side='left') ent = Entry(can, width=11) val = getattr(self.model, param) if isinstance(val, bool): val = int(val) # Show 0/1 which can convert back to bool ent.insert(0, str(val)) ent.pack(side='left') can.pack(side='top') self.param_entries[param] = ent if self.param_entries: self.buttonSaveParameters = Button( self.frameSim, width=50, height=1, command=self.save_parameters_cmd, text="Save parameters to the running model", state=DISABLED) self.show_help( self.buttonSaveParameters, "Saves the parameter values.\n Not all values may take effect " "on a running model\n A model reset might be required.") self.buttonSaveParameters.pack(side='top', padx=5, pady=5) self.buttonSaveParametersAndReset = Button( self.frameSim, width=50, height=1, command=self.save_parameters_and_reset_cmd, text="Save parameters to the model and reset the model") self.show_help( self.buttonSaveParametersAndReset, "Saves the given parameter values and resets the model") self.buttonSaveParametersAndReset.pack(side='top', padx=5, pady=5) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step size ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepScale = Scale(can, from_=1, to=500, resolution=1, command=self.change_step_size, orient=HORIZONTAL, width=25, length=150) self.stepScale.set(self.stepSize) self.show_help( self.stepScale, "Skips model redraw during every [n] simulation steps\n" + " Results in a faster model run.") self.stepScale.pack(side='left') can.pack(side='top') can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step visualization delay in ms ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepDelay = Scale(can, from_=0, to=max(2000, self.timeInterval), resolution=10, command=self.change_step_delay, orient=HORIZONTAL, width=25, length=150) self.stepDelay.set(self.timeInterval) self.show_help( self.stepDelay, "The visualization of each step is " + "delays by the given number of " + "milliseconds.") self.stepDelay.pack(side='left') can.pack(side='top') def set_status_str(self, new_status): self.statusStr = new_status self.statusText.set(self.statusStr) # model control functions def change_step_size(self, val): self.stepSize = int(val) def change_step_delay(self, val): self.timeInterval = int(val) def save_parameters_cmd(self): for param, entry in self.param_entries.items(): val = entry.get() if isinstance(getattr(self.model, param), bool): val = bool(int(val)) setattr(self.model, param, val) # See if the model changed the value (e.g. clipping) new_val = getattr(self.model, param) if isinstance(new_val, bool): new_val = int(new_val) entry.delete(0, END) entry.insert(0, str(new_val)) self.set_status_str("New parameter values have been set") def save_parameters_and_reset_cmd(self): self.save_parameters_cmd() self.reset_model() def run_event(self): if not self.running: self.running = True self.rootWindow.after(self.timeInterval, self.step_model) self.runPauseString.set("Pause") self.buttonStep.configure(state=DISABLED) if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.buttonSaveParametersAndReset.configure(state=DISABLED) else: self.stop_running() def stop_running(self): self.running = False self.runPauseString.set("Continue Run") self.buttonStep.configure(state=NORMAL) self.draw_model() if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.buttonSaveParametersAndReset.configure(state=NORMAL) def step_model(self): if self.running: if self.model.step() is True: self.stop_running() self.currentStep += 1 self.set_status_str("Step " + str(self.currentStep)) self.status.configure(foreground='black') if self.currentStep % self.stepSize == 0: self.draw_model() self.rootWindow.after(int(self.timeInterval * 1.0 / self.stepSize), self.step_model) def step_once(self): self.running = False self.runPauseString.set("Continue Run") self.model.step() self.currentStep += 1 self.set_status_str("Step " + str(self.currentStep)) self.draw_model() if self.param_entries: self.buttonSaveParameters.configure(state=NORMAL) self.currentStep += 1 def reset_model(self): self.running = False self.runPauseString.set("Run") self.model.reset() self.currentStep = 0 self.set_status_str("Model has been reset") self.draw_model() def get_point_color(self, data): point_colors = [] for i in data: point_colors.append([0, 0, 0, i / self.model.k]) return point_colors def draw_model(self): if self.modelFigure is None: self.modelFigure = plt.figure() ax = self.modelFigure.add_subplot(111) xax = ax.xaxis xax.tick_top() points = self.init_values() ax.axis([0, len(points[0]) + 1, 0, 100]) ax.invert_yaxis() plt.scatter(points[0], points[1], c=self.get_point_color(points[2]), s=5, marker='s') plt.gray() plt.ion() dpi = self.modelFigure.get_dpi() self.modelFigure.set_size_inches(550.0 / float(dpi), 550.0 / float(dpi)) self.modelFigure.canvas.manager.window.resizable("false", "false") plt.show() if sys.platform == 'darwin': self.modelFigure.canvas.manager.show() else: points = self.init_values() plt.scatter(points[0], points[1], c=self.get_point_color(points[2]), s=5, marker='s') self.modelFigure.canvas.manager.window.update() def init_values(self): data = self.model.draw() x = [] point_value = 1 for _ in data: x.append(point_value) point_value += 1 t = np.empty(len(x)) t.fill(self.currentStep) return [x, t, data] def start(self): if self.model.step.__doc__: self.show_help(self.buttonStep, self.model.step.__doc__.strip()) self.model.reset() self.draw_model() self.rootWindow.mainloop() def quit_gui(self): plt.close('all') self.rootWindow.quit() self.rootWindow.destroy() def show_help(self, widget, text): def set_text(self): self.statusText.set(text) self.status.configure(foreground='blue') def show_help_leave(self): self.statusText.set(self.statusStr) self.status.configure(foreground='black') widget.bind("<Enter>", lambda e: set_text(self)) widget.bind("<Leave>", lambda e: show_help_leave(self))
class EMNN(): def __init__(self, conn): conn.gui = True queue = self.queue = Queue.Queue() conn.queue = queue self.conn = conn def startgui(self): self.root = root = Tk() root.title('SIMAPSE - Simulation Maps for Ecological Niche Modelling') root.geometry('695x445+375+115') root.tk.call('encoding', 'system', 'utf-8') root.configure(bg='#d9d9d9') root.resizable(width='false', height='false') self.gui() self.root.after(100, self.periodicUpdate) root.mainloop() def gui(self): from Tkinter import Button, Entry, Frame, Label, Checkbutton, \ Scrollbar, Text, IntVar, StringVar, OptionMenu self.dir_project = '' self.folds = 0 self.func = "" self.aucfilter = IntVar() self.lightgray = '#d9d9d9' self.darkgray = '#d3d3d3' self.normaltext = ("Helvetica", -10) self.boldtext = ("Helvetica", -10, "bold") self.bigtext = ("Helvetica", -12, "bold") self.smalltext = ("Helvetica", -9) self.butData = Button(self.root) self.butData.place(in_=self.root, x=5, y=5) self.butData.configure(height=1, width=10, text="Data File", font=self.normaltext, highlightbackground=self.lightgray, command=self.dataOpen) self.butRasterFolder = Button(self.root) self.butRasterFolder.place(in_=self.root, x=5, y=35) self.butRasterFolder.configure(height=1, width=10, text="Raster Folder", font=self.normaltext, highlightbackground=self.lightgray, command=self.rasterOpen) self.butOutFolder = Button(self.root) self.butOutFolder.place(in_=self.root, x=5, y=65) self.butOutFolder.configure(height=1, width=10, text="Out Folder", font=self.normaltext, highlightbackground=self.lightgray, command=self.outOpen) self.entData = Entry(self.root) self.entData.place(in_=self.root, x=100, y=9) self.entData.configure(textvariable="file_data", font=self.normaltext, width=97, background=self.darkgray, relief="flat", highlightbackground=self.lightgray) self.entData.insert(0, '') self.entOutFolder = Entry(self.root) self.entOutFolder.place(in_=self.root, x=100, y=69) self.entOutFolder.configure(textvariable="out_dir", font=self.normaltext, width=97, background=self.darkgray, relief="flat", highlightbackground=self.lightgray) self.entOutFolder.insert(0, '') self.entRasterFolder = Entry(self.root) self.entRasterFolder.place(in_=self.root, x=100, y=39) self.entRasterFolder.configure(textvariable="dir_rasters", font=self.normaltext, width=97, background=self.darkgray, relief="flat", highlightbackground=self.lightgray) self.entRasterFolder.insert(0, '') self.activeMethod = StringVar(self.root) self.activeMethod.set("Random repetition") self.butMETHOD = OptionMenu( self.root, self.activeMethod, "Random repetition", "Cross validation", "Bootstrapping", command=lambda x: self.displayMethodFrame(x)) self.butMETHOD.place(in_=self.root, x=4, y=97, height="25", width="120") self.butMETHOD.configure(font=self.smalltext, background=self.lightgray) self.displayMethodFrame(self.activeMethod.get()) self.activeOption = StringVar(self.root) self.activeOption.set("Network structure") self.butOPTION = OptionMenu( self.root, self.activeOption, "Network structure", "Options", command=lambda x: self.displayOptionFrame(x)) self.butOPTION.place(in_=self.root, x=4, y=182, height="25", width="120") self.butOPTION.configure(font=self.smalltext, background=self.lightgray) self.displayOptionFrame(self.activeOption.get()) self.Progress_frame = Frame(self.root) self.Progress_frame.place(in_=self.root, x=5, y=423) self.Progress_frame.configure(borderwidth="2", relief='sunken', height="20", width="105", bg='white') self.Progress_bar = Label(self.Progress_frame) self.Progress_bar.place(x=0, y=0) self.Progress_bar.configure(font=self.smalltext) self.Progress_info = Label(self.root) self.Progress_info.place(x=110, y=425) self.Progress_info.configure(font=self.smalltext, bg=self.lightgray) self.frameButtons = Frame(self.root) self.frameButtons.place(in_=self.root, x=5, y=336) self.frameButtons.configure(borderwidth="2", bg=self.lightgray, relief="raise", height="84", width="260") self.butREAD = Button(self.root) self.butREAD.place(in_=self.frameButtons, x=5, y=5, width=70) self.butREAD.configure(font=self.bigtext, highlightbackground=self.lightgray, text="READ", command=self.read) self.butRUN = Button(self.root) self.butRUN.place(in_=self.frameButtons, x=80, y=5, width=70) self.butRUN.configure(font=self.bigtext, highlightbackground=self.lightgray, text="RUN", command=self.returnVar, state='disabled') self.butRESULTS = Button(self.root) self.butRESULTS.place(in_=self.frameButtons, x=155, y=5, width=80) self.butRESULTS.configure(font=self.bigtext, highlightbackground=self.lightgray, text="RESULTS", command=self.returnResults, state='disabled') self.butPROJECT = Button(self.root) self.butPROJECT.place(in_=self.frameButtons, x=5, y=45, width=70) self.butPROJECT.configure(font=self.boldtext, highlightbackground=self.lightgray, text="PROJECT", command=self.project, state='disabled') self.frameText = Frame(self.root) self.frameText.place(in_=self.root, x=270, y=100) self.frameText.configure(height=320, width=400) self.scrollbar = Scrollbar(self.root) self.textFrame = Text(self.frameText, wrap='word') self.textFrame.configure(font=self.normaltext, height="24", width="65") self.textFrame.place(x=0, y=0) self.textFrame.configure(yscrollcommand=self.scrollbar.set) self.scrollbar.configure(command=self.textFrame.yview, highlightbackground=self.lightgray) self.scrollbar.place(x=675, y=100, height=320) def displayMethodFrame(self, method): ''' Displays individual frames for the subsetting method''' from Tkinter import Button, Entry, Frame, Label if self.__dict__.has_key('frameMethodSelection'): self.frameMethodSelection.destroy() self.varupdate() c = self.conn.simargs self.frameMethodSelection = Frame(self.root) self.frameMethodSelection.place(in_=self.root, x=5, y=122) self.frameMethodSelection.configure(borderwidth="2", relief="raise", height="60", width="260", bg=self.lightgray) if method == "Random repetition": self.labRepetitions = Label(self.root) self.labRepetitions.place(in_=self.frameMethodSelection, x=2, y=10) self.labRepetitions.configure(font=self.normaltext, borderwidth="1", justify='left', anchor='e', bg=self.lightgray, text="Number of repetitions:") self.entRepetitions = Entry(self.root) self.entRepetitions.place(in_=self.frameMethodSelection, x=125, y=10) self.entRepetitions.configure(textvariable="repetitions", width="7", font=self.normaltext, highlightbackground=self.lightgray) self.entRepetitions.delete(0, 'end') self.entRepetitions.insert('end', c['repetitions']) elif method == "Cross validation": self.labRepetitions = Label(self.root) self.labRepetitions.place(in_=self.frameMethodSelection, x=2, y=10) self.labRepetitions.configure(font=self.normaltext, bg=self.lightgray, text="Number of folds:") self.entRepetitions = Entry(self.root) self.entRepetitions.place(in_=self.frameMethodSelection, x=100, y=10) self.entRepetitions.configure(textvariable="repetitions", width="7", highlightbackground=self.lightgray, font=self.normaltext) self.entRepetitions.delete(0, 'end') self.entRepetitions.insert('end', c['repetitions']) elif method == "Bootstrapping": self.labRepetition = Label(self.root) self.labRepetition.place(in_=self.frameMethodSelection, x=2, y=5) self.labRepetition.configure(borderwidth="1", text="Number of Bootstraps:", bg=self.lightgray, font=self.normaltext) self.entRepetitions = Entry(self.root) self.entRepetitions.place(in_=self.frameMethodSelection, x=125, y=5) self.entRepetitions.configure(textvariable="repetitions", width="7", highlightbackground=self.lightgray, font=self.normaltext) self.entRepetitions.delete(0, 'end') self.entRepetitions.insert('end', c['repetitions']) self.labBsize = Label(self.root) self.labBsize.place(in_=self.frameMethodSelection, x=2, y=30) self.labBsize.configure(borderwidth="1", text="Bootstraps Sample Size:", bg=self.lightgray, font=self.normaltext) self.entBsize = Entry(self.root) self.entBsize.place(in_=self.frameMethodSelection, x=125, y=30) self.entBsize.configure(textvariable="Bsize", width="7", highlightbackground=self.lightgray, font=self.normaltext) self.entBsize.delete(0, 'end') self.entBsize.insert('end', c['bsize']) def displayOptionFrame(self, option): ''' Displays individual frames for the subsetting method''' from Tkinter import Button, Entry, Frame, Label, Checkbutton if self.__dict__.has_key('frameOptionSelection'): self.frameOptionSelection.destroy() self.varupdate() c = self.conn.simargs self.frameOptionSelection = Frame(self.root) self.frameOptionSelection.place(in_=self.root, x=5, y=207) self.frameOptionSelection.configure(borderwidth="2", relief="raise", height="125", width="260", bg=self.lightgray) if option == "Network structure": self.labMaxiter = Label(self.root) self.labMaxiter.place(in_=self.frameOptionSelection, x=190, y=5) self.labMaxiter.configure(borderwidth="1", font=self.normaltext, text="Internal", bg=self.lightgray) self.labNNN = Label(self.root) self.labNNN.place(in_=self.frameOptionSelection, x=95, y=5) self.labNNN.configure(borderwidth="1", font=self.normaltext, text="Reported", bg=self.lightgray) self.labTI = Label(self.root) self.labTI.place(in_=self.frameOptionSelection, x=5, y=25) self.labTI.configure(borderwidth="1", font=self.normaltext, text="Total iterations =", bg=self.lightgray) self.entITERReport = Entry(self.root) self.entITERReport.place(in_=self.frameOptionSelection, x=88, y=25) self.entITERReport.configure(textvariable="AUCReport", width="10", font=self.normaltext, highlightbackground=self.lightgray) self.entITERReport.delete(0, 'end') self.entITERReport.insert('end', c['iterreport']) self.times = Label(self.root) self.times.place(in_=self.frameOptionSelection, x=160, y=25) self.times.configure(text="x", font=self.normaltext, bg=self.lightgray) self.entITERInter = Entry(self.root) self.entITERInter.place(in_=self.frameOptionSelection, x=180, y=25) self.entITERInter.configure(textvariable="maxiter", width="10", font=self.normaltext, highlightbackground=self.lightgray) self.entITERInter.delete(0, 'end') self.entITERInter.insert('end', c['iterinter']) self.labEta = Label(self.root) self.labEta.place(in_=self.frameOptionSelection, x=5, y=55) self.labEta.configure(borderwidth="1", font=self.normaltext, text="Learning Rate", bg=self.lightgray) self.butHINT = Button(self.root) self.butHINT.place(in_=self.frameOptionSelection, x=65, y=75, height=23, width=20) self.butHINT.configure(font=self.smalltext, text="H", command=self.hint, state='disabled', highlightbackground=self.lightgray) self.labMomentum = Label(self.root) self.labMomentum.place(in_=self.frameOptionSelection, x=88, y=55) self.labMomentum.configure(borderwidth="1", font=self.normaltext, text="Momentum", bg=self.lightgray) self.entLRATE = Entry(self.root) self.entLRATE.place(in_=self.frameOptionSelection, x=5, y=75) self.entLRATE.configure(textvariable="eta", width="8", font=self.normaltext, highlightbackground=self.lightgray) self.entLRATE.delete(0, 'end') self.entLRATE.insert('end', c['lrate']) self.entMomentum = Entry(self.root) self.entMomentum.place(in_=self.frameOptionSelection, x=90, y=75) self.entMomentum.configure(textvariable="momentum", width="8", font=self.normaltext, highlightbackground=self.lightgray) self.entMomentum.delete(0, 'end') self.entMomentum.insert('end', c['momentum']) self.labNNS = Label(self.root) self.labNNS.place(in_=self.frameOptionSelection, x=165, y=55) self.labNNS.configure(borderwidth="1", font=self.normaltext, text="Hidden Layers", bg=self.lightgray) self.entNNShape = Entry(self.root) self.entNNShape.place(in_=self.frameOptionSelection, x=160, y=75) self.entNNShape.configure(textvariable="HiddenLyr", width="14", font=self.normaltext, highlightbackground=self.lightgray) self.entNNShape.delete(0, 'end') self.entNNShape.insert('end', c['hiddenlyrs']) elif option == "Options": self.labPercentage = Label(self.root) self.labPercentage.place(in_=self.frameOptionSelection, x=2, y=5) self.labPercentage.configure(borderwidth="1", text="Test %:", font=self.normaltext, bg=self.lightgray) self.entPercentage = Entry(self.root) self.entPercentage.place(in_=self.frameOptionSelection, x=45, y=5, width=30) self.entPercentage.configure(textvariable="Percentage", font=self.normaltext, highlightbackground=self.lightgray) self.entPercentage.delete(0, 'end') self.entPercentage.insert('end', c['percentage']) self.labAPRatio = Label(self.root) self.labAPRatio.place(in_=self.frameOptionSelection, x=80, y=5) self.labAPRatio.configure(borderwidth="1", text="Pseudoabsences/Presences:", font=self.normaltext, bg=self.lightgray) self.entAPRatio = Entry(self.root) self.entAPRatio.place(in_=self.frameOptionSelection, x=220, y=5) self.entAPRatio.configure(textvariable="apratio", width="4", font=self.normaltext, highlightbackground=self.lightgray) self.entAPRatio.delete(0, 'end') self.entAPRatio.insert('end', c['apratio']) self.labBurnin = Label(self.root) self.labBurnin.place(in_=self.frameOptionSelection, x=2, y=30) self.labBurnin.configure(borderwidth="1", text="Burn-in iterations:", font=self.normaltext, bg=self.lightgray) self.entBurnin = Entry(self.root) self.entBurnin.place(in_=self.frameOptionSelection, x=90, y=30) self.entBurnin.configure(textvariable="burnin", width="8", font=self.normaltext, highlightbackground=self.lightgray) self.entBurnin.delete(0, 'end') self.entBurnin.insert('end', c['burnin']) self.chkAucFilter = Checkbutton(self.root) self.chkAucFilter.place(in_=self.frameOptionSelection, x=2, y=60) self.chkAucFilter.configure(font=self.normaltext, text="Filter with AUC threshold", variable=self.aucfilter, bg=self.lightgray, command=self.aucstate) self.labAUCTrain = Label(self.root) self.labAUCTrain.place(in_=self.frameOptionSelection, x=5, y=85) self.labAUCTrain.configure(borderwidth="1", font=self.normaltext, text="training data", bg=self.lightgray) self.entAUCTrain = Entry(self.root) self.entAUCTrain.place(in_=self.frameOptionSelection, x=70, y=85) self.entAUCTrain.configure(textvariable="valueAuc", width="8", font=self.normaltext, highlightbackground=self.lightgray) self.entAUCTrain.delete(0, 'end') self.entAUCTrain.insert('end', c['auctrain']) self.labAUCTest = Label(self.root) self.labAUCTest.place(in_=self.frameOptionSelection, x=130, y=85) self.labAUCTest.configure(borderwidth="1", font=self.normaltext, text="testing data", bg=self.lightgray) self.entAUCTest = Entry(self.root) self.entAUCTest.place(in_=self.frameOptionSelection, x=195, y=85) self.entAUCTest.configure(textvariable="valueAucTest", width="8", font=self.normaltext, highlightbackground=self.lightgray) self.entAUCTest.delete(0, 'end') self.entAUCTest.insert('end', c['auctest']) self.aucstate() def varupdate(self): extract = self.extract c = self.conn.simargs c['file_data'] = extract('entData', c['file_data']) c['dir_rasters'] = extract('entRasterFolder', c['dir_rasters']) c['out_dir'] = extract('entOutFolder', c['out_dir']) c['method'] = extract('activeMethod', c['method']) c['iterreport'] = int(extract('entITERReport', c['iterreport'])) c['iterinter'] = int(extract('entITERInter', c['iterinter'])) c['lrate'] = float(extract('entLRATE', c['lrate'])) c['momentum'] = float(extract('entMomentum', c['momentum'])) c['hiddenlyrs'] = extract('entNNShape', c['hiddenlyrs']) c['apratio'] = float(extract('entAPRatio', c['apratio'])) c['percentage'] = int(extract('entPercentage', c['percentage'])) c['burnin'] = int(extract('entBurnin', c['burnin'])) c['auctrain'] = float(extract('entAUCTrain', c['auctrain'])) c['auctest'] = float(extract('entAUCTest', c['auctest'])) c['repetitions'] = int(extract('entRepetitions', c['repetitions'])) c['bsize'] = int(extract('entBsize', c['bsize'])) c['aucfilter'] = bool(extract('aucfilter', int(c['aucfilter']))) def extract(self, test, default): if test in self.__dict__.keys(): value = self.__dict__[test].get() else: value = default return value def read(self): import time self.varupdate() self.conn.processor(self.conn.manager.read_all, 'read') def returnVar(self): # Updates variables self.varupdate() self.conn.processor(self.conn.manager.model, 'run') def returnResults(self): self.varupdate() self.conn.processor(self.conn.manager.results, 'results') def project(self): self.varupdate() project_dir = askdirectory() self.conn.simargs['project_dir'] = project_dir self.conn.processor(self.conn.manager.project, 'project') def hint(self): self.varupdate() self.conn.processor(self.conn.manager.hint, 'hint') def dataOpen(self): self.entData.delete(0, 'end') file_data = askopenfilename(filetypes=[("text files", "*.txt"), ("allfiles", "*")]) self.entData.insert('end', file_data) def rasterOpen(self): self.entRasterFolder.delete(0, 'end') dir_rasters = askdirectory() self.entRasterFolder.insert('end', dir_rasters) def outOpen(self): self.entOutFolder.delete(0, 'end') out_dir = askdirectory() self.entOutFolder.insert('end', out_dir) def update_text(self, string_txt): txt = string_txt + " \n" self.textFrame.insert('end', txt) self.textFrame.yview('end') def processGraph(self, graph_object): '''Just a wraper to call the graphics creation object''' graph_object() def periodicUpdate(self): """Executes periodic checks to GUI: - if there are new messages and displays when true""" try: while 1: code, args, kwargs = self.queue.get_nowait() if code == Connector.CODE_TEXT: self.update_text(*args) elif code == Connector.CODE_PROGRESS: self.progress(*args, **kwargs) elif code == Connector.CODE_MODIFY_BUTTON: self.modify_but(*args) elif code == Connector.CODE_SHOWRESULTS: self.showResults(*args) elif code == Connector.CODE_GRAPHS: self.processGraph(args) else: self.update_text('Unknown message...') self.queue.task_done() self.root.update() except Queue.Empty: pass self.root.after(100, self.periodicUpdate) def modify_but(self, state, buttonlist): if buttonlist == 'all': buttonlist = [ 'READ', 'RUN', 'RESULTS', 'PROJECT', 'HINT', 'METHOD', 'OPTION' ] for button in buttonlist: but = "self.but%s.configure(state=\'%s\')" % (button, state) exec(but) def abundance(self): self.entAUCTrain.configure(state='disabled') self.entAUCTest.configure(state='disabled') def aucstate(self): if self.aucfilter.get(): state = 'normal' else: state = 'disabled' self.entAUCTrain.configure(state=state) self.entAUCTest.configure(state=state) def progress(self, value, maxvalue, **kwargs): '''Shows the progress bar in GUI args are: Value - Value of the current progress MaxValue - Value where progress terminates kwargs are color - Color for the progess bar msg - message to display''' color = 'blue' if 'color' in kwargs: color = kwargs['color'] percent = (value * 100) / maxvalue self.Progress_bar.configure(font=self.smalltext, foreground="white", background=color) #"#0000ff" if percent <> 100: width = int((percent / 100.000) * 20) text = '%s%%' % percent self.Progress_bar.configure(text=text, width=width) if 'msg' in kwargs: self.Progress_info.configure(text=kwargs['msg']) elif percent == 100: self.Progress_bar.configure(text="", width=0, relief="flat", background="#ece9d8") self.Progress_info.configure(text="") def showResults(self, figures): from Tkinter import Button figures = [self.entOutFolder.get() + "/" + x for x in figures] ResultsWindow = mytoplevel(self.root, figures, self) ResultsWindow.title('Results') butRW = Button(ResultsWindow, text='CLOSE', command=ResultsWindow.destroy) butRW.pack() def update_queue(self): try: while self.queue.qsize(): msg = '%s\n' % self.queue.get(0) self.textFrame.insert('end', msg) self.textFrame.yview('end') except Queue.Empty: pass
class Interface: def __init__(self, master): serverPort = 12000 clientAddress = '255.255.255.255' serverSocket = socket(AF_INET, SOCK_DGRAM) serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) serverSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) serverSocket.bind(('', serverPort)) self.master = master master.title(" DDOS ATTACK - HTTP FLOOD") self.IP = None self.message = "TYPE IP TO BE ATTACKED :" self.label_text = StringVar() self.label_text.set(self.message) self.label = Label(master, textvariable=self.label_text,font=(None, 13),background ="black",fg ="white") vcmd = master.register(self.validate) # we have to wrap the command self.entry = Entry(master, validate="key", validatecommand=(vcmd, '%P')) self.entry.configure(insertwidth=2,highlightbackground= "black") validate_ip_args = partial(self.validate_IP, serverSocket, clientAddress, serverPort) self.attack_button = Button(master, text="Start Attack", command=validate_ip_args, height = 2, width = 20, font=(None, 13), fg ="white", background ="black",highlightbackground= "black") stop_attack_args = partial(self.stop_attack, serverSocket, clientAddress, serverPort) self.stop_button = Button(master, text="Stop Attack", command=stop_attack_args, state=DISABLED, height = 2, width = 20, font=(None, 13), fg ="white", background = "black",highlightbackground= "black") self.label.grid(row=0, column=0, columnspan=2, sticky=W+E, pady=20) self.entry.grid(row=1, column=0, columnspan=2, sticky=W+E, pady= 8) self.attack_button.grid(row=2, column=0, padx= 5,pady= 8) self.stop_button.grid(row=2, column=1, padx= 5, pady= 8) def validate(self, new_text): if not new_text: # the field is being cleablack self.IP = None return True else: IP = new_text self.IP=IP return True def validate_IP(self, serverSocket, clientAddress, serverPort): if (is_valid_ipv4(str(self.IP))): self.message = "VALID IP, CONTACTING SLAVES!" serverSocket.sendto("S/"+self.IP, (clientAddress, serverPort)) self.attack_button.configure(state=DISABLED) self.stop_button.configure(state=NORMAL) else: self.message = "INVALID IP, TRY AGAIN" if self.IP is None: self.message = "TYPE IP TO BE ATTACKED :" self.label_text.set(self.message) def stop_attack(self, serverSocket, clientAddress, serverPort): self.entry.delete(0, END) self.IP = None serverSocket.sendto("B/", (clientAddress, serverPort)) self.message = "TYPE IP TO BE ATTACKED :" self.label_text.set(self.message) self.attack_button.configure(state=NORMAL) self.stop_button.configure(state=DISABLED)
del RSMT[:] global GMST del GMST[:] global GSMT del GSMT[:] RMSTtext.set("-----") RSMTtext.set("-----") GMSTtext.set("-----") GSMTtext.set("-----") canvas.delete("all") master = Canvas(tk) but_frame = Frame(master) button1 = Button(but_frame, text="RMST", command=computeRMST) button1.configure(width=9, activebackground="blue", relief=RAISED) button1.pack(side=TOP) var = StringVar() var.set("Distance:") Label(but_frame, textvariable=var).pack() RMSTtext = StringVar() label1 = Label(but_frame, textvariable=RMSTtext) label1.pack() Label(but_frame, textvariable="").pack() button2 = Button(but_frame, text="RSMT", command=computeRSMT) button2.configure(width=9, activebackground="blue", relief=RAISED) button2.pack(side=TOP) Label(but_frame, textvariable=var).pack() RSMTtext = StringVar() label2 = Label(but_frame, textvariable=RSMTtext) label2.pack()
class App(Tk): def __init__(self): Tk.__init__(self) self.label = Label(self, text="Stopper.") self.label.pack() self.label2 = Label(self, text="") self.label2.pack() self.play_button = Button(self, text="Play", command=self.play) self.play_button.pack(side="left", padx=2, pady=2) self.stop_button = Button(self, text="Stop", command=self.stop) self.stop_button.pack(side="left", padx=2, pady=2) self._thread, self._pause, self._stop = None, False, True def action(self): while True: # if self._stop: # print('on ferme le port') # ser.close() # break while self._pause: self.label["text"] = "Pause... " sleep(0.1) if not ser.isOpen(): ser.open() ser.reset_output_buffer() print('On attend que la balance envoie le poids') #Modif de read_until de serialutil.py du package pyserial expected = ('\r\n') lenterm = len(expected) line = bytearray() timeout = 1 while True: c = ser.read(1) if self._stop: break if c: line += c if line[-lenterm:] == expected: break #else: # break if self._stop: print('on ferme le port') ser.close() break response = bytes(line) #response = ser.read_until('\r\n') response = response.strip().split(' ') ser.reset_output_buffer() poids = response print('m :' + poids[0] + '-unité :' + poids[1]) self.label2["text"] = 'm :' + poids[0] + '-unité :' + poids[1] # lenterm = len(expected) # line = bytearray() # timeout = Timeout(self._timeout) # while True: # c = self.read(1) # if c: # line += c # if line[-lenterm:] == expected: # break # if size is not None and len(line) >= size: # break # else: # break # if timeout.expired(): # break # return bytes(line) # for i in range(1000): # if self._stop: # break # while self._pause: # self.label["text"] = "Pause... (count: {})".format(i) # sleep(0.1) # self.label["text"] = "Playing... (count: {})".format(i) # sleep(0.1) # self.label["text"] = "Stopped." def play(self): if self._thread is None: self._stop = False self._thread = Thread(target=self.action) self._thread.start() self._pause = False self.play_button.configure(text="Pause", command=self.pause) self.label["text"] = "En attente de poids..." def pause(self): self._pause = True self.play_button.configure(text="Play", command=self.play) def stop(self): if self._thread is not None: #ser.close() self._thread, self._pause, self._stop = None, False, True self.play_button.configure(text="Play", command=self.play) self.label["text"] = "Stopper" self.label2["text"] = ""
class InterfaceParametres(Frame): """!Interface principale de l'outil de projection des modes expérimentaux sur les modes numériques permet la sélection et de calcul des modes en air et écoulement""" def __init__(self, root, objects, macro, mess, ): """!Constructeur """ Frame.__init__( self, root, relief='sunken', borderwidth=1) # Première frame self.mess = mess self.root = root self.logiciel = StringVar() self.salome_port = IntVar() self.machine_locale_name = self.get_machine_name() self.type_visu = StringVar() self.user = StringVar() self.protocole = StringVar() self.machine_name = self.machine_locale_name self.salome_widgets = [] self.distant_widgets = [] self.protocole_ok = None self.logiciel_courbes = None self.macro = macro self.objects = objects self.param_visu = self self.is_resu1 = IntVar() self.is_resu2 = IntVar() self.use_nume_mass = IntVar() self.proj_champ_meth = StringVar() self.proj_svd_param = StringVar() self.calculs = CalcEssaiExpansion(macro, mess, objects) self.type_resu_exp = StringVar() self.term = [] self.mac_windows = [] self.afreq = None self.anum = None self.resu_num = None # base d'expansion (instance de ModeMeca) self.resu_exp = None # donnees exp (instance de ModeMeca ou de DynaHarmo) self.interface_param() def setup(self): """!Appelée par le gestionnaire de tab lors de l'affichage""" mdo = self.objects mdo.recup_objects() self.menu_resu1.update( mdo.get_resultats_name(), self.var_resu1, self.visu1_changed) self.menu_resu2.update( mdo.get_resultats_name(), self.var_resu2, self.visu2_changed) pass def teardown(self): """!Appelée par le gestionnaire de tab lors du masquage (passage à un autre tab)""" return def _observabilite_changed(self): nom_resu = self.nom_obs_resu.get() if nom_resu.strip() != 'Choisir': resu = self.objects.get_resultats(nom_resu) nom_modele = self.nom_obs_modele.get() if nom_modele.strip() != 'Choisir': modele = self.objects.get_model(nom_modele) self.obs_noeuds.set_resultat(resu.modele) self.obs_mailles.set_resultat(resu.modele) def interface_param(self): """!Fonction principale de création de l'interface""" self.columnconfigure(0, weight=1) self.rowconfigure(2, weight=1) l = Label(self, text=u" CALC_ESSAI : Paramètres de visualisation", padx=270, pady=5, font=("Helvetica", "16")) l.grid(row=0, sticky='nsew') select_box = self.interface_parametres(self) select_box.grid(row=1, sticky='nsew') visu_param = self.interface_visu(self) visu_param.grid(row=3, sticky='nsew') self.main = self def interface_selection(self, root): self.var_resu_num = StringVar() self.menu_resu_num = MyMenu( f, options=self.objects.get_mode_meca_name(), var=self.var_resu_num, cmd=self.num_changed) self.var_resu_exp = StringVar() self.menu_resu_exp = MyMenu( f, options=self.objects.get_resultats_name(), var=self.var_resu_exp, cmd=self.exp_changed) return f def interface_visu(self, root): """!Création de l'interface de visualisation permet de choisir d'afficher les matrices MAC ou les modes avec gmsh gère la compatibilité des choix de l'utilisateur (les calculs de MAC ne sont pas tous possibles) """ mdo = self.objects f = Frame(root, relief='sunken', borderwidth=1) Label(f, text=" ").grid( row=0, column=1, columnspan=3, sticky='w' + 'e') Label(f, text=" ").grid( row=2, column=1, columnspan=3, sticky='w' + 'e') f.columnconfigure(0, weight=3) f.columnconfigure(1, weight=3) f1 = Frame(f) f1.grid(row=1, column=0, sticky='ew') f1.columnconfigure(1, weight=4) f1.columnconfigure(2, weight=4) bir1 = Checkbutton(f1, variable=self.is_resu1, command=self.cb_changed) bir1.grid(row=0, column=0, sticky='e', padx=20) bir2 = Checkbutton(f1, variable=self.is_resu2, command=self.cb_changed) bir2.grid(row=1, column=0, sticky='e', padx=20) Label(f1, text=u"Résultat 1").grid(row=0, column=1, sticky='w') self.var_resu1 = StringVar() self.menu_resu1 = MyMenu(f1, options=mdo.get_resultats_name(), var=self.var_resu1, cmd=self.visu1_changed) self.menu_resu1.grid(row=0, column=2, sticky='ew', padx=20) Label(f1, text=u"Résultat 2").grid(row=1, column=1, sticky='w') self.var_resu2 = StringVar() self.menu_resu2 = MyMenu(f1, options=mdo.get_resultats_name(), var=self.var_resu2, cmd=self.visu2_changed) self.menu_resu2.grid(row=1, column=2, sticky='ew', padx=20) f2 = Frame(f) f2.grid(row=1, column=1) self.mac_button = Button( f2, text=" MAC ", command=self.view_macs, state='disabled') self.mac_button.grid(row=1, column=2, sticky='ew') self.phi_button = Button( f2, text=u"Déformées", command=self.view_modes, state='disabled') self.phi_button.grid(row=2, column=2, sticky='ew') self.frf_button = Button(f2, text=" FRF ", command=self.view_frf) self.frf_button.grid(row=3, column=2, sticky='ew') self.frf_button = Button( f1, text=" Observation ", command=self.view_obs_1) self.frf_button.grid(row=0, column=3, sticky='ew') self.frf_button = Button( f1, text=" Observation ", command=self.view_obs_2) self.frf_button.grid(row=1, column=3, sticky='ew') return f def visu1_changed(self): """ desactivation du bouton concernant le visu1""" self.is_resu1.set(1) self.check_state() def visu2_changed(self): """ desactivation du bouton concernant le visu1""" self.is_resu2.set(1) self.check_state() def cb_changed(self): self.check_state() def check_state(self): """Verifie la compatibilite des bases pour le MAC et l'existence des donnees necessaires pour la visu des deformees et des FRF""" mdo = self.objects # Y a-t-il un MAC a calculer ? if (self.is_resu1.get() and not self.is_resu2.get()) or (self.is_resu2.get() and not self.is_resu1.get()): self.mac_button.configure(state='normal') elif self.is_resu1.get() and self.is_resu2.get(): resu1 = mdo.get_resultats(self.var_resu1.get()) resu2 = mdo.get_resultats(self.var_resu2.get()) if resu1.modele_name.strip() and resu1.modele_name == resu2.modele_name: self.mac_button.configure(state='normal') else: self.mac_button.configure(state='disabled') else: self.mac_button.configure(state='disabled') # Y a-t-il des deformees a representer ? if self.is_resu1.get() or self.is_resu2.get(): self.phi_button.configure(state='normal') else: self.phi_button.configure(state='disabled') def view_frf(self): """lancement d'une fenetre de visualisation des frf""" mdo = self.objects resu1 = None resu2 = None if self.is_resu1.get(): resu1 = mdo.get_resultats(self.var_resu1.get()) if self.is_resu2.get(): resu2 = mdo.get_resultats(self.var_resu2.get()) fenetre = DispFRFDialogue( self.mess, self.objects, self.param_visu, resu1, resu2) def view_obs_1(self): if self.is_resu1.get(): self.view_obs(self.var_resu1) else: self.mess.disp_mess(u"Choisir un résultat") return self.setup() def view_obs_2(self): if self.is_resu2.get(): self.view_obs(self.var_resu2) else: self.mess.disp_mess(u"Choisir un résultat") return self.setup() def view_obs(self, var_resu): """lancement d'une fenetre d'observation""" mdo = self.objects resu = mdo.get_resultats(var_resu.get()) fenetre = DispObs(self, self.mess, self.objects, resu) fenetre.set_resu(resu.nom) def view_modes(self, *args): """!Visualisation des modes par GMSH ou Salome""" mdo = self.objects l_resultat = [] l_modele = [] if self.is_resu1.get(): resu1 = mdo.get_resultats(self.var_resu1.get()) l_resultat.append(resu1.obj) if self.is_resu2.get(): resu2 = mdo.get_resultats(self.var_resu2.get()) l_resultat.append(resu2.obj) term = self.param_visu.visu_resu(resultat=l_resultat) self.term.append(term) return def view_macs(self): """!Creation d'une nouvelle fenetre de visu MAC""" mdo = self.objects resu1 = None resu2 = None if self.is_resu1.get() and self.is_resu2.get(): resu1 = mdo.get_resultats(self.var_resu1.get()) resu2 = mdo.get_resultats(self.var_resu2.get()) elif self.is_resu1.get(): resu1 = mdo.get_resultats(self.var_resu1.get()) resu2 = mdo.get_resultats(self.var_resu1.get()) elif self.is_resu2.get(): resu1 = mdo.get_resultats(self.var_resu2.get()) resu2 = mdo.get_resultats(self.var_resu2.get()) mac = self.calculs.calc_mac_mode(resu1, resu2, norme=None) self.param_visu.visu_mac(mac, resu1, resu2) def activate_salome_widgets(self): StateActivate(self.salome_widgets) def desactivate_salome_widgets(self): StateDesactivate(self.salome_widgets) def interface_parametres(self, root): """!Création de l'interface de choix des logiciels de visualisation On permet à l'utilisateur de choisir Gmsh/Xmgrace ou Salome """ main_param = Frame(root) main_param.rowconfigure(1, weight=1) main_param.columnconfigure(0, weight=1) f = Frame(main_param, relief='sunken', borderwidth=1) # les parametres vont dans 'f' logiciels_frame = Frame(f, borderwidth=4) label_parametres_salome = Label( logiciels_frame, text=u"Paramètres Salome") label_parametres_salome.grid(row=2, column=1, columnspan=2) self.salome_widgets.append(label_parametres_salome) label_port = Label(logiciels_frame, text=u"Port") label_port.grid(row=3, column=1, sticky='w') self.salome_widgets.append(label_port) entry_salome_port = Entry( logiciels_frame, textvariable=self.salome_port) entry_salome_port.grid(row=3, column=2) self.salome_widgets.append(entry_salome_port) self.salome_port.set(self.get_runnig_salome_port()) self.ce_salome = None liste_etudes = StudyList( logiciels_frame, self, u"choix de l'étude Salomé") liste_etudes.grid(row=4, column=2, sticky='w') self.salome_widgets.append(liste_etudes.liste) self.salome_widgets.append(liste_etudes.titre) liste_etudes.actualiser() label_choix_logiciel = Label( logiciels_frame, text=u"Choix du logiciel") label_choix_logiciel.grid(row=0, column=0, columnspan=3) button_gmsh = Radiobutton( logiciels_frame, text=u"Gmsh/Xmgrace", value="Gmsh/Xmgrace", variable=self.logiciel, command=self.desactivate_salome_widgets) button_gmsh.grid(row=1, column=0, sticky='w') button_salome = Radiobutton( logiciels_frame, text=u"Salomé", value="Salome", variable=self.logiciel, command=self.activate_salome_widgets) button_salome.grid(row=2, column=0, rowspan=3, sticky='w') self.logiciel.set("Salome") logiciels_frame.grid(row=1) f.grid(row=1, sticky='w' + 'e' + 's' + 'n') return main_param def get_user(self): import getpass user = getpass.getuser() return user def get_machine_name(self): """! Recupere le nom de la machine distante pour les parametres corba""" # on retourne le nom de la machine locale # XXX on ne peut pas utiliser un salome distant, # il faudrait un utilisateur et un chemin import socket machine_name = socket.gethostname() return machine_name def is_salome_launched(self): """! Determine si Salome est lance""" ok = False ret = os.system("ps auxw | grep -v grep | grep omniNames > /dev/null") if ret != 256: # Salome est lance ok = True return ok def get_runnig_salome_port(self): """! Recupere le port CORBA sur lequel est lance Salome pour les parametres corba""" salome_port = 2810 if self.is_salome_launched(): try: cmd = "ps auxw | grep -v grep | grep omniNames" p = Popen([cmd], shell=True, stdout=PIPE) data = p.communicate()[0] # On recupere la derniere ligne de ps pour avoir le dernier # numero de port l_data = data.split("\n") last_line = l_data[-2] omniNames_params = last_line.split(" ") idx = omniNames_params.index("-start") + 1 salome_port = int(omniNames_params[idx]) except: msg = u"Problème lors de la détermination du port Salome.\n" msg += u"Veuillez déterminer manuellement le port de Salome, en tapant ceci dans l'interpréteur python embarqué de Salome:\n" msg += u"import NSparam\n" msg += u"NSparam.getNSparams()" self.mess.disp_mess(msg) return salome_port def save_parameters(self, do_check_protocole=True): """! Sauvegarde les parametres dans une classe parente pour qu'ils soient communs a tous les onglets """ self.machine_name = self.machine_locale_name def get_logiciel(self): self.save_parameters() if self.logiciel.get() == "Gmsh/Xmgrace": return CalcEssaiGmsh(self.mess) else: if self.ce_salome: return self.ce_salome else: return CalcEssaiSalome( self.mess, self.machine_name, self.salome_port.get(), self.user.get(), self.protocole.get(), self.protocole_ok, self) pass def get_logiciel_courbes(self): # Les courbes sont transferees par CORBA # => Pas besoin de verifier le protocole rcp/scp self.save_parameters(do_check_protocole=False) if self.logiciel.get() == "Gmsh/Xmgrace": return CalcEssaiXmgrace() else: if self.ce_salome_courbes: return self.ce_salome_courbes else: return CalcEssaiSalomeCourbes(self.mess, self.machine_name, self.salome_port.get(), self) pass def visu_studylist(self): self.ce_salome = CalcEssaiSalome( self.mess, self.machine_name, self.salome_port.get(), self.user.get(), self.protocole.get(), self.protocole_ok, self) self.ce_salome_courbes = CalcEssaiSalomeCourbes( self.mess, self.machine_name, self.salome_port.get(), self) studylist = self.ce_salome.studylist() return studylist def set_study(self, study): self.ce_salome.study_name = study self.ce_salome_courbes.study_name = study self.mess.disp_mess( u"Les courbes et vues seront affichées dans l'étude Salomé " + study) # fonction proxy vers le bon logiciel def visu_resu(self, resultat, nume_mode=None): logiciel = self.get_logiciel() self.param_visu.type_visu.set('deformee') term = logiciel.visu_resu(resultat, nume_mode) return term def visu_mac(self, mac, resu1, resu2): logiciel = self.get_logiciel() term = logiciel.visu_mac(mac, resu1, resu2) return term def visu_courbe( self, l_x, ll_y, couleur=None, titre='Courbe', l_legende=None, legende_x="Abscisses", legende_y="Ordonnées", unite_x="ua", unite_y="ua"): self.logiciel_courbes = self.get_logiciel_courbes() self.logiciel_courbes.affiche(l_x, ll_y, couleur, titre, l_legende, legende_x, legende_y, unite_x, unite_y) pass def quit(self): for term in self.term: if term is not None: term.Fermer()
def draw_board(root): """ Create the graphical user interface. """ # provide the title that will be shown in the header root.title("Mastermind") # Indicate which variables of the program will be altered # ! In order to manipulate variables that are part of the program # ! but exist outside of the function, you need to indicate that you want # ! to use and alter these variables by declaring them as "global" global canvas, ovals, matching_position_label, correct_color_label # canvas will be the main board used for mastermind # ! to create a canvas, the constructor is called # ! (i.e. name of the class and required parameters) canvas = Canvas(root, bg="white", height=MAX_NUMBER_OF_MOVES*40+170, width=NUMBER_OF_CIRCLES*50+100) # Draw the empty circles representing the guesses ovals = MasterMindAsked.create_empty_circles(canvas, NUMBER_OF_CIRCLES, MAX_NUMBER_OF_MOVES) # Draw a line to separate the circles form the buttons canvas.create_line(NUMBER_OF_CIRCLES*50, 10, NUMBER_OF_CIRCLES*50, 400, width=3, fill="black") # Draw the color buttons that will be used throughout the game # ! Every available color (listed here as strings in the global variable # ! ALL_COLORS) is represented in the GUI by a button # ! when the user clicks the button the function color(color_name) # ! is called for i in range(len(ALL_COLORS)): canvas.create_window(NUMBER_OF_CIRCLES*50+10, 20+i*45, anchor=NW, window=Button(canvas, command=lambda color_name=ALL_COLORS[i]: color(color_name), width=5, text=ALL_COLORS[i])) # Draw the result labels # ! matching_position_label and correct_color_label can be used later on # ! to show the user the number of correct positions and colors # ! (e.g. matching_position_label["text"] = "2") canvas.create_window(50, MAX_NUMBER_OF_MOVES*40+30, anchor=NW, window=Label(canvas, text="Correct position: ")) matching_position_label = Label(canvas) canvas.create_window(200, MAX_NUMBER_OF_MOVES*40+30, anchor=NW, window=matching_position_label) canvas.create_window(50, MAX_NUMBER_OF_MOVES*40+60, anchor=NW, window=Label(canvas, text="Correct color: ")) correct_color_label = Label(canvas) canvas.create_window(200, MAX_NUMBER_OF_MOVES*40+60, anchor=NW, window=correct_color_label) # Draw the submit button # ! when the user clicks the button, # ! the function check_combination is called submit_button = Button(canvas, text="Check", command=check_combination) submit_button.configure(width=10, relief=FLAT) canvas.create_window(50, MAX_NUMBER_OF_MOVES*40+90, anchor=NW, window=submit_button) # Draw the quit button quit_button = Button(canvas, text="Quit", command=root.destroy) quit_button.configure(width=5, relief=FLAT) canvas.create_window(200, MAX_NUMBER_OF_MOVES*40+130, anchor=NW, window=quit_button) # draw the canvas canvas.pack()