示例#1
0
    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()
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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()
示例#6
0
文件: tktabs.py 项目: 4383/WebForge
    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
示例#10
0
 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 
示例#14
0
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)
示例#15
0
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(['...'])
示例#16
0
文件: fridge.py 项目: zemlanin/fridge
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"
示例#18
0
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()
示例#20
0
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()
示例#21
0
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)
示例#22
0
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()
示例#24
0
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 ***")
示例#25
0
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)
示例#26
0
文件: widgets.py 项目: Bovril/pracmln
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()
示例#28
0
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())
示例#29
0
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')
示例#30
0
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)
示例#32
0
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()
示例#33
0
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)
示例#34
0
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"
示例#35
0
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])
示例#36
0
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
示例#37
0
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()
示例#39
0
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
示例#40
0
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
示例#41
0
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))
示例#42
0
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)
示例#45
0
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
示例#46
0
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)
示例#47
0
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))
示例#48
0
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"] = ""
示例#49
0
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
示例#50
0
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()
示例#51
0
    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')
示例#53
0
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()
示例#54
0
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))
示例#55
0
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
示例#56
0
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)
示例#57
0
    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()
示例#58
0
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"] = ""
示例#59
0
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()