Exemple #1
1
class ComboBox(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()
        self.speed = 1.0

    def initUI(self):
        self.parent.title("Combobox")
        self.pack(fill = BOTH, expand=True)
        frame = Frame(self)
        frame.pack(fill=X)
        
        field = Label(frame, text = "Typing Speed:", width = 15)
        field.pack(side = LEFT, padx = 5, pady = 5)
        
        self.box_value = StringVar()
        self.box = Combobox(frame, textvariable=self.box_value, width = 5)
        self.box['values'] = ('1x', '2x', '5x', '10x' )
        self.box.current(0)
        self.box.pack(fill = X, padx =5, expand = True)
        self.box.bind("<<ComboboxSelected>>", self.value)
        

    def value(self,event):
        self.speed =  float(self.box.get()[:-1])
class FrOptions(LabelFrame):
    def __init__(self, title, txt, dicoprofils):
        LabelFrame.__init__(self, text=title)
        self.listing_profils(dicoprofils)

        # Dropdowm list of available profiles
        self.ddprofils = Combobox(self,
                                  values = dicoprofils.keys(),
                                  width = 35,
                                  height = len(dicoprofils.keys())*20)
        self.ddprofils.current(1)   # set the dropdown list to first element

        # export options
        caz_doc = Checkbutton(self, text = u'HTML / Word (.doc/.docx)',
                                    variable = self.master.opt_doc)
        caz_xls = Checkbutton(self, text = u'Excel 2003 (.xls)',
                                    variable = self.master.opt_xls)
        caz_xml = Checkbutton(self, text = u'XML (ISO 19139)',
                                    variable = self.master.opt_xml)

        # Basic buttons
        self.action = StringVar()
        self.action.set(txt.get('gui_choprofil'))
        self.val = Button(self, textvariable = self.action,
                                relief= 'raised',
                                command = self.bell)
        can = Button(self, text = 'Cancel (quit)',
                                relief= 'groove',
                                command = self.master.destroy)
        # Widgets placement
        self.ddprofils.bind('<<ComboboxSelected>>', self.alter_val)
        self.ddprofils.grid(row = 1, column = 0, columnspan = 3, sticky = N+S+W+E, padx = 2, pady = 5)
        caz_doc.grid(row = 2, column = 0, sticky = N+S+W, padx = 2, pady = 1)
        caz_xls.grid(row = 3, column = 0, sticky = N+S+W, padx = 2, pady = 1)
        caz_xml.grid(row = 4, column = 0, sticky = N+S+W, padx = 2, pady = 1)
        self.val.grid(row = 5, column = 0, columnspan = 2,
                            sticky = N+S+W+E, padx = 2, pady = 5)
        can.grid(row = 5, column = 2, sticky = N+S+W+E, padx = 2, pady = 5)

    def listing_profils(self, dictprofils):
        u""" List existing profilesin folder \data\profils """
        for i in glob(r'../data/profils/*.xml'):
            dictprofils[path.splitext(path.basename(i))[0]] = i
##        if new > 0:
##            listing_lang()
##            load_textes(deroul_lang.get())
##            deroul_profils.setlist(sorted(dico_profils.keys()))
##            fen_choix.update()
        # End of function
        return dictprofils

    def alter_val(self, inutile):
        u""" Switch the label of the validation button contained in basics class
        in the case that a new profile is going to be created"""
        if self.ddprofils.get() == self.master.blabla.get('gui_nouvprofil'):
            self.action.set(self.master.blabla.get('gui_crprofil'))
        else:
            self.action.set(self.master.blabla.get('gui_choprofil'))
        # End of functionFin de fonction
        return self.action
Exemple #3
0
class ComboBox(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()
        self.speed = 1.0

    def initUI(self):
        self.parent.title("Combobox")
        self.pack(fill=BOTH, expand=True)
        frame = Frame(self)
        frame.pack(fill=X)

        field = Label(frame, text="Typing Speed:", width=15)
        field.pack(side=LEFT, padx=5, pady=5)

        self.box_value = StringVar()
        self.box = Combobox(frame, textvariable=self.box_value, width=5)
        self.box['values'] = ('1x', '2x', '5x', '10x')
        self.box.current(0)
        self.box.pack(fill=X, padx=5, expand=True)
        self.box.bind("<<ComboboxSelected>>", self.value)

    def value(self, event):
        self.speed = float(self.box.get()[:-1])
Exemple #4
0
class SendGCode(LabelFrame):
	def __init__(self, root, prtr, settings, log, *arg):
		LabelFrame.__init__(self, root, *arg, text="Send gcode")
		self.app = root
		self.printer = prtr
		self.settings = settings
		self.log = log

		self.entry = Entry(self, width=50)
		self.entry.grid(row=1, column=1, columnspan=3, sticky=N+E+W)
		
		self.bSend = Button(self, text="Send", width=4, command=self.doSend, state=DISABLED)
		self.bSend.grid(row=1, column=4, padx=2)
		
		self.entry.delete(0, END)
		
		self.entry.bind('<Return>', self.hitEnter)
		self.gcv = StringVar(self)
		
		gclist = gcoderef.gcKeys()
		self.gcv.set(gclist[0])

		l = Label(self, text="G Code Reference:", justify=LEFT)
		l.grid(row=2, column=1, columnspan=2, sticky=W)

		self.gcm = Combobox(self, textvariable=self.gcv)
		self.gcm['values'] = gclist
		self.gcm.grid(row=2, column=3, padx=2)
		
		self.gcm.bind('<<ComboboxSelected>>', self.gcodeSel)
		
		#self.bInfo = Button(self, text="Info", width=9, command=self.doInfo)
		#self.bInfo.grid(row=2, column=4, padx=2)
		
	#def doInfo(self):
	def gcodeSel(self, *arg):
		verb = self.gcv.get()
		self.log.logMsg("%s: %s" % (verb, gcoderef.gcText(verb)))
		
	def activate(self, flag):
		if flag:
			self.bSend.config(state=NORMAL)
		else:
			self.bSend.config(state=DISABLED)
			
	def hitEnter(self, e):
		self.doSend()
		
	def doSend(self): 
		cmd = self.entry.get()
		verb = cmd.split()[0]
		
		if self.app.printerAvailable(cmd=verb):
			self.log.logMsg("Sending: %s" % cmd)
			self.printer.send_now(cmd)
Exemple #5
0
class SelectGame(tkSimpleDialog.Dialog, object):
    """Server settings window class."""

    def __init__(self, *args, **kwargs):
        """Initiates SelectGame instance with additional attributes.

        :param args: positional arguments - positional arguments passed to parent __init__ method
        :param kwargs: keyword arguments - keyword arguments passed to parent __init__ method
        """
        self.select_game, self.num_players, self.num_turns = None, None, None
        super(SelectGame, self).__init__(*args, **kwargs)

    def body(self, master):
        """Creates select game window.

        :param master: instance - master widget instance
        :return: Entry instance
        """
        self.resizable(False, False)
        Label(master, text='Type in new game title or select existing one').grid(row=0, columnspan=2)
        Label(master, text='Select game:').grid(row=1, sticky='W')
        Label(master, text='Number of players:').grid(row=2, sticky='W')
        Label(master, text='Game duration:').grid(row=3, sticky='W')
        self.select_game = Combobox(master)
        self.select_game.bind('<Button-1>', self.refresh_games)
        self.select_game.grid(row=1, column=1, sticky='W')
        self.num_players = Entry(master)
        self.num_players.insert(END, self.parent.num_players if self.parent.num_players else '')
        self.num_players.grid(row=2, column=1, sticky='W')
        self.num_turns = Entry(master)
        self.num_turns.insert(END, self.parent.num_turns if self.parent.num_turns else '')
        self.num_turns.grid(row=3, column=1, sticky='W')
        return self.select_game

    def apply(self):
        """Assigns entered values to parent game and num_players attributes."""
        self.parent.game = self.select_game.get() if self.select_game.get() != '' else None
        if self.parent.game not in self.parent.available_games:
            self.parent.num_players = int(self.num_players.get()) if self.num_players.get().isdigit() else None
            self.parent.num_turns = int(self.num_turns.get()) if self.num_turns.get().isdigit() else None

    def refresh_games(self, _):
        """Refreshes games list."""
        self.select_game.configure(values=self.parent.available_games)
Exemple #6
0
    def __init__(self, parent, parenttab, name, section, paramprefix):
        EditInput.__init__(self, parent, parenttab, name)
        self._section = section
        self._paramprefix = paramprefix
        
        fontlist = list(tkFont.families())
        fontlist.sort()
        self._bvb = tki.BooleanVar()
        self._bvi = tki.BooleanVar()
        self._bvs = tki.BooleanVar()
        self._bvu = tki.BooleanVar()
        
        l = tki.Label(self, text = lang[lng.txtFontsize])
        l.grid(row = 0, column = 0, padx = 5, pady = 2, sticky = tki.W)
        
        tcmd = (self.register(self._ehOnValidateEntry), '%d', '%P')
        e = tki.Entry(self, validate = 'key', validatecommand = tcmd, width = _sizechars)
        self._esize = e
        e.grid(row = 1, column = 0, padx = 5, pady = 2, sticky = tki.W)

        l = tki.Label(self, text = lang[lng.txtFontName])
        l.grid(row = 2, column = 0, padx = 5, pady = 2, sticky = tki.W)
        
        cb = Combobox(self, values = fontlist)
        self._cbfontname = cb
        cb.grid(row = 3, column = 0, padx = 5, pady = 2, sticky = tki.W)
        cb.bind('<<ComboboxSelected>>', self._setDirty)
        cb.current(0)

        cb = tki.Checkbutton(self, text = lang[lng.txtBold], onvalue = True, offvalue = False, variable = self._bvb, command = self._setDirty)
        self._cbb = cb
        cb.grid(row = 0, column = 1, padx = 5, pady = 2, sticky = tki.W)
        
        cb = tki.Checkbutton(self, text = lang[lng.txtItalics], onvalue = True, offvalue = False, variable = self._bvi, command = self._setDirty)
        self._cbi = cb
        cb.grid(row = 1, column = 1, padx = 5, pady = 2, sticky = tki.W)

        cb = tki.Checkbutton(self, text = lang[lng.txtStrikethrough], onvalue = True, offvalue = False, variable = self._bvs, command = self._setDirty)
        self._cbs = cb
        cb.grid(row = 2, column = 1, padx = 5, pady = 2, sticky = tki.W)

        cb = tki.Checkbutton(self, text = lang[lng.txtUnderline], onvalue = True, offvalue = False, variable = self._bvu, command = self._setDirty)
        self._cbu = cb
        cb.grid(row = 3, column = 1, padx = 5, pady = 2, sticky = tki.W)
Exemple #7
0
class SimulationTypeHandler(BaseHandler):
    """
    Simulation type and conditions handler
    """
    def __init__(self, frame):
        self.__simulation_types_map = {
            '2D tensile, flat': FlatTensile2DTestHandler(),
            'Import material to model': ImportToExistingModelHandler(),
            '3D compression': Compression3DTestHandler()
        }
        self.__material_templates_list = None
        super(SimulationTypeHandler, self).__init__(frame)

    @property
    def material_templates_list(self):
        return self.__material_templates_list

    @material_templates_list.setter
    def material_templates_list(self, value):
        self.__material_templates_list = value

    @property
    def parameters(self):
        """
        Dictionary of parameters relevant for this handler and possibly nested handlers
        :return: dictionary of parameters
        """
        choice = self.__simulation_type_variable.get()
        handler = self.__simulation_types_map[choice]
        handler_parameters = handler.parameters
        material_name = handler_parameters[SOURCE_MATERIAL_NAME]
        material_template = self.__material_templates_list.find(material_name)
        cpu_num = self.cpu_count_variable.get()
        max_cpu = cpu_count()
        cpu_num = min(max(cpu_num, 1), max_cpu)
        parameters = {
            MODEL_NAME: self.model_name_variable.get(),
            JOB_NAME: self.job_name_variable.get(),
            RUN_JOB_AUTOMATICALLY: self.job_run_variable.get(),
            MATERIAL_TEMPLATE: material_template,
            CPU_COUNT: cpu_num
        }
        return dict(handler_parameters, **parameters)

    @property
    def builders(self):
        """
        Get all builders relevant for this handler and possibly nested handlers
        :return: list of builders, with each builder tied to previous one as 'next_builder'
        """
        choice = self.__simulation_type_variable.get()
        handler = self.__simulation_types_map[choice]
        return handler.builders

    def _configure(self):
        self.simulation_definition_frame = LabelFrame(
            self.frame,
            text='Simulation definition',
            borderwidth=config.FRAME_BORDER_WIDTH,
            relief=config.FRAME_RELIEF)
        self.simulation_definition_frame.grid(column=0,
                                              row=0,
                                              sticky=W + E + N,
                                              padx=config.FRAME_PADDING,
                                              pady=config.FRAME_PADDING)

        self.__simulation_type_label = Label(self.simulation_definition_frame,
                                             text='Simulation type')
        self.__simulation_type_label.grid(column=0,
                                          row=0,
                                          sticky=E,
                                          padx=config.FRAME_PADDING,
                                          pady=config.FRAME_PADDING)
        self.__simulation_type_variable = StringVar(
            value=self.__simulation_types_map.keys()[0])
        self.__simulation_type_combobox = Combobox(
            self.simulation_definition_frame,
            values=self.__simulation_types_map.keys(),
            textvariable=self.__simulation_type_variable)
        self.__simulation_type_combobox.grid(column=1,
                                             row=0,
                                             sticky=W,
                                             padx=config.ELEMENT_PADDING,
                                             pady=config.ELEMENT_PADDING)
        self.__simulation_type_combobox.bind(
            '<<ComboboxSelected>>', self.__on_simulation_type_selected)

        self.__model_name_label = Label(self.simulation_definition_frame,
                                        text='Model name')
        self.__model_name_label.grid(column=0,
                                     row=1,
                                     sticky=E,
                                     padx=config.ELEMENT_PADDING,
                                     pady=config.ELEMENT_PADDING)
        self.model_name_variable = StringVar()
        self.__model_name_entry = Entry(self.simulation_definition_frame,
                                        textvariable=self.model_name_variable)
        self.__model_name_entry.grid(column=1,
                                     row=1,
                                     sticky=W,
                                     padx=config.ELEMENT_PADDING,
                                     pady=config.ELEMENT_PADDING)

        self.__job_name_label = Label(self.simulation_definition_frame,
                                      text='Job name')
        self.__job_name_label.grid(column=0,
                                   row=2,
                                   sticky=E,
                                   padx=config.ELEMENT_PADDING,
                                   pady=config.ELEMENT_PADDING)
        self.job_name_variable = StringVar()
        self.__job_name_entry = Entry(self.simulation_definition_frame,
                                      textvariable=self.job_name_variable)
        self.__job_name_entry.grid(column=1,
                                   row=2,
                                   sticky=W,
                                   padx=config.ELEMENT_PADDING,
                                   pady=config.ELEMENT_PADDING)
        self.__cpu_count_label = Label(self.simulation_definition_frame,
                                       text='Number of CPUs')
        self.__cpu_count_label.grid(column=0,
                                    row=3,
                                    sticky=E,
                                    padx=config.ELEMENT_PADDING,
                                    pady=config.ELEMENT_PADDING)
        self.cpu_count_variable = IntVar(value=1)
        self.__job_name_entry = Entry(self.simulation_definition_frame,
                                      textvariable=self.cpu_count_variable)
        self.__job_name_entry.grid(column=1,
                                   row=3,
                                   sticky=W,
                                   padx=config.ELEMENT_PADDING,
                                   pady=config.ELEMENT_PADDING)

        self.__job_run_label = Label(self.simulation_definition_frame,
                                     text='Run automatically')
        self.__job_run_label.grid(column=0,
                                  row=4,
                                  sticky=E,
                                  padx=config.ELEMENT_PADDING,
                                  pady=config.ELEMENT_PADDING)
        self.job_run_variable = BooleanVar()
        self.__job_run_checkbutton = Checkbutton(
            self.simulation_definition_frame, variable=self.job_run_variable)
        self.__job_run_checkbutton.grid(column=1,
                                        row=4,
                                        sticky=W,
                                        padx=config.ELEMENT_PADDING,
                                        pady=config.ELEMENT_PADDING)

        self.create_model_button = Button(self.simulation_definition_frame,
                                          text='Create model',
                                          command=self.__on_create_model)
        self.create_model_button.grid(column=1,
                                      row=5,
                                      sticky=W,
                                      padx=config.ELEMENT_PADDING,
                                      pady=config.ELEMENT_PADDING)

        self.simulation_settings_frame = Frame(self.frame)
        self.simulation_settings_frame.grid(column=0,
                                            row=1,
                                            sticky=W + E + N + S)

        self.__on_simulation_type_selected(None)

    def __on_simulation_type_selected(self, _):
        choice = self.__simulation_type_variable.get()
        self.__simulation_types_map[choice].populate(
            self.simulation_settings_frame)

    def __on_create_model(self):
        params = self.parameters
        builders = self.builders
        first_builder = builders[0]
        first_builder.build(**params)
Exemple #8
0
    class Monitor(Frame):
        def __init__(self, parent, port, baud_rate, ser, toolchain, bii):
            '''
            Params:
                parent: The parent Frame
                port: string
                baud_rate:
                ser: serial
            '''

            Frame.__init__(self, parent)
            self.parent = parent
            self.port = port
            self.baud_rate = baud_rate
            self.ser = ser
            self.toolchain = toolchain
            self.bii = bii
            self.initUI()

        def initUI(self):
            self.parent.title("Biicode serial monitor %s" % self.port)
            self.style = Style()  # We need to define a style, otherwhise seems flat whit in macos
            self.style.theme_use(get_style())
            for x in range(1):
                Grid.columnconfigure(self, x, weight=1)
            for y in [1, 2]:
                Grid.rowconfigure(self, y, weight=1)

            self._make_top_bar()
            self._make_user_input()
            self._make_rcv_log()
            self._make_button_bar()

            self.pack(fill=BOTH, expand=1)

            self.serial_buffer = ""
            self.count = 0
            self.running = True
            self.after(50, self.read_serial)  # check serial again soon

        def _make_top_bar(self):
            menubar = Menu(self.parent)
            filemenu = Menu(menubar, tearoff=0)
            biimenu = Menu(menubar, tearoff=0)
            editmenu = Menu(menubar, tearoff=0)

            biimenu.add_command(label="Work (Save and process)", command=self.bii.work)
            biimenu.add_command(label="Find", command=self.bii.find)
            menubar.add_cascade(label="bii", menu=biimenu)

            filemenu.add_command(label="Flash code", command=self.upload)
            filemenu.add_separator()
            filemenu.add_command(label="Exit", command=self.parent.quit)
            menubar.add_cascade(label="File", menu=filemenu)

            editmenu.add_command(label="Clear", command=self.clear)
            # editmenu.add_separator()
            menubar.add_cascade(label="Edit", menu=editmenu)
            self.parent.config(menu=menubar)

        def _make_button_bar(self):
            self.button_upload = Button(self, text="Flash code", command=self.upload)
            self.button_upload.style = self.style
            self.button_upload.grid(row=0, column=0, padx=2, pady=2)

            self.baud_rate = 9600
            self.button_combobox = Combobox(self)
            self.button_combobox.bind("<<ComboboxSelected>>", self._update_baud_rate)
            bauds = (300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200)
            self.button_combobox['values'] = bauds
            self.button_combobox.current(4)
            self.button_combobox.grid(row=3, column=1, padx=2, pady=2)

        def _make_user_input(self):
            # make user input
            self.user_input = Text(self, width=52, height=3, takefocus=1,
                                   borderwidth=1, relief='ridge')
            self.user_input.grid(row=1, column=0, padx=2, pady=2, sticky=N + S + E + W)

            # make send button
            self.button_send = Button(self, text="Send", command=self.send_clicked)
            self.button_send.style = self.style
            self.button_send.grid(row=1, column=1, padx=2, pady=2, sticky=N + S + E + W)

        def _make_rcv_log(self):
            # make receive log
            recvLogFrame = Frame(self, width=400, height=200)
            recvLogFrame.style = self.style
            recvLogFrame.grid(row=2, column=0, padx=2, pady=2, sticky=N + S + E + W)
            self.start_stop_button = Button(self, text="Stop", command=self.start_stop_clicked)
            self.start_stop_button.style = self.style
            self.start_stop_button.grid(row=2, column=1, padx=2, pady=2, sticky=N + S + E + W)

            # make a scrollbar
            self.scrollbar = Scrollbar(recvLogFrame)
            self.scrollbar.pack(side=RIGHT, fill=Y)

            # make a text box to put the serial output
            self.log = Text(recvLogFrame, width=50, height=30, takefocus=0,
                            borderwidth=1, relief='ridge')
            self.log.pack(fill=BOTH, expand=True)

            # attach text box to scrollbar
            self.log.config(yscrollcommand=self.scrollbar.set)
            self.scrollbar.config(command=self.log.yview)

        def send_clicked(self):
            data = str(self.user_input.get(1.0, "end-1c") + '\0')
            self.ser.write(data)
            self._log(data)
            self.user_input.delete(1.0, END)

        def _log(self, msg):
            # if platform.system() == 'Darwin':
            #    print '>> %s' % msg
            # else:
            self.log.insert(END, '\n>> %s' % msg)
            self.log.yview(END)
            self.update_idletasks()

        def clear(self):
            self.log.delete(1.0, END)
            self.update_idletasks()

        def start_stop_clicked(self):
            if self.running:
                self.running = False
                self.start_stop_button['text'] = 'Start'
            else:
                self.running = True
                self.start_stop_button['text'] = 'Stop'
                self.read_serial()  # check serial again soon

        def upload(self):
            self.bii.work()
            try:
                if platform.system() == 'Darwin':
                    self.toolchain.upload()
                else:
                    self.ser.close()
                    self.toolchain.upload()
                    self.ser.open()
                self._log('** Code uploaded **')
            except BiiException:
                self._log('** Code upload failed **')

        def _update_baud_rate(self, event=None):
            new_rate = self.button_combobox.get()
            if new_rate != self.baud_rate:
                self.baud_rate = new_rate
                self.ser.setBaudrate(new_rate)
                logger.debug('Updated serial speed to %s' % new_rate)
                self.update_idletasks()

        def read_serial(self):
            self.log.update()  # display input text

            self._read_character()
            if self.running:
                self.after(100, self.read_serial)  # check serial again soon
            self.after(100, self.update_idletasks)

        def _read_character(self):
            try:
                c = self.ser.read()  # attempt to read a character from Serial
            except SerialException as e:
                logger.error("Couldn't read serial port: %s" % str(e))
                return

            # was anything read?
            while len(c) > 0 and c != '\r':
                # get the buffer from outside of this function
                # check if character is a delimeter
                if c == '\r':
                    c = ''  # don't want returns. chuck it
                if c == '\n':
                    # self.serial_buffer += "\n"  # add the newline to the buffer
                    self.log.insert(END, "\n")
                    self.log.insert(END, self.serial_buffer)
                    self.log.yview(END)
                    self.update_idletasks()
                    self.serial_buffer = ""  # empty the buffer
                else:
                    self.serial_buffer += c  # add to the buffer
                c = self.ser.read()
Exemple #9
0
class Application(Frame):
    cols = [1, 2, 3, 4, 5]
    rows = ["A", "B", "C", "D", "E"]

    scheduler = sched.scheduler(time.time, time.sleep)
    playStates = {}
    sensorStates = {}
    buttons = {}
    currentPlayMode = GameModes.SINGLE_HIT
    currentStep = None
    selectedChannelName = None

    def load(self):
        print("loading sounds into PD..")
        command = ""
        path = self.setCombo.get()
        soundSet = self.conf["SoundSets"][path]

        sensorsPerRow = 5.0
        gapsPerRow = sensorsPerRow - 1
        balanceSpread = 1.0 / gapsPerRow  # 0.25
        col = 0.0
        row = 0.0

        for r in range(len(self.rows)):
            for c in range(len(self.cols)):
                channelName = str(self.rows[r]) + " " + str(self.cols[c])
                command += channelName + " load " + path + "/" + channelName.replace(
                    " ", "") + ".wav,"
                backFrontMultiplyer = (
                    gapsPerRow - r
                ) / gapsPerRow  # row0: 1, row1: 0.75, row3: 0.5, row4: 0.25, row5: 0
                v1 = (1 - (balanceSpread * c)) * backFrontMultiplyer
                v2 = (balanceSpread * c) * backFrontMultiplyer
                v3 = (1 - (balanceSpread * c)) * (1 - backFrontMultiplyer)
                v4 = (balanceSpread * c) * (1 - backFrontMultiplyer)
                command += channelName + " panorama " + str(v1) + " " + str(
                    v2) + " " + str(v3) + " " + str(v4) + ","
                command += channelName + " volume " + str(
                    self.getChannelVolume(channelName, True)) + ","
                self.playStates[channelName] = False
                self.enableButton(channelName, False)

        self.sendToPd(command)

    def getMasterVolume(self):
        if (self.currentStep is None):
            return 1
        else:
            return self.currentStep["masterVolume"]

    def getChannelVolume(self, channelName, includeMasterVolume):
        channelConfig = self.currentSet.get(channelName)
        if (channelConfig):
            v = channelConfig.get("volume")
        else:
            v = 1
        if (includeMasterVolume):
            v = v * self.getMasterVolume()

        return v

    def singleHit(self, channelName):
        self.sendToPd(channelName + " play")

    def buttonPress(self, channelName):
        print(self.currentMode.get())
        if (self.currentMode.get() == "play"):
            if (self.currentGameMode == GameModes.SINGLE_HIT):
                self.singleHit(channelName)
            else:
                self.playStates[channelName] = not self.playStates.get(
                    channelName)
                if (self.playStates.get(channelName)):
                    self.sendChannelVolumeToPd(channelName)
                else:
                    self.sendToPd(channelName + " volume 0")

                self.enableButton(channelName,
                                  self.playStates.get(channelName))
        elif (self.currentMode.get() == "setMac"):
            lastActiveMac = self.activeMacAddrLabel["text"]
            self.conf["SensorNames"][lastActiveMac] = channelName
            self.currentMode.set("play")
        elif (self.currentMode.get() == "setVolume"):
            self.currentChannelVolumeLabel["text"] = str(
                self.getChannelVolume(channelName, False))
            self.selectedChannelName = channelName

    def sendChannelVolumeToPd(self, channelName):
        self.sendToPd(channelName + " volume " +
                      str(self.getChannelVolume(channelName, True)))

    def enableButton(self, channelName, enable):
        color = 'black' if enable else 'white'
        self.buttons[channelName].configure(highlightbackground=color)

    def sendToPd(self, command):
        print("sending command to PD: " + command)
        os.system("echo '" + command + "' | " +
                  self.conf["SystemSettings"]["pdSendPath"] +
                  " 3000 localhost udp")

    def enableChannel(self, channelName):
        if (self.playStates[channelName]):
            return
        self.sendToPd(channelName + " volume " +
                      str(self.getChannelVolume(channelName, True)))
        self.playStates[channelName] = True

    def disableChannel(self, channelName):
        if (not self.playStates.get(channelName)):
            return
        self.sendToPd(channelName + " volume 0")
        self.playStates[channelName] = False

    def onMessage(self, client, userdata, message):
        val = str(message.payload.decode("utf-8"))
        if (message.topic == "control"):
            if (val == "nextSet"):
                self.switchNextSet()
            elif (val == "prevSet"):
                self.switchPrevSet()
            elif (val.startswith("pd:")):
                self.sendToPd(val.split(":")[1])
        elif (message.topic == "sensor"):
            '''
            Callback for MQTT messages
            {"k": "XXX", "v": 100}
            '''
            #print(str(message.payload.decode("utf-8")))
            start_new_thread(self.handleSensorData, (message, ))
        elif (message.topic.startswith("sensorControl")):
            if (message.topic.find("set/brightness")):
                self.conf["SystemSettings"]["sensorBrightness"] = int(val)
            elif (message.topic.find("set/triggerLevel")):
                self.conf["SystemSettings"]["sensorTriggerLevel"] = int(val)

        elif (message.topic == "status"):
            obj = json.loads(val)
            status = obj.get("status")
            mac = obj.get('k')
            print("status: " + mac + " status: " + status)
            if (status == "connected"):
                sensorTopic = "sensorControl" + mac
                self.client.publish(
                    sensorTopic,
                    "{\"command\": \"setTriggerLevel\", \"val\": " +
                    str(self.getSensorTriggerLevel()) + "}", 1)
                self.client.publish(
                    sensorTopic, "{\"command\": \"setBrightness\", \"val\": " +
                    str(self.getSensorBrightness()) + "}", 1)

    def getSensorBrightness(
            self):  # the brightness of the lights in the sensor
        if (self.currentStep and self.currentStep.get("sensorBrightness")):
            return self.currentStep.get("sensorBrightness")
        return self.conf["SystemSettings"]["sensorBrightness"]

    def getSensorTriggerLevel(
        self
    ):  # the sensor value threshold which makes the sensors send an ON and OFF signal
        return self.conf["SystemSettings"]["sensorTriggerLevel"]

    def handleSensorData(self, message):
        val = json.loads(str(message.payload.decode("utf-8")))
        v = 0.0
        s = 0
        channelName = ""
        try:
            sensorId = val['k']
            v = int(val['v'])
            s = int(val.get('s'))
        except:
            print('Could not digest ' + str(message.payload.decode("utf-8")))
            return

        channelName = self.conf["SensorNames"].get(sensorId)
        if (not channelName):
            print("channel for sensorId " + sensorId + " not found")
            return

        prevVal = self.sensorStates.get(sensorId)
        self.sensorStates[sensorId] = v
        print("sensorId: " + sensorId + ", channel: " + channelName + ", v: " +
              str(v) + " s:" + str(s))
        if (self.currentGameMode == GameModes.SINGLE_HIT):
            if (s == 1):
                self.singleHit(channelName)
                self.buttons[channelName].configure(highlightbackground='red')
            else:
                self.buttons[channelName].configure(
                    highlightbackground='white')
        else:
            if (s == 1):
                self.enableChannel(channelName)
                self.buttons[channelName].configure(
                    highlightbackground='black')
            else:
                self.disableChannel(channelName)
                self.buttons[channelName].configure(
                    highlightbackground='white')

        if (s == 1):
            self.activeMacAddrLabel["text"] = sensorId

    def checkTime(self):
        lastStep = None
        for step in self.conf["Scheduler"]['steps'].keys():
            startHour = int(step.split(":")[0])
            startMinute = int(step.split(":")[1])
            startSecond = int(step.split(":")[2])
            startDate = datetime.datetime.now().replace(hour=startHour,
                                                        minute=startMinute,
                                                        second=startSecond,
                                                        microsecond=0)
            #print("now", datetime.datetime.now())
            if (startDate < datetime.datetime.now()):
                lastStep = step

        if (lastStep is not None and lastStep != self.stepCombo.get()):
            print("automatic step switch: ", lastStep)
            self.switchStep(lastStep)

        info = "currentStep: " + self.stepCombo.get() + "\n"
        info += "currentGameMode: " + self.currentGameMode + "\n"
        self.client.publish("info", "info: " + info, 0)

    def switchStep(self, stepId):

        self.client.publish("info/step", stepId, 0)
        self.stepCombo.set(stepId)
        self.currentStep = self.conf["Scheduler"]["steps"][stepId]
        print("switch step: ")
        pprint(self.currentStep)
        if (self.currentStep.get('pdCommand')):
            self.sendToPd(self.currentStep.get('pdCommand'))

        self.switchSet(self.currentStep.get("set"))

    def switchNextSet(self):
        currentSet = self.setCombo.get()
        nextIndex = (self.conf["SoundSets"].keys().index(currentSet) +
                     1) % len(self.conf["SoundSets"].keys())
        nextSetPath = self.conf["SoundSets"].keys()[nextIndex]
        self.switchSet(nextSetPath)

    def switchPrevSet(self):
        currentSet = self.setCombo.get()
        prevIndex = (self.conf["SoundSets"].keys().index(currentSet) -
                     1) % len(self.conf["SoundSets"].keys())
        prevSetPath = self.conf["SoundSets"].keys()[prevIndex]
        self.switchSet(prevSetPath)

    def switchSet(self, path):
        self.currentSet = self.conf["SoundSets"].get(path)
        self.setCombo.set(path)

        self.currentGameMode = GameModes.SINGLE_HIT if self.currentSet[
            'mode'] == 'SINGLE_HIT' else GameModes.LOOP

        if (self.currentGameMode == GameModes.SINGLE_HIT):
            self.sendToPd("loop stop, all volume " +
                          str(self.getMasterVolume()))
        else:
            duration = self.currentSet['duration']
            self.sendToPd("loop start " + duration + ", all volume 0")

        print("New mode: " + self.currentGameMode)
        self.infoLabel["text"] = ("Mode: {0}\n"
                                  "MasterVolume: {1}\n"
                                  "SensorBrightness: {2}").format(
                                      self.currentGameMode,
                                      self.getMasterVolume(),
                                      self.getSensorBrightness())

        self.load()
        self.client.publish("info/set", path, 0)

    def patchFirmware(self):
        self.client.publish("sensorControl/patch",
                            self.conf["SystemSettings"]["otaUpdateUrl"], 1)

    def copyMacToClipBoard(self):
        root.clipboard_clear()
        root.clipboard_append(self.activeMacAddrLabel['text'])
        root.update()

    def onStepComboChanged(self, event):
        print(self.stepCombo.get())
        self.switchStep(self.stepCombo.get())

    def onSetComboChanged(self, event):
        pprint(self.setCombo.get())
        self.switchSet(self.setCombo.get())

    def increaseChannelVolume(self):
        self.setCurrentChannelVolume(
            self.getChannelVolume(self.selectedChannelName, False) + 0.1)

    def decreaseChannelVolume(self):
        self.setCurrentChannelVolume(
            self.getChannelVolume(self.selectedChannelName, False) - 0.1)

    def setCurrentChannelVolume(self, v):
        self.currentChannelVolumeLabel["text"] = str(v)
        self.currentSet[self.selectedChannelName] = {}
        self.currentSet[self.selectedChannelName]["volume"] = v
        self.sendChannelVolumeToPd(self.selectedChannelName)
        self.singleHit(self.selectedChannelName)

    def saveConfig(self):
        with open("conf1.json", "w") as confFile:
            json.dump(self.conf, confFile, indent=4, sort_keys=False)
        print("config saved: ")
        pprint(self.conf)

    def createWidgets(self):
        topFrame = Frame(self)
        topFrame.pack(side=TOP)

        stepKeys = self.conf["Scheduler"]["steps"].keys()
        stepKeys.sort()
        self.stepCombo = Combobox(topFrame, values=stepKeys, state="readonly")
        self.stepCombo.pack(side=LEFT)
        self.stepCombo.bind("<<ComboboxSelected>>", self.onStepComboChanged)

        self.setCombo = Combobox(topFrame,
                                 values=self.conf["SoundSets"].keys(),
                                 state="readonly")
        self.setCombo.pack(side=LEFT)
        self.setCombo.bind("<<ComboboxSelected>>", self.onSetComboChanged)

        contentFrame = Frame(self)
        contentFrame.pack(side=LEFT)

        contentLeft = Frame(contentFrame)
        contentLeft.pack(side=LEFT)

        contentMiddle = Frame(contentFrame)
        contentMiddle.pack(side=LEFT)

        contentRight = Frame(contentFrame)
        contentRight.pack(side=LEFT)

        footerFrame = Frame(self)
        footerFrame.pack(side=BOTTOM)

        self.infoLabel = Label(contentRight, text="info", anchor='w')
        self.infoLabel.pack(fill='both')

        self.currentMode = StringVar()
        Radiobutton(contentMiddle,
                    text="Play",
                    variable=self.currentMode,
                    value="play").grid(row=0, column=0)
        Radiobutton(contentMiddle,
                    text="Write Mac to config",
                    variable=self.currentMode,
                    value="setMac").grid(row=1, column=0)
        Radiobutton(contentMiddle,
                    text="Set volume",
                    variable=self.currentMode,
                    value="setVolume").grid(row=2, column=0)

        Button(contentMiddle, text="-",
               command=self.decreaseChannelVolume).grid(row=2, column=1)
        self.currentChannelVolumeLabel = Label(contentMiddle, text="vol")
        self.currentChannelVolumeLabel.grid(row=2, column=2)
        Button(contentMiddle, text="+",
               command=self.increaseChannelVolume).grid(row=2, column=3)

        self.currentMode.set("play")

        self.activeMacAddrLabel = Button(contentMiddle,
                                         text='Last active mac',
                                         command=self.copyMacToClipBoard)
        self.activeMacAddrLabel.grid(row=3, column=0)

        self.patchFirmwareButton = Button(contentMiddle,
                                          text='Patch Firmware',
                                          command=self.patchFirmware)
        self.patchFirmwareButton.grid(row=4, column=0)

        self.saveButton = Button(contentMiddle,
                                 text='Save Configuration',
                                 command=self.saveConfig)
        self.saveButton.grid(row=5, column=0)

        #self.activeMacAddressLabel = Label(contentFrame)
        #self.activeMacAddressLabel.pack( side = LEFT)

        for c in range(len(self.cols)):
            for r in range(len(self.rows)):
                channelName = str(self.rows[r]) + " " + str(self.cols[c])
                button = Button(
                    contentLeft,
                    text=channelName,
                    command=lambda sn=channelName: self.buttonPress(sn))
                button.grid(row=r, column=c)
                self.buttons[channelName] = button

    def __init__(self, master=None):
        Frame.__init__(self, master)

        with open('conf.json') as f:
            self.conf = json.load(f)

        self.pack()
        self.createWidgets()
        print("Connecting to broker...")
        self.client = mqtt.Client(self.conf["brokerSettings"]['client'])
        self.client.connect(self.conf["brokerSettings"]['address'],
                            self.conf["brokerSettings"]['port'])
        print("connected!")
        # wait for MQTT connection
        # TODO: implement proper callback https://www.eclipse.org/paho/clients/python/docs/
        #       with error handling on failed connection
        time.sleep(0.5)
        # sensor: updates from the sensors; control: topic for controlling this program; status: topic where status updates are posted (mostly sensors when the join the network); sensorControl: listening to the control messages of the sensors
        self.client.subscribe([("sensor", 0), ("control", 0), ("status", 0),
                               ("sensorControl/#", 0)])

        # setup callback
        self.client.on_message = self.onMessage
        self.client.loop_start()
        #self.switchSetIndex(0)
        self.switchSet(self.conf["SoundSets"].keys()[0])
        # self.checkTime()
        #self.checkTime()
        self.scheduler = timer.Scheduler(30, self.checkTime)
        self.scheduler.start()

    def quit(self):
        print("Terminating...")
        self.scheduler.stop()
        root.destroy()
Exemple #10
0
class ReportsFrame(Frame):
    def __init__(self,master,customers,payments,output_text):
        Frame.__init__(self,master)
        self.customers = customers
        self.payments = payments
        self.master = master
        self.output_text = output_text

        self.year_months = find_years_months(getcwd()) # use cwd, this should be set

        self.year = StringVar()
        self.month = StringVar()
        self.years = sorted(self.year_months.keys())
        self.months = []

        lf = LabelFrame(self, text="Generate Report")
        lf.grid(padx=5,pady=5,row=0,column=0,sticky='ew')

        Label(lf,text="Year: ").grid(row=0,column=0,sticky='e',padx=(10,0),pady=(10,2))
        Label(lf,text="Month: ").grid(row=1,column=0,sticky='e',padx=(10,0),pady=2)

        self.year_cb = Combobox(lf,textvariable=self.year,width=12,values=self.years,state='readonly')
        self.month_cb = Combobox(lf,textvariable=self.month,width=12,values=self.months,state='readonly')
        
        self.year_cb.grid(row=0,column=1,sticky='w',padx=(0,10),pady=(10,2))
        self.month_cb.grid(row=1,column=1,sticky='w',padx=(0,10),pady=2)

        btn = Button(lf,text="Save Report",command=self.report,width=30)
        btn.grid(row=2,column=0,columnspan=2,sticky='n',pady=(2,10),padx=10)

        #configure the grid to expand
        self.columnconfigure(0,weight=1)
        lf.rowconfigure(0,weight=1)
        lf.rowconfigure(1,weight=1)
        lf.columnconfigure(0,weight=1)
        lf.columnconfigure(1,weight=1)

        self.year_cb.bind('<<ComboboxSelected>>',self.year_selected)

        self.update() #update the values

    def report(self):
        '''
        generate the report, run by clicking Button
        '''
        if self.year.get() is '':
            self.output_text("! - Please Select a Year")
            return
        if self.month.get() is '':
            self.output_text("! - Please select a Month")
            return

        year = self.year.get()
        inputf = 'jim_data' + year + '.xlsx'
        month = self.month.get()
        outputf_def = month + year + '_report.xlsx'
        outputf = tkFileDialog.asksaveasfilename(parent=self,
            defaultextension='.xlsx', initialfile=outputf_def)
        if outputf is '': return #file not selected

        #output report
        month_report(inputf,month,year,outputf,self.customers,self.payments)

        self.output_text("* - " + self.month.get() + ' ' + self.year.get() + ' report saved to: ' + outputf + '\n')

        # print stat(outputf)

        if sys.platform == 'darwin':
            system('open ' + outputf + ' &')
        else:
            system(outputf) # open the file

    def update(self):
        '''
        method for updating values when things change
        '''
        self.year_months = find_years_months(getcwd()) # use cwd, this should be set
        self.years = sorted(self.year_months.keys())
        self.months = ['']
        if len(self.years) == 0: self.years = ['']
        self.year_cb['values'] = self.years
        self.month_cb['values'] = self.months
        self.month_cb.current(0)

    def year_selected(self,event=None):
        '''
        run when year is year is selected 
        '''
        self.months = self.year_months[self.year.get()]
        self.month_cb['values'] = self.months
        self.month_cb.current(0)
Exemple #11
0
	def initUI(self):
		self.master.title('Bureau of Labor Statistics: Market Summary')
		#self.pack(fill=BOTH, expand=True)
		#self.grid_rowconfigure(0, weight=1)
		#self.grid_columnconfigure(0, weight=1)
		self.grid()
		

		######### Menu setup ###########
		menubar = Menu(self.master)
		
		file_menu = Menu(menubar)
		file_menu.add_command(label='Open...', command=self.select_file)
		file_menu.add_separator()
		file_menu.add_command(label='Close', command=self.quit)
		menubar.add_cascade(label='File', menu=file_menu)


		about_menu = Menu(menubar)
		about_menu.add_command(label='About')
		menubar.add_cascade(label='Help', menu=about_menu)

		self.master.config(menu=menubar)
		# end menu setup

		
		####### Logo ########
		logo = Image.open('img/BLS logo.jpg')
		logoo = ImageTk.PhotoImage(logo)
		logo_label = Label(self, image=logoo)
		logo_label.image = logoo
		logo_label.grid(row=0, columnspan=2)
		# end logo
	
		##### Combobox ########		
		occ_label = Label(self, text='Occupations:')
		occ_label.grid(row=1)
	
		choices = ['None']
		self.v = StringVar()
		cb = Combobox(self, textvariable=self.v,state='disabled', width=30)
		cb['values'] = choices
		cb.current(0)
		cb.bind('<<ComboboxSelected>>', self.on_select)
		self.my_cb['cb'] = cb
		cb.grid(row=1, column=1, pady=7, sticky=W)
		# end combobox
		
		###### Results #######
		j_label = Label(self, text='Job:')
		j_label.grid(row=2, padx=3, pady=3, sticky=W)

		jr_label = Label(self, text='None', anchor=W, justify=LEFT, width=30)
		self.my_labels['jr_label'] = jr_label
		jr_label.grid(row=2, column=1, pady=3, sticky=W)

		s_label = Label(self, text='Salary:')
		s_label.grid(row=3, padx=3, pady=3, sticky=W)

		sr_label = Label(self, text='None')
		self.my_labels['sr_label'] = sr_label
		sr_label.grid(row=3, column=1, pady=3, sticky=W)
		# end results

		####### Listbox #######
		lb = Listbox(self, width=30)
		lb.grid(row=0, column=2, rowspan=5, padx=10)

		
		####### Footer ###########
		closeButton = Button(self, text='Close', command=self.quit)
		closeButton.grid(row=4, column=2, sticky=E)
class Gui(Frame):
    """ Gui class for Graphical User Interface"""
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.searcher = Searcher()
        self.initUI()

    def initUI(self):
        self.pack(fill=BOTH, expand=True)
        Grid.columnconfigure(self, 0, weight=1)
        Label(self,
              text='Classroom Finder',
              font=('Arial', 20, 'bold'),
              bg='cyan',
              fg='white').grid(sticky=W + E,
                               columnspan=3)  # classroom finder header
        Label(self, text='Url:').grid(column=0, row=1, pady=10, padx=(50, 0))
        self.urlentry = Entry(self, width=100)  # url entry to get url
        self.urlentry.grid(column=1, row=1, padx=(0, 80))
        self.color_label = Label(
            self, bg='red', width=10)  # color label to make red,yellow,green
        self.color_label.grid(column=0,
                              row=2,
                              sticky=E,
                              columnspan=2,
                              padx=(120),
                              pady=(0, 40))
        self.fetchbtn = Button(self,
                               text='Fetch',
                               height=2,
                               width=10,
                               command=self.dynamic)  # fetch button
        self.fetchbtn.grid(column=1,
                           row=2,
                           sticky=E,
                           padx=(0, 30),
                           pady=(10, 50))
        Label(self,
              text='Filters',
              bg='cyan',
              fg='white',
              font=('Arial', 20, 'bold'),
              width=10).grid(column=0, row=3, padx=10)
        self.frame = Frame(self, borderwidth=3,
                           relief=GROOVE)  # frame to keep filters part
        self.frame.grid(column=0,
                        row=4,
                        columnspan=3,
                        sticky=W + E + S + N,
                        pady=10,
                        padx=10)
        Label(self.frame, text='Where am I?').grid(sticky=W)
        self.where_combo = Combobox(self.frame,
                                    state='readonly')  # where am i combobox
        self.where_combo.grid(column=1, row=0, pady=20)
        self.where_combo.bind(
            '<<ComboboxSelected>>',
            self.change_build)  # to update room button wrt where combo
        Label(self.frame, text='Room').grid(sticky=W)
        self.room_combo = Combobox(self.frame,
                                   state='readonly')  # rooms combobox
        self.room_combo.grid(column=1, row=1)
        Label(self.frame, text='Start').grid(sticky=W)
        self.start_combo = Combobox(self.frame, state='readonly',
                                    width=7)  # start time combobox
        self.start_combo.grid(column=1, row=2, pady=20, sticky=W)
        Label(self.frame, text='End').grid(column=2, row=2, sticky=W)
        self.end_combo = Combobox(self.frame, state='readonly',
                                  width=7)  # end time combobox
        self.end_combo.grid(column=3, row=2, sticky=W)
        Label(self.frame, text='Day').grid(sticky=W)
        self.day_combo = Combobox(self.frame,
                                  state='readonly')  # days combobox
        self.day_combo.grid(column=1, row=3, pady=(0, 20))
        self.search = Button(self.frame,
                             text='Search',
                             width=10,
                             height=2,
                             command=self.add_treeview)  # seach button
        self.search.grid(padx=(0, 50), columnspan=2)
        Label(self.frame, text='Classroom results', bg='gray',
              fg='white').grid(sticky=N + E + W,
                               column=4,
                               row=0,
                               rowspan=5,
                               padx=(55, 0))
        self.scroll = Scrollbar(
            self.frame, orient='vertical')  # vertical scrollbar for treeview
        self.tree = Treeview(self.frame,
                             columns=('', '', '', '', ''),
                             selectmode='extended',
                             show='headings')
        listofcolumn = [
            'Room', 'Traffic', 'Availability %', 'Closeness', 'Overall Score'
        ]  # colums to treeview
        counter = 1
        for column in listofcolumn:
            self.tree.column('#' + str(counter), width=90)  # to resize columns
            self.tree.heading('#' + str(counter), text=column,
                              anchor=CENTER)  # to set headings
            counter += 1
        self.scroll.config(command=self.tree.yview)
        self.tree.config(yscrollcommand=self.scroll.set)
        self.tree.grid(column=4, row=0, rowspan=5, padx=(40, 0), pady=(30, 0))
        self.scroll.grid(column=5,
                         row=0,
                         rowspan=5,
                         sticky=N + S,
                         pady=(30, 0))
        self.urlentry.insert(
            0,
            'https://www.sehir.edu.tr/en/announcements/2018-2019-bahar-donemi-ders-programi'
        )

    def dynamic(self):
        self.color_label.configure(
            bg='yellow'
        )  # make color label yellow at the beginning of the process
        self.update_idletasks()
        self.searcher.fetch(self.urlentry.get(
        ))  # to call fetch method in searcher class to start process
        self.color_label.configure(bg='green')
        room_num = [
            room.room_num
            for room in self.searcher.buildings['ACAD BUILD 1'].classrooms
        ]
        self.where_combo.configure(
            values=[build for build in sorted(self.searcher.buildings)])
        self.where_combo.current(
            0)  # to get values in combobox and set value 0 as a default
        self.room_combo.configure(values=[room for room in sorted(room_num)])
        self.room_combo.current(0)
        self.start_combo.configure(
            values=["{}:00".format(time) for time in range(9, 20)])
        self.start_combo.current(
            0)  # start and end combo both have the same interval from 9 to 19
        self.end_combo.configure(
            values=["{}:00".format(time) for time in range(9, 20)])
        self.end_combo.current(len(self.end_combo['values']) - 1)
        self.day_combo.configure(
            values=["Monday", 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
        self.day_combo.current(0)

    def change_build(
            self, event
    ):  # when where am i combobox chance, room combobox also chance
        building = self.where_combo.get()
        room_num = [
            room.room_num
            for room in self.searcher.buildings[building].classrooms
        ]
        self.room_combo.configure(values=[room for room in sorted(room_num)])
        self.room_combo.current(0)

    def add_treeview(self):  # to add scores in treeview
        self.tree.delete(*self.tree.get_children())
        self.overall_scores = self.searcher.search(
            self.day_combo.get(),
            self.where_combo.get(), self.room_combo.get(),
            self.start_combo.get(), self.end_combo.get()
        )  # key operator for the sorted dict by values which overall score
        for item, score in sorted(self.overall_scores.items(),
                                  key=operator.itemgetter(1),
                                  reverse=True):
            if item.availability_score == 0:  # to avoid from availability score 0
                continue
            room = str(item.classroom.building_num) + str(
                item.classroom.room_num)
            self.tree.insert('',
                             'end',
                             values=(room, item.traffic_score,
                                     item.availability_score,
                                     item.closeness_score, score))
Exemple #13
0
class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.root = master
        self.root.title('FPS(v1.0.0,qing.guo)')
        self.root.geometry('650x400')
        self.root.resizable(0, 0)  # 禁止调整窗口大小
        self.root.protocol("WM_DELETE_WINDOW", self.close)
        self.root.iconbitmap(get_path('fps.ico'))

    def creatWidgets(self):
        frame_left_top = Frame(self.root, width=410, height=220, bg='#C1CDCD')
        frame_left_center = Frame(self.root,
                                  width=410,
                                  height=80,
                                  bg='#C1CDCD')
        frame_left_bottom = Frame(self.root,
                                  width=410,
                                  height=100,
                                  bg='#C1CDCD')
        frame_right = Frame(self.root, width=240, height=400, bg='#C1CDCD')

        frame_left_top.grid_propagate(0)
        frame_left_center.grid_propagate(0)
        frame_left_bottom.grid_propagate(0)
        frame_right.propagate(0)
        frame_right.grid_propagate(0)

        frame_left_top.grid(row=0, column=0)
        frame_left_center.grid(row=1, column=0)
        frame_left_bottom.grid(row=2, column=0)
        frame_right.grid(row=0, column=1, rowspan=3)

        self.v1 = StringVar()
        self.v2 = StringVar()
        self.v3 = StringVar()
        self.v4 = StringVar()
        self.v5 = StringVar()
        self.v6 = StringVar()
        self.v7 = StringVar()
        self.v8 = StringVar()
        self.v4.set('0.2')

        type_list = [u'UI页面', u'视频/电影']
        swipe_list = [u'竖直方向', u'水平方向']
        swipe_config = [u'开启', u'关闭']
        swipe_speed = ['25ms', '50ms',  '75ms', '100ms', '150ms', '200ms', '300ms', '400ms',\
                       '500ms', '600ms', '700ms', '800ms']

        Label(frame_left_top, text=u"测试类型:", bg='#C1CDCD').grid(row=0,
                                                                column=0,
                                                                pady=20,
                                                                sticky=NW,
                                                                padx=5)
        self.cb1 = Combobox(frame_left_top,
                            width=11,
                            textvariable=self.v1,
                            values=type_list)
        self.cb1.grid(row=0, column=1, ipady=1, padx=5)
        # cb1.set(u'Activity页面')
        self.cb1.current(0)
        #Label
        Button(frame_left_top,
               text=u"获取设备id:",
               command=self.set_device,
               bg='#C1CDCD').grid(row=0, column=2, pady=20, padx=13)
        Entry(frame_left_top, width=15, textvariable=self.v2).grid(row=0,
                                                                   column=3,
                                                                   padx=5,
                                                                   ipady=1)

        Label(frame_left_top, text=u"滑动方向:", bg='#C1CDCD').grid(row=1,
                                                                column=0,
                                                                pady=20,
                                                                sticky=NW,
                                                                padx=5)
        self.cb2 = Combobox(frame_left_top,
                            width=11,
                            textvariable=self.v3,
                            values=swipe_list)
        self.cb2.grid(row=1, column=1, ipady=1, padx=5)
        self.cb2.current(0)
        Button(frame_left_top,
               text=u"设置滑动系数:",
               command=self.set_precent,
               bg='#C1CDCD').grid(row=1, column=2, pady=20, sticky=NW, padx=13)
        Entry(frame_left_top, width=15, textvariable=self.v4).grid(row=1,
                                                                   column=3,
                                                                   padx=5,
                                                                   ipady=1)

        Label(frame_left_top, text=u"滑动速度:", bg='#C1CDCD').grid(row=2,
                                                                column=0,
                                                                pady=20,
                                                                sticky=NW,
                                                                padx=5)
        self.cb3 = Combobox(frame_left_top,
                            width=11,
                            textvariable=self.v5,
                            values=swipe_speed)
        self.cb3.grid(row=2, column=1, padx=5, ipady=1)
        self.cb3.current(8)

        Button(frame_left_top,
               text=u"最大滑动次数:",
               command=self.set_max_steps,
               bg='#C1CDCD').grid(row=2, column=2, pady=20, sticky=NW, padx=13)
        Entry(frame_left_top, width=15, textvariable=self.v6).grid(row=2,
                                                                   column=3,
                                                                   padx=5,
                                                                   ipady=1)

        Label(frame_left_center, text=u"自动滑动", bg='#C1CDCD').grid(row=0,
                                                                  column=0,
                                                                  padx=5,
                                                                  sticky=NW,
                                                                  pady=15)
        self.cb4 = Combobox(frame_left_center,
                            width=6,
                            textvariable=self.v7,
                            values=swipe_config)
        self.cb4.grid(row=0, column=1, ipady=1, padx=5)
        self.cb4.current(0)

        self.b1 = Button(frame_left_center,
                         text=u"开始测试",
                         command=self.start_test,
                         bg='#C1CDCD')
        self.b1.grid(row=0, column=2, padx=30, pady=15)
        self.b2 = Button(frame_left_center,
                         text=u"结束测试",
                         command=self.end_test,
                         bg='#C1CDCD')
        self.b2.grid(row=0, column=3, padx=30, pady=15)
        Button(frame_left_bottom,
               text=u"测试结果",
               command=self.open_file,
               bg='#C1CDCD').grid(row=0, column=0, padx=13, pady=15)
        Entry(frame_left_bottom, width=49, textvariable=self.v8).grid(row=0,
                                                                      column=1,
                                                                      ipady=1,
                                                                      padx=10,
                                                                      pady=15)
        self.v8.set(MyThread.path)
        #Scrollbar
        scrollbar = Scrollbar(frame_right)
        scrollbar.pack(side=RIGHT, fill=Y)
        self.text_msglist = Text(frame_right,
                                 yscrollcommand=scrollbar.set,
                                 bg='#C1CDCD')
        self.text_msglist.pack(side=RIGHT, fill=BOTH)

        scrollbar['command'] = self.text_msglist.yview

        self.text_msglist.tag_config('green', foreground='#008B00')
        self.text_msglist.tag_config('blue', foreground='#0000FF')
        self.text_msglist.tag_config('red', foreground='#FF3030')
        self.text_msglist.tag_config('purple', foreground='#CD00CD')

        self.cb1.bind('<<ComboboxSelected>>', self.cb1_select)
        self.cb2.bind('<<ComboboxSelected>>', self.cb2_select)
        text_message = u"测试前请打开需要测试的页面,测试过程中需保持在同一Activity界面中,切换到其他Activity则无数据输出\n\n"
        self.text_msglist.insert(END, text_message, 'green')

    def cb1_select(self, event):
        if self.v1.get() == u'视频/电影':
            self.cb4.current(1)
        else:
            self.cb4.current(0)

    def cb2_select(self, event):
        if self.v3.get() == u'水平方向':
            self.cb3.current(2)
        else:
            self.cb3.current(8)

    def start_test(self):

        MyThread.myThread1.set_flag('False')
        self.b1.config(state=DISABLED)
        self.b2.config(state=NORMAL)
        test_type = self.v1.get()
        device = self.v2.get()
        direction = self.v3.get()
        ratio = self.v4.get()
        speed = self.v5.get()
        max_steps = self.v6.get()
        auto = self.v7.get()

        if device == '' or device.isspace():
            self.text_msglist.insert(END, 'please input device id\n', 'red')
            self.b1.config(state=NORMAL)
            return -1
        elif auto == u'开启':
            try:
                ratio = float(ratio)
            except ValueError:
                self.text_msglist.insert(END, 'please input swipe precent\n',
                                         'red')
                self.b1.config(state=NORMAL)
                return -1
            if ratio < 0 or ratio >= 0.5:
                self.text_msglist.insert(END, 'precent range is [0,0.5)\n',
                                         'red')
                self.b1.config(state=NORMAL)
                return -1
            elif max_steps == '' or max_steps.isspace(
            ) or not max_steps.isdigit():
                self.text_msglist.insert(END, 'please input swipe precent\n',
                                         'red')
                self.b1.config(state=NORMAL)
                return -1
        if auto == u'关闭':
            ratio = 0
            max_steps = 0
        thread1 = MyThread.myThread1(1, device, direction, speed, ratio,
                                     max_steps, test_type, auto,
                                     self.text_msglist)
        thread1.setDaemon(True)
        thread1.start()

    def end_test(self):
        self.b1.config(state=NORMAL)
        MyThread.myThread1.set_flag('True')
        self.b2.config(state=DISABLED)

    def set_device(self):
        device_info = os.popen('adb devices').readlines()
        device = device_info[-2]
        device_id = device.split('\t')[0]
        self.v2.set(device_id)
        self.text_msglist.insert(END, u'请确认获取的设备id正确,默认获取最新连接的设备\n\n', 'green')
        self.text_msglist.see(END)

    def set_precent(self):
        self.text_msglist.insert(
            END, u'滑动系数n(0>=n<0.5,表示屏幕两端各减去n倍屏宽或长),剩下的区域即为实际滑动的区域。\n', 'green')
        self.text_msglist.insert(END, u'当UI布局为全屏时,可以设置0表示全屏滑动\n\n', 'green')
        self.text_msglist.see(END)

    def set_max_steps(self):
        self.text_msglist.insert(END, u'最大滑动次数max,表示滑动达到最大次数后,反向滑动,如此循环\n\n',
                                 'green')
        self.text_msglist.see(END)

    def open_file(self):
        filename = tkFileDialog.askopenfilename(initialdir=MyThread.path)
        if filename == '':
            return 0
        os.startfile(filename)

    def close(self):
        if MyThread.flag:
            print MyThread.flag
            result = tkMessageBox.askokcancel(title=u"退出", message=u"确定退出程序?")
        else:
            result = tkMessageBox.askokcancel(title=u"警告",
                                              message=u"测试还未完成,确定要退出程序?")
        if result:
            self.root.quit()
            self.root.destroy()
Exemple #14
0
class App(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.levels = list()
        self.signs = list()
        self.items = [i for i in range(0,64)]
        self.items.remove(16)
        self.current_item = 0
        self.parent = parent
        self.max_width = 600
        self.max_height = 600
        self.client = Client()
        self.initDimensions()
        self.initUI()
        self.event = None
        self.reset_canvas()

    def connect(self):

        res = self.client.regis()
        if(res == 1):
            time.sleep(1)
            self.connect_button.config(state = 'disabled')
            self.disconnect_button.config(state = 'normal')

    def disconnect(self):
        self.client.close()
        self.connect_button.config(state = 'normal')
        self.disconnect_button.config(state = 'disabled')


    def initDimensions(self):
        self.canvas_width = self.max_width
        self.canvas_height = self.max_height
        self.rows = 10
        self.cols = 10
        # self.h = 1;
        self.cellwidth = self.canvas_width/self.cols
        self.cellheight = self.canvas_height/self.rows
        self.initData()

    def add_new_level(self):
        temp=dict()
        temp2 = dict()
        self.levels.append(temp)
        self.signs.append(temp2)

    def insert_new_level(self, loc):
        temp=dict()
        temp2 = dict()
        self.levels.insert(loc,temp)
        self.signs.insert(loc,temp2)

    def initData(self):
        self.levels = list()
        self.signs = list()
        self.rect = dict()
        self.rect_text = dict()
        self.curr_level = 0
        self.overlay_level = 0
        self.overlayToggle = False
        self.levels.append(dict())
        self.signs.append(dict())
        self.current_item = 1


    def reset_canvas(self):
        self.canvas.delete(ALL)
        self.parent.title("Craft Builder: Dimensions: " + str(self.rows) + 'x' + str(len(self.levels)) +'x' + str(self.cols))

    def redraw_overlay(self):
        c = set(self.levels[self.overlay_level].keys())
        if self.overlayToggle == 1:
            for key in c:
                x1 = key[1] * self.cellwidth
                y1 = (self.rows - key[0] - 1) * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight

                if (key[0], key[1]) in self.rect:
                    self.canvas.itemconfig(self.rect[key[0],key[1]], width = OVERLAYWIDTH)
                else:
                    self.rect[key[0],key[1]] = self.canvas.create_rectangle(x1,y1,x2,y2, fill='white', outline = 'black', width = OVERLAYWIDTH, tag = 'block')
                    self.rect_text[key[0],key[1]] = self.canvas.create_text((x1+x2)/2,(y1+y2)/2, text = '', font=('verdana', 7), tag = 'blocktext')

    def redraw_level(self):
        # self.canvas.delete(ALL)

        # self.rect=dict()
        # self.rect_text = dict()
        start = time.clock()

        b = set(self.levels[self.curr_level].keys())

        for key in b:
            val = self.levels[self.curr_level][key]
            if (key[0], key[1]) in self.rect:
                self.canvas.itemconfig(self.rect[key[0],key[1]], fill = COLORS[val], outline = 'black', width = DEFAULTWIDTH)
                self.canvas.itemconfig(self.rect_text[key[0],key[1]], text = val)
            else:
                x1 = key[1] * self.cellwidth
                y1 = (self.rows - key[0] - 1) * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight
                self.rect[key[0],key[1]] = self.canvas.create_rectangle(x1,y1,x2,y2, fill = COLORS[val], outline = 'black', width = DEFAULTWIDTH, tag = 'block')
                self.rect_text[key[0],key[1]] = self.canvas.create_text((x1+x2)/2,(y1+y2)/2, text = val, font=('verdana', 7), tag = 'blocktext')

        items_to_remove = list()
        for key in self.rect:
            if key not in self.levels[self.curr_level]:
                self.canvas.delete(self.rect[key[0],key[1]])
                self.canvas.delete(self.rect_text[key[0],key[1]])
                items_to_remove.append(key)
        for i in items_to_remove:
            self.rect.pop(i)
            self.rect_text.pop(i)


        self.parent.title("Craft Builder: Dimensions: " + str(self.rows) + 'x' + str(len(self.levels)) +'x' + str(self.cols))
        self.redraw_overlay()




    def updateDimensions(self,r,c,y=1):
        self.rows = r
        self.cols = c

        self.cellwidth = self.max_width/self.cols
        self.cellheight = self.max_height/self.rows
        if(self.cellwidth<=self.cellheight):
            self.cellheight = self.cellwidth
        else:
            self.cellwidth = self.cellheight
        self.canvas_height = self.rows * self.cellheight
        self.canvas_width = self.cols * self.cellwidth
        self.canvas.config(width = self.canvas_width, height = self.canvas_height)

        self.canvas.delete(ALL)
        self.initData()
        for i in range(y-1):
            self.levels.append(dict())
            self.signs.append(dict())

    def altMenu(self, event):
        # print "Keycode:", event.keycode, "State:", event.keysym, event.type
        self.event = event
        if event.type == '2':
            self.altAction = True
            self.clear_button.config(text = 'Multi Clear', bg = 'white')
            self.delete_button.config(text = 'Multi Delete', bg='white')
            self.insert_button.config(text = 'Multi Insert', bg='white')
            self.copy_level_button.config(text = 'Multi Copy', bg = 'white')
        elif event.type == '3':
            defaultbg = self.parent.cget('bg')
            self.altAction = False
            self.clear_button.config(text = 'Clear Level', bg = defaultbg)
            self.delete_button.config(text = 'Delete', bg = defaultbg)
            self.insert_button.config(text = 'Insert', bg = defaultbg)
            self.copy_level_button.config(text = 'Copy overlay level', bg = defaultbg)
        sys.stdout.flush()

    def initUI(self):

        self.altAction = False
        self.parent.title("Craft Builder")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=0)

        self.columnconfigure(0, pad = 7)
        self.columnconfigure(1, pad = 7)
        self.columnconfigure(2, pad = 7)
        self.columnconfigure(9, weight =1 )
        self.columnconfigure(3, pad=7)
        self.columnconfigure(5, pad=7)

        self.rowconfigure(1, weight=1)
        self.rowconfigure(5, pad=7)
        self.rowconfigure(6, pad=7)
        self.rowconfigure(7, pad=7)
        self.rowconfigure(8, pad=7)

        area = Frame(self, width=500, height=500, borderwidth = 2, relief = 'sunken')
        area.grid(row=1, column=0, columnspan=11, rowspan=4,
            padx=5, sticky=E+W+S+N)

        self.canvas = Canvas(area, bg='white', width=self.canvas_width, height=self.canvas_height)

        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.callbackLeftClick)
        self.canvas.bind("<B1-Motion>", self.callbackLeftClick)
        self.canvas.bind("<Button-3>", self.callbackRightClick)
        self.canvas.bind("<B3-Motion>", self.callbackRightClick)
        self.canvas.bind("<Button-5>", self.scrollWheel)
        self.canvas.bind("<Button-4>", self.scrollWheel)
        self.parent.bind("<Shift_L>", self.altMenu)
        self.parent.bind("<KeyRelease-Shift_L>", self.altMenu)


        self.new_button = Button(self, text="New", command = self.onNew, width = 6)
        self.new_button.grid(row=5, column=0)

        save_button = Button(self, text="Save", command = self.onSave, width = 6)
        save_button.grid(row=6, column=0)

        load_button = Button(self, text="Load", command = self.onLoad, width = 6)
        load_button.grid(row=7, column=0)

        self.connect_button = Button(self, text="Connect", command = self.connect, width = 6)
        self.connect_button.grid(row=8, column=0)

        self.clear_button = Button(self, text="Clear Level", command = self.onClear, width =8)
        self.clear_button.grid(row=5, column=1)

        self.delete_button = Button(self, text="Delete Level", command = self.onDelete, width =8)
        self.delete_button.grid(row=6, column=1)

        self.insert_button = Button(self, text="Insert Level", command = self.onInsertLevel, width =8)
        self.insert_button.grid(row=7, column=1)

        self.disconnect_button = Button(self, text="Disconnect", command = self.disconnect, width = 8)
        self.disconnect_button.grid(row=8, column=1)
        self.disconnect_button['state'] = 'disabled'

        lbl_a = Label(self, text="Curr. Level", font=("Verdana", 10))
        lbl_a.grid(row = 5, column = 2)

        lbl_b = Label(self, text="Overlay Level", font=("Verdana", 10))
        lbl_b.grid(row = 6, column = 2)

        self.copy_level_button = Button(self, text="Copy overlay level", command = self.onCopy, width = 12)
        self.copy_level_button.grid(row=7, column=2, columnspan=1)

        load_world_button = Button(self, text="Load from world", command = self.onLoadFromWorld, width = 12)
        load_world_button.grid(row=8, column=2)

        self.currLevelCombo = Combobox(self, values = range(len(self.levels)), width = 5, state = 'readonly')
        self.currLevelCombo.grid(row = 5, column = 3)
        self.currLevelCombo.bind("<<ComboboxSelected>>", self.currLevelChooser)
        self.currLevelCombo.set(0)

        self.overlayLevelCombo = Combobox(self, values = range(len(self.levels)), width = 5, state = 'readonly')
        self.overlayLevelCombo.grid(row = 6, column = 3)
        self.overlayLevelCombo.bind("<<ComboboxSelected>>", self.overlayLevelChooser)
        self.overlayLevelCombo.set(0)


        self.new_level_button = Button(self, text="New Level", command = self.onNewLevel, width = 12)
        self.new_level_button.grid(row=7, column=3,columnspan=1)

        paste_button = Button(self, text="Paste in world", command = self.onPaste, width = 12)
        paste_button.grid(row=8, column=3)

        lbl_d = Label(self, text="Item", font=("Verdana", 10))
        lbl_d.grid(row = 5, column = 4)

        self.toggle = Checkbutton(self, text="Overlay Toggle", command = self.onToggle)
        self.toggle.grid(row=6, column=4)

        rotate_button = Button(self, text="Rotate", command = self.onRotate, width = 12)
        rotate_button.grid(row=7, column=4,columnspan=1)

        paste_sign_button = Button(self, text="Paste Signs", command = self.onPasteSign, width = 12)
        paste_sign_button.grid(row=8, column=4)

        self.itemCombo = Combobox(self, values = self.items, width = 5, state = 'readonly')
        self.itemCombo.grid(row = 5, column = 5)
        self.itemCombo.bind("<<ComboboxSelected>>", self.itemChooser)
        self.itemCombo.set(1)
        self.current_item = 1
        self.lbl_e = Label(self, text="", font=("Verdana", 8), width = 12, relief = 'ridge')
        self.lbl_e.grid(row = 6, column = 5)

        add_geo_button = Button(self, text="Add Geometry", command = self.addGeo, width = 12)
        add_geo_button.grid(row=8, column=5)

        try:
            global builder
            import builder
        except ImportError:
            add_geo_button.config(state = 'disabled')

    def scrollWheel(self, event):
        if event.num == 5:
            #scroll down
            if self.curr_level==len(self.levels) -1:
                pass
            else:
                self.curr_level = self.curr_level + 1
                self.currLevelCombo.set(self.curr_level)
                self.redraw_level()
        else:
            #scroll up
            if self.curr_level == 0:
                pass
            else:
                self.curr_level = self.curr_level - 1
                self.currLevelCombo.set(self.curr_level)
                self.redraw_level()

    def onInsertLevel(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter num_levels to insert and level below which to insert\n" +
                                                                 "seperated by a space.")
            self.wait_window(self.w.top)
            self.altAction = 0
            data = self.w.value.split(' ')
            try:
                if len(data) == 2:
                    for i in range(int(data[0])):
                        self.insert_new_level(int(data[1]))
                    self.redraw_level()
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'


        else:
            self.insert_new_level(self.curr_level)
            self.currLevelCombo.config(values = range(len(self.levels)))
            self.overlayLevelCombo.config(values = range(len(self.levels)))
            self.redraw_level()

    def onCopy(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter the arguments start_level end_level num_times\n" +
                                                                 "and level above which to copy, all seperated by spaces.")
            self.wait_window(self.w.top)
            self.altAction = 0

            data = self.w.value.split(' ')
            try:
                if len(data) == 4:
                    st,sto = sorted((data[0],data[1]))
                    st = int(st)
                    sto = int(sto)
                    n = data[2]
                    l = int(data[3]) + 1
                    for i in range(int(n)):
                        for j in range(st, sto +1):
                            for col in range(self.cols):
                                for row in range(self.rows):
                                    if (row,col) in self.levels[j]:
                                        if  l+j-st < len(self.levels) :
                                            self.levels[l+j-st][row,col] = self.levels[j][row,col]
                        l = l +(sto-st+1)
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'

        else:
            for col in range(self.cols):
                for row in range(self.rows):
                    if (row,col) in self.levels[self.overlay_level]:
                       self.levels[self.curr_level][row,col] = self.levels[self.overlay_level][row,col]
        sys.stdout.flush()
        self.redraw_level()



    def onClear(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter the arguments start_level end_levels to clear\n" +
                                                                 "seperated by a space.")
            self.wait_window(self.w.top)
            self.altAction = 0
            data = self.w.value.split()
            try:
                if len(data) == 2:
                    st,sto = sorted((data[0],data[1]))
                    st = int(st)
                    sto = int(sto)
                    for i in range(st,sto+1):
                        if i < len(self.levels):
                            self.levels[i] = dict()
                            self.signs[i] = dict()
                    self.redraw_level()
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'
        else:
            if tkMessageBox.askquestion('Clear', "Clear Level: " + str(self.curr_level)) == 'yes':
                self.levels[self.curr_level] = dict()
                self.signs[self.curr_level] = dict()
                self.redraw_level()
            else:
                pass

    def onDelete(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter the arguments start_level end_levels to delete\n" +
                                                                 "seperated by a space.")
            self.wait_window(self.w.top)
            self.altAction = 0
            data = self.w.value.split()
            try:
                if len(data) == 2:
                    st,sto = sorted((data[0],data[1]))
                    st = int(st)
                    sto = int(sto)
                    for i in range(sto,st-1,-1):
                        if i < len(self.levels) and i >=0 and len(self.levels)>1:
                            self.levels.pop(i)
                            self.signs.pop(i)
                        elif i < len(self.levels) and i ==0 :
                            self.levels[i] = dict()
                            self.signs[i] = dict()

                    self.currLevelCombo.config(values = range(len(self.levels)))
                    self.overlayLevelCombo.config(values = range(len(self.levels)))
                    self.curr_level = 0
                    self.currLevelCombo.set(0)
                    self.overlayLevelCombo.set(0)
                    self.redraw_level()
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'

        else:
            if tkMessageBox.askquestion('Delete', "Delete Level: " + str(self.curr_level)) == 'yes':
                if len(self.levels) == 1:
                    self.onClear()
                else:
                    self.levels.pop(self.curr_level)
                    self.signs.pop(self.curr_level)
                    self.currLevelCombo.config(values = range(len(self.levels)))
                    self.overlayLevelCombo.config(values = range(len(self.levels)))

                    if self.overlayToggle == 1:
                        self.toggle.invoke()
                        self.overlayToggle = 0

                    if self.curr_level != 0:
                        self.curr_level = self.curr_level - 1
                        self.currLevelCombo.set(self.curr_level)
                    else:
                        self.currLevelCombo.set(self.curr_level)
                    self.redraw_level()

    def addGeo(self):
        self.w=popupWindow(self,title = "Enter Command: help for Help")
        self.wait_window(self.w.top)

        try:
            c = self.w.value.split(' ')
            if c[0] == 'help':
                self.h = HelpWindow(self, title = 'Enter command followed by args seperated by spaces\n' +
                                                                    'Available commands (sphere, pyramid, cuboid)\n' +
                                                                    '1.   pyramid x1 x2 y z1 z2 fill(0/1) \n' +
                                                                    '2.   sphere cx cy cz r fill(0/1) \n' +
                                                                    '4.   circle_x x y z r fill(0/1) \n' +
                                                                    '5.   circle_y x y z r fill(0/1) \n' +
                                                                    '6.   circle_z x y z r fill(0/1) \n' +
                                                                    '7.   cylinder_x x1 x2 y z r fill(0/1) \n' +
                                                                    '8.   cylinder_y x y1 y2 z r fill(0/1) \n' +
                                                                    '9.   cylinder_z x y z1 z2 r fill(0/1) \n' +
                                                                    '10. cuboid x1 x2 y1 y2 z1 z2 fill(0/1) \n' )
            elif c[0] == 'sphere':
                if len(c) - 1 == 5:
                    result = builder.sphere(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >=0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item

            elif c[0] == 'pyramid':
                if len(c) - 1 == 6:
                    result = builder.pyramid(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item

            elif c[0] == 'circle_x':
                if len(c) - 1 == 5:
                    result = builder.circle_x(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'circle_y':
                if len(c) - 1 == 5:
                    result = builder.circle_y(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'circle_z':
                if len(c) - 1 == 5:
                    result = builder.circle_z(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'cylinder_x':
                if len(c) - 1 == 6:
                    x1,x2 = sorted([int(c[1]),int(c[2])])
                    result = builder.cylinder_x(x1,x2,int(c[3]),int(c[4]),int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'cylinder_y':
                if len(c) - 1 == 6:
                    y1,y2 = sorted([int(c[2]),int(c[3])])
                    result = builder.cylinder_y(int(c[1]),y1,y2,int(c[4]),int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'cylinder_z':
                if len(c) - 1 == 6:
                    z1,z2 = sorted([int(c[3]),int(c[4])])
                    result = builder.cylinder_z(int(c[1]),int(c[2]),z1,z2,int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item

            elif c[0] == 'cuboid':
                if len(c) - 1 == 7:
                    result = builder.cuboid(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]),int(c[6]),int(c[7]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
                pass

            newLevels = list()
            for i, j in enumerate(self.levels):
                temp = dict()
                for key, val in j.iteritems():
                    if int(val) != 0:
                        temp[key] = val
                newLevels.append(temp)

            self.levels = newLevels

            self.redraw_level()

        except RuntimeError:
            pass

    def onPaste(self):
        self.w=popupWindow(self,title = "On world, facing north (i.e x increases ahead of you,\n"+
                                                            "and z increases to your right.\n" +
                                                            "Enter origin point (x y z) seperated by spaces: eg. 12 12 12:")
        self.wait_window(self.w.top)
        data = self.w.value.split(' ')
        try:
            xo = int(data[0])
            yo = int(data[1])
            zo = int(data[2])
            if tkMessageBox.askquestion('Coords', "Is this (x,y,z) correct: " + str(xo) +',' +str(yo) + ',' + str(zo)) == 'yes':
                print 'Pasting'
                count = 0
                for j,i in enumerate(self.levels):
                    for key,value in i.iteritems():
                        xr = int(xo + key[0])
                        yr = int(yo + j)
                        zr = int(zo + key[1])
                        # self.client.client_send(xr,yr,zr,0)
                        if int(value) != 0:
                            self.client.client_send(xr,yr,zr,int(value))
                            count = count + 1
                        if count % NUMPERSEC == 0:
                            time.sleep(1)
            else:
                pass
        except ValueError:
            pass

    def onPasteSign(self):
        self.w=popupWindow(self,title = "Facing north, enter origin point(x y z): eg. 12 12 12:")
        self.wait_window(self.w.top)
        data = self.w.value.split(' ')
        try:
            xo = int(data[0])
            yo = int(data[1])
            zo = int(data[2])
            if tkMessageBox.askquestion('Coords', "Is this (x,y,z) correct: " + str(xo) +',' +str(yo) + ',' + str(zo)) == 'yes':
                print 'Pasting'
                count = 0
                for j,i in enumerate(self.signs):
                    for key,value in i.iteritems():
                        xr = int(xo + key[0])
                        yr = int(yo + j)
                        zr = int(zo + key[1])

                        for num,val in enumerate(value):
                            if val!=-1:
                                # print j,i,num, val
                                self.client.client_send_sign(xr, yr, zr, num, val)
                        sys.stdout.flush()
        except ValueError:
            pass

    def onLoadFromWorld(self):
        self.w=popupWindow(self,title = "Enter bottom left point: (x y z)")
        self.wait_window(self.w.top)
        try:
            [x1,y1,z1] = [int(i) for i in self.w.value.split(' ')]

            self.w=popupWindow(self,title = "Enter top right point: (x y z)")
            self.wait_window(self.w.top)
            [x2,y2,z2] = [int(i) for i in self.w.value.split(' ')]

            x1,x2 =  sorted([x1,x2])
            y1,y2 =  sorted([y1,y2])
            z1,z2 =  sorted([z1,z2])

            if tkMessageBox.askquestion('Coords', "Bottom left: " + str(x1) +',' +str(y1) + ',' + str(z1) + '\n' + \
                "Top right: " + str(x2) +',' +str(y2) + ',' + str(z2)) == 'yes':
                print 'Copying',x1,y1,z1,' to',x2,y2,z2
                data = self.client.read_db(x1,y1,z1,x2,y2,z2, db_name)
                signs = self.client.read_signs(x1,y1,z1,x2,y2,z2, db_name)
                newData = list()

                for i in data:
                    temp = dict()
                    for key,value in i.iteritems():
                        if value != 0:
                            temp[key[0], key[1]] = value
                    newData.append(temp)

                newSignData = list()
                for i in signs:
                    temp = dict()
                    for key,value in i.iteritems():
                        temp[key[0], key[1]] = value
                    newSignData.append(temp)

                if self.overlayToggle == 1:
                    self.toggle.invoke()
                    self.overlayToggle = 0
                self.updateDimensions(x2-x1+1, z2-z1+1, len(newData))
                self.reset_canvas()
                self.levels = newData
                self.signs = newSignData
                sys.stdout.flush()

                self.redraw_level()
                self.currLevelCombo.config(values = range(len(self.levels)))
                self.overlayLevelCombo.config(values = range(len(self.levels)))
        except ValueError:
            pass

    def onSave(self):
        filename = asksaveasfilename(parent=self)
        pickle.dump({'Dimensions' : [self.rows,self.cols,len(self.levels)],'Levels' : self.levels, 'Signs' : self.signs}, open(filename, 'wb'))

    def onLoad(self):
        if self.overlayToggle == 1:
            self.toggle.invoke()
            self.overlayToggle = 0

        filename = askopenfilename(parent=self)
        try:
            obj = pickle.load(open(filename, 'rb'))
            self.updateDimensions(int(obj['Dimensions'][0]), int(obj['Dimensions'][1]), int(obj['Dimensions'][2]))
            self.reset_canvas()
            self.levels = obj['Levels']

            if 'Signs' in obj:
                self.signs = obj['Signs']
            self.redraw_level()
            self.currLevelCombo.config(values = range(len(self.levels)))
            self.overlayLevelCombo.config(values = range(len(self.levels)))
        except IOError:
            pass

    def onToggle(self):
        if self.overlayToggle == 0:
            self.overlayToggle =1
            self.redraw_level()
        else:
            self.overlayToggle = 0
            self.redraw_level()

    def onNewLevel(self):
        self.add_new_level()
        self.currLevelCombo.config(values = range(len(self.levels)))
        self.overlayLevelCombo.config(values = range(len(self.levels)))
        self.redraw_level()

    def onRotate(self):
        self.rotatedData = list()
        self.rotatedSignData = list()

        for i in self.levels:
            temp = dict()
            for key,value in i.iteritems():
                xr = (key[0] * math.cos(math.radians(-90)) - (key[1]) * math.sin(math.radians(-90)))
                zr = (key[0] * math.sin(math.radians(-90)) + (key[1]) * math.cos(math.radians(-90)))
                temp[int(math.floor(xr)),int(math.floor(zr))] = value
            self.rotatedData.append(temp)

        sign_map = {0:2, 3:0, 1:3, 2:1, 6:5, 7:6, 4:7, 5:4} #FOR ROTATION CALCULATION
        for i in self.signs:
            temp = dict()
            for key,value in i.iteritems():
                xr = (key[0] * math.cos(math.radians(-90)) - (key[1]) * math.sin(math.radians(-90)))
                zr = (key[0] * math.sin(math.radians(-90)) + (key[1]) * math.cos(math.radians(-90)))
                new_value = [value[sign_map[0]],
                                      value[sign_map[1]],
                                      value[sign_map[2]],
                                      value[sign_map[3]],
                                      value[sign_map[4]],
                                      value[sign_map[5]],
                                      value[sign_map[6]],
                                      value[sign_map[7]]]
                temp[int(math.floor(xr)),int(math.floor(zr))] = new_value
            self.rotatedSignData.append(temp)

        #Moving to origin x,z : 0,0
        self.newData=list()
        self.newSignData=list()
        for i in self.rotatedData:
            temp=dict()
            for key,value in i.iteritems():
                temp[key[0], int(key[1])+int((self.rows-1))] = value
            self.newData.append(temp)
        for i in self.rotatedSignData:
            temp=dict()
            for key,value in i.iteritems():
                temp[key[0], int(key[1])+int((self.rows-1))] = value
            self.newSignData.append(temp)


        temp = self.rows
        self.rows = self.cols
        self.cols = temp

        temp = self.curr_level
        temp2 = self.overlay_level
        temp3 = self.overlayToggle
        temp4 = self.current_item

        self.updateDimensions(self.rows, self.cols,len(self.newData))
        self.reset_canvas()
        self.levels = self.newData
        self.signs = self.newSignData
        self.curr_level = temp
        self.overlay_level = temp2
        self.overlayToggle = temp3

        self.itemCombo.set(temp4)
        self.currLevelCombo.config(values = range(len(self.levels)))
        self.overlayLevelCombo.config(values = range(len(self.levels)))
        self.currLevelCombo.set(self.curr_level)
        self.overlayLevelCombo.set(self.overlay_level)
        self.redraw_level()


    def onNew(self):
        if self.overlayToggle == 1:
            self.toggle.invoke()
            self.overlayToggle = 0
        self.w=popupWindow(self,title = "Enter Dimensions in XxZxY format (e.g. 10x20x3)")
        self.wait_window(self.w.top)
        try:
            data = self.w.value.split('x')
            if len(data) == 2:
                self.updateDimensions(int(data[0]), int(data[1]),1)
            else:
                self.updateDimensions(int(data[0]), int(data[1]),int(data[2]))
            # self.initData()
            self.reset_canvas()
            self.currLevelCombo.config(values = range(len(self.levels)))
            self.overlayLevelCombo.config(values = range(len(self.levels)))
        except ValueError:
            pass

    def currLevelChooser(self, event):
        self.curr_level = int(self.currLevelCombo.get())
        self.redraw_level()

    def overlayLevelChooser(self, event):
        self.overlay_level = int(self.overlayLevelCombo.get())
        self.redraw_level()

    def itemChooser(self, event):
        self.current_item = int(self.itemCombo.get())

    def callbackLeftClick(self,event):
        if self.current_item == 0:
            return
        col = int(math.floor((event.x)/self.cellwidth))
        row = int(math.floor((event.y)/self.cellheight))
        x1 = col * self.cellwidth
        y1 = row * self.cellheight
        x2 = x1 + self.cellwidth
        y2 = y1 + self.cellheight

        if (self.rows - row - 1,col) in self.rect:
            self.canvas.itemconfig(self.rect[self.rows - row - 1,col],fill=COLORS[self.current_item])
            self.canvas.itemconfig(self.rect_text[self.rows - row - 1,col], text = str(self.current_item))
        else:
            self.rect[self.rows - row - 1,col] = self.canvas.create_rectangle(x1,y1,x2,y2, fill=COLORS[self.current_item], outline = 'black', width = DEFAULTWIDTH, tag = 'block')
            self.rect_text[self.rows - row - 1,col] = self.canvas.create_text((x1+x2)/2,(y1+y2)/2, text = self.current_item, font=('verdana', 7), tag = 'blocktext')

        self.levels[self.curr_level][self.rows - row - 1,col] = self.current_item

        if row < self.rows and row >=0 and col < self.cols and col >= 0:
            self.lbl_e.config(text = 'x,y,z: ' + str(self.rows-row-1) + ',' + str(self.curr_level) + ',' + str(col))

    def callbackRightClick(self,event):
        col = int(math.floor((event.x)/self.cellwidth))
        row = int(math.floor((event.y)/self.cellheight))

        if (self.rows - row - 1,col) in self.rect:
            self.canvas.delete(self.rect[self.rows - row - 1,col])
            self.canvas.delete(self.rect_text[self.rows - row - 1,col])
            self.rect.pop((self.rows - row -1, col))
            self.rect_text.pop((self.rows - row -1, col))

        self.levels[self.curr_level].pop((self.rows - row - 1,col),None)

        if row < self.rows and row >=0 and col < self.cols and col >= 0:
            self.lbl_e.config(text = 'x,y,z: ' + str(self.rows-row-1) + ',' + str(self.curr_level) + ',' + str(col))
Exemple #15
0
class MainFrame(Frame):
    def __init__(self, parent, stdoutq):
        Frame.__init__(self, parent)

        self.parent = parent
        self.width = 750
        self.height = 450
        self.title = ximaexport.__version__
        self.stdoutq = stdoutq

        self.initUI()

        self.hasdb = False
        self.hasout = False
        self.exit = False

        self.path_frame = self.addPathFrame()
        self.action_frame = self.addActionFrame()
        self.message_frame = self.addMessageFrame()
        self.printStr()

        self.stateq = Queue.Queue()

    def centerWindow(self):
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        x = (sw - self.width) / 2
        y = (sh - self.height) / 2
        self.parent.geometry('%dx%d+%d+%d' \
                %(self.width,self.height,x,y))

    def initUI(self):
        self.parent.title(self.title)
        self.style = Style()
        #Choose from default, clam, alt, classic
        self.style.theme_use('alt')
        self.pack(fill=tk.BOTH, expand=True)
        self.centerWindow()

    def printStr(self):
        while self.stdoutq.qsize() and self.exit == False:
            try:
                msg = self.stdoutq.get()
                self.text.update()
                self.text.insert(tk.END, msg)
                self.text.see(tk.END)
            except Queue.Empty:
                pass
        self.after(100, self.printStr)

    def checkReady(self):

        if self.hasdb and self.hasout:
            self.start_button.configure(state=tk.NORMAL)
            #print('XimaExport Ready.')
            printch('XimaExport 就绪.')
        else:
            self.start_button.configure(state=tk.DISABLED)

    def addPathFrame(self):
        frame = Frame(self)
        frame.pack(fill=tk.X, expand=0, side=tk.TOP, padx=8, pady=5)

        frame.columnconfigure(1, weight=1)

        #------------------Database file------------------
        label=tk.Label(frame,text=dgbk('ting.sqlite文件:'),\
                bg='#bbb')
        label.grid(row=0,column=0,\
                sticky=tk.W,padx=8)

        self.db_entry = tk.Entry(frame)
        self.db_entry.grid(row=0, column=1, sticky=tk.W + tk.E, padx=8)

        self.db_button = tk.Button(frame,
                                   text=dgbk('打开'),
                                   command=self.openFile)
        self.db_button.grid(row=0, column=2, padx=8, sticky=tk.E)

        #--------------------Output dir--------------------
        label2=tk.Label(frame,text=dgbk('导出到文件夹:'),\
                bg='#bbb')
        label2.grid(row=2,column=0,\
                sticky=tk.W,padx=8)

        self.out_entry = tk.Entry(frame)
        self.out_entry.grid(row=2, column=1, sticky=tk.W + tk.E, padx=8)
        self.out_button = tk.Button(frame,
                                    text=dgbk('选择'),
                                    command=self.openDir)
        self.out_button.grid(row=2, column=2, padx=8, sticky=tk.E)

    def openDir(self):
        self.out_entry.delete(0, tk.END)
        dirname = askdirectory()
        self.out_entry.insert(tk.END, dirname)
        if len(dirname) > 0:
            #print('Output folder: %s' %dirname)
            printch('输出到文件夹:')
            print('   ' + dirname)
            self.hasout = True
            self.checkReady()

    def openFile(self):
        self.db_entry.delete(0, tk.END)
        ftypes = [('sqlite files', '*.sqlite'), ('ALL files', '*')]
        filename = askopenfilename(filetypes=ftypes)
        self.db_entry.insert(tk.END, filename)
        if len(filename) > 0:
            #print('Database file: %s' %filename)
            printch('数据文件:')
            print('   ' + filename)
            self.probeAlbums()

    def probeAlbums(self):
        dbfile = self.db_entry.get()
        try:
            db = sqlite3.connect(dbfile)
            df = ximaexport.getData(db)
            self.albumlist = ximaexport.getAlbumList(df, None)  #(id, name)
            self.albumnames = ['All'] + [ii[1] for ii in self.albumlist
                                         ]  #names to display
            self.albummenu['values'] = tuple(self.albumnames)
            self.albummenu.current(0)
            db.close()

            self.hasdb = True
            self.checkReady()

        except Exception as e:
            #print('Failed to recoganize the given database file.')
            printch('无法识别sqlite数据文件.')
            print(e)

    def addActionFrame(self):

        frame = Frame(self, relief=tk.RAISED, borderwidth=1)
        frame.pack(fill=tk.X,side=tk.TOP,\
                expand=0,padx=8,pady=5)

        #label=tk.Label(frame,text='Actions:',bg='#bbb')
        #label.grid(row=0,column=0,sticky=tk.W,padx=8)

        #---------------Action checkbuttons---------------
        frame.columnconfigure(0, weight=1)

        #---------------------2nd row---------------------
        subframe = Frame(frame)
        subframe.grid(row=1,column=0,columnspan=6,sticky=tk.W+tk.E,\
                pady=5)

        #-------------------Album options-------------------
        albumlabel=tk.Label(subframe,text=dgbk('专辑:'),\
                bg='#bbb')
        albumlabel.pack(side=tk.LEFT, padx=8)

        self.album = tk.StringVar()
        self.albumnames = [
            'All',
        ]
        self.albummenu=Combobox(subframe,textvariable=\
                self.album,values=self.albumnames,state='readonly')
        self.albummenu.current(0)
        self.albummenu.bind('<<ComboboxSelected>>', self.setAlbum)
        self.albummenu.pack(side=tk.LEFT, padx=8)

        #-------------------Quit button-------------------
        quit_button=tk.Button(subframe,text=dgbk('退出'),\
                command=self.quit)
        quit_button.pack(side=tk.RIGHT, padx=8)

        #-------------------Stop button-------------------
        '''
        self.stop_button=tk.Button(subframe,text='Stop',\
                command=self.stop)
        self.stop_button.pack(side=tk.RIGHT,padx=8)
        '''

        #-------------------Start button-------------------
        self.start_button=tk.Button(subframe,text=dgbk('开始'),\
                command=self.start,state=tk.DISABLED)
        self.start_button.pack(side=tk.RIGHT, pady=8)

        #-------------------Help button-------------------
        self.help_button=tk.Button(subframe,text=dgbk('帮助'),\
                command=self.showHelp)
        self.help_button.pack(side=tk.RIGHT, padx=8)

    def setAlbum(self, x):
        import json
        self.albummenu.selection_clear()
        self.album = self.albummenu.get()
        self.albummenu.set(self.album)
        if self.album == 'All':
            #print('Work on all albums.')
            printch('导出所有专辑.')
        else:
            #print('Select album: '+self.album)
            printch('导出所选专辑:')
            print('   ' + self.album)

    def showHelp(self):
        helpstr = dgbk('''\n\n
导出喜马拉雅下载音频,并自动按专辑归档、重命名:\n
1. 找到手机/pad中的喜马拉雅数据文件夹:\n
    (1)苹果用户:链接电脑itunes,在app一栏中找到“喜马拉雅”,单击,右侧会出现“喜马拉雅”的数据文件。选择“iDoc”,并导出到电脑。\n
    (2)安卓用户:链接电脑后,拷贝出ting文件夹。\n
2. 运行ximaexport-gui.exe。\n
    在 “ting.sqlite文件”一栏,选择步骤1中拷贝出的文件夹里的 ting.sqlite. 文件。\n
    在 “导出到文件夹”一栏,选择音频存储位置。\n
    在 “专辑”下拉菜单,选择要导出的专辑。若全部导出选择“All”。\n
    点击“开始”开始处理。
''')

        tkMessageBox.showinfo(title='Help', message=helpstr)
        #print(self.menfolder.get())

    def start(self):
        dbfile = self.db_entry.get()
        outdir = self.out_entry.get()
        self.album = self.albummenu.get()

        self.out_button.configure(state=tk.DISABLED)
        self.start_button.configure(state=tk.DISABLED)
        self.help_button.configure(state=tk.DISABLED)
        self.albummenu.configure(state=tk.DISABLED)
        self.messagelabel.configure(text=dgbk('信息 (处理中...)'))

        album = None if self.album == 'All' else self.album

        args = [dbfile, outdir, album, True]

        self.workthread = WorkThread('work', False, self.stateq)
        self.workthread.deamon = True

        self.workthread.args = args
        self.workthread.start()
        self.reset()

    def reset(self):
        while self.stateq.qsize() and self.exit == False:
            try:
                msg = self.stateq.get()
                if msg == 'done':
                    self.db_button.configure(state=tk.NORMAL)
                    self.out_button.configure(state=tk.NORMAL)
                    self.start_button.configure(state=tk.NORMAL)
                    self.help_button.configure(state=tk.NORMAL)
                    self.albummenu.configure(state='readonly')
                    self.messagelabel.configure(text=dgbk('消息'))
                    return
            except Queue.Empty:
                pass
        self.after(100, self.reset)

    def stop(self):
        #self.workthread.stop()
        pass

    def addMessageFrame(self):
        frame = Frame(self)
        frame.pack(fill=tk.BOTH,side=tk.TOP,\
                expand=1,padx=8,pady=5)

        self.messagelabel = tk.Label(frame, text=dgbk('消息'), bg='#bbb')
        self.messagelabel.pack(side=tk.TOP, fill=tk.X)

        self.text = tk.Text(frame)
        self.text.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
        self.text.height = 10

        scrollbar = tk.Scrollbar(self.text)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.text.yview)
Exemple #16
0
class CoreGUI(object):
    def __init__(self):
        self.mw = Tk()
        self.style = MainWindowStyles()
        self.quality = IntVar()
        self.setup(self.mw)

    def setup(self, parent):
        parent.title("Z5212 Debug Client by 2017 ZEBEX, Inc. Version 1.3")
        resize_and_center(parent, 900, 480)

        self.conn_status = StringVar()
        self.conn_status.set('...')

        # Top Frame (name entry box, buttons, conn status)
        self.conn_frame = Frame(parent, **self.style.Frame)
        self.conn_frame.pack(side="top", fill="x")

        self.lower_frame = Frame(parent, **self.style.Frame)
        self.lower_frame.pack(side="top", fill="both", expand=1)

        # The message entry
        self.display_frame = Frame(self.lower_frame, **self.style.Frame)
        self.display_frame.pack(side="top",
                                fill="both",
                                expand=1,
                                padx=5,
                                pady=5)

        self.right_frame = Frame(self.lower_frame, **self.style.Frame)
        self.right_frame.pack(side="right", fill="y")

        ###
        # Top Frame Widgets
        ###
        self.name_label = Label(self.conn_frame,
                                textvariable=self.conn_status,
                                **self.style.Label).pack(side="left",
                                                         padx=5,
                                                         pady=5)

        Button(self.conn_frame, text='連線', command=self.conn, **self.style.SettingButton)\
            .pack(side="left", padx=5, pady=5)

        Button(self.conn_frame, text="重新開始", command=self.reopen, **self.style.SettingButton)\
            .pack(side="left", padx=5, pady=5)

        self.ports_Combobox = Combobox(self.conn_frame, values=c.port, width=8)
        # assign function to combobox
        self.ports_Combobox.bind('<<ComboboxSelected>>', self.port_on_select)
        self.ports_Combobox.current(portindex)

        self.baud_rate_Combo = Combobox(self.conn_frame,
                                        values=c.baud,
                                        width=8)
        self.baud_rate_Combo.bind('<<ComboboxSelected>>',
                                  self.baud_rate_on_select)
        self.baud_rate_Combo.current(baudindex)

        self.enter_exit_button = Button(self.conn_frame,
                                        text="回復預設值",
                                        command=self.quit,
                                        **self.style.Button)

        self.ports_Combobox.pack(side="left", padx=5, pady=5)
        self.baud_rate_Combo.pack(side="left", padx=5, pady=5)
        self.enter_exit_button.pack(side="left", padx=5, pady=5)

        ###
        # Image Frame Widgets get image, set quality
        ###

        self.img_frame = Frame(self.conn_frame, **self.style.Frame)
        image_q_label = Label(self.img_frame,
                              text='Quality',
                              anchor="w",
                              **self.style.Label)
        image_q_label.pack(side=LEFT, fill="x")
        self.quality.set(85)
        Radiobutton(self.img_frame,
                    text='L',
                    variable=self.quality,
                    value=35,
                    command=self.selected_quality).pack(side=RIGHT, anchor="w")
        Radiobutton(self.img_frame,
                    text='M',
                    variable=self.quality,
                    value=85,
                    command=self.selected_quality).pack(side=RIGHT, anchor="w")
        Radiobutton(self.img_frame,
                    text='H',
                    variable=self.quality,
                    value=93,
                    command=self.selected_quality).pack(side=RIGHT, anchor="w")

        self.img_frame.pack(side="left", padx=5, pady=5)

        Button(self.conn_frame,
               text='拍照',
               command=self.getimg,
               **self.style.SettingButton).pack(side="left", padx=5, pady=5)

        ###
        # Display Frame Widgets
        ###
        self.display_frame.configure(background='#666666')
        # Create a canvas
        self.canvas = Canvas(self.display_frame,
                             width=640,
                             height=360,
                             bg="#666666")
        self.loadImage('Capture.jpg')

    def conn(self):
        self.conn_status.set("...")
        c = Config('')
        c.baud = self.baud_rate_Combo.get()
        c.port = self.ports_Combobox.get()
        c.isRs232 = int(c.baud) - 115200 <= 0
        c.dump()
        self.serConnector = connect(c)
        serConnector = self.serConnector
        Has_response = handshake(self.serConnector)
        if Has_response:
            setDefault(c, self.serConnector)
            self.conn_status.set('已連線')
            commGUI(self.right_frame, c.Gain, self.serConnector, "Gain")
            commGUI(self.right_frame, c.Shutter, self.serConnector, "Shutter")
            commGUI(self.right_frame, c.light, self.serConnector, "light")

    def baud_rate_on_select(self, event=None):
        print("event.widget:", event.widget.get())

    def port_on_select(self, event=None):
        print("event.widget:", event.widget.get())

    def quit(self):
        self.serConnector.write("quit".encode('ascii') + '\r\n')

    def reopen(self):
        portindex = self.ports_Combobox.getint
        baudindex = self.baud_rate_Combo.getint
        try:
            self.serConnector.close()
        except AttributeError:
            pass
        self.mw.destroy()
        app = CoreGUI()

    def getimg(self):
        self.canvas.delete("all")
        getImage("image" + str(self.quality.get()), self.serConnector,
                 c.isRs232)
        self.loadImage('Capture.jpg')

    def loadImage(self, filename):
        # Load the image file
        try:
            im = Image.open(filename)
        except IOError:
            print 'IOError'
            return
        # Put the image into a canvas compatible class, and stick in an
        # arbitrary variable to the garbage collector doesn't destroy it
        self.canvas.image = ImageTk.PhotoImage(im)
        # Add the image to the canvas, and set the anchor to the top left / north west corner
        self.canvas.create_image(0, 0, image=self.canvas.image, anchor='nw')
        self.canvas.pack()

    def start(self):
        self.mw.mainloop()

    def selected_quality(self):
        pass
Exemple #17
0
class Page(Frame):
	def __init__(self, parent, index=0):
		Frame.__init__(self, parent, height=530, relief=RAISED, borderwidth=1)
		self.parent = parent
		if index == 0:
			self.loadScriptPage()
		elif index == 1:
			self.scriptProcessPage()
		elif index == 2:
			self.sonifyProcessPage()
		elif index == 3:
			self.finishedPage()
		else:
			print "No Page here!"

		
	def loadScriptPage(self):
		
		# Button States
		self.parent.prevButton.config(state='disabled')
		if self.parent.scriptname != '':
			self.parent.nextButton.config(state='normal')

		explain = Label(self, text=txt.selectscript, justify=CENTER, font=root.fontH1)
		explain.pack(pady=50)

		self.loadedscript = Label(self, text=self.parent.scriptname, justify=CENTER, font=root.fontH1)
		self.loadedscript.pack()

		loadscriptBtn = Button(self, text="Load Script", command=self.getScript)
		loadscriptBtn.pack(pady=10)

	def scriptProcessPage(self):
		self.parent.prevButton.config(state='normal')
		self.parent.nextButton.config(state='normal')

		explain = Label(self, text="Character Selection", justify=CENTER, font=root.fontH1)
		explain.grid(row=0, columnspan=3, pady=20)

		# Instance Script
		self.parent.Script = ScreenPlay(normpath(self.parent.scriptpath))

		actorNames = self.parent.Script.topcharacters
		self.actorActive = []
		self.actorGender = []

		for i in range(6):
			Label(self, text=actorNames[i], width=20).grid(row=i+1, padx=10, pady=8)
			participateFrame = Frame(self ,relief=RAISED, borderwidth=1)
			participateFrame.grid(row=i+1,column=1, padx=10, ipady=2, ipadx=5)
			
			participate = BooleanVar()
			self.actorActive.append(participate)
			self.actorActive[i].set(True)

			Radiobutton(participateFrame, text="ON", variable=self.actorActive[i], value=True, command=self.updateVars).pack(side=LEFT)
			Radiobutton(participateFrame, text="OFF",  variable=self.actorActive[i], value=False, command=self.updateVars).pack(side=LEFT)

			genderFrame = Frame(self, relief=RAISED, borderwidth=1)
			genderFrame.grid(row=i+1,column=2, padx=30, ipady=2)
			
			gender = StringVar()
			self.actorGender.append(gender)
			self.actorGender[i].set('F')

			Label(genderFrame, text="Gender:").pack(side=LEFT, padx=10)

			Radiobutton(genderFrame, text="Female", variable=self.actorGender[i], value='F', command=self.updateVars).pack(side=LEFT, padx=5)
			Radiobutton(genderFrame, text="Male",  variable=self.actorGender[i], value='M', command=self.updateVars).pack(side=LEFT, padx=5)

		Label(self, text="______________________", justify=CENTER, state='disabled').grid(row=8, columnspan=3, pady=10)
		Label(self, text="Sonification Settings", justify=CENTER, font=root.fontH1).grid(row=9, columnspan=3, pady=10)

		sonificationFrame = Frame(self)
		sonificationFrame.grid(row=10, columnspan=3)

		Label(sonificationFrame, text="Tone Length", width=22).grid(row=0, column=0)
		self.tonelen = Combobox(sonificationFrame, state='readonly', values=['1/1','1/2','1/4', '1/8'])
		self.tonelen.bind("<<ComboboxSelected>>", self.updateCombobox)
		self.tonelen.current(1)
		self.tonelen.grid(row=0, column=1, padx=10, pady=5)

		Label(sonificationFrame, text="Sonification BPM", width=22).grid(row=1, column=0)
		self.bpm = Combobox(sonificationFrame, state='readonly', values=[100, 120, 140, 160, 180, 200, 220, 240, 260])
		self.bpm.bind("<<ComboboxSelected>>", self.updateCombobox)
		self.bpm.current(4)
		self.bpm.grid(row=1, column=1, padx=10, pady=5)

		Label(sonificationFrame, text="Dialogue Length per Tone", justify=LEFT).grid(row=2, column=0)
		self.dpt = Combobox(sonificationFrame, state='readonly', values=[1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000])
		self.dpt.bind("<<ComboboxSelected>>", self.updateCombobox)
		self.dpt.current(4)
		self.dpt.grid(row=2, column=1, padx=10, pady=5)

		self.submitSettings()

	def submitSettings(self):
		actorSelections = []
		sonifySettings = []

		for i in range(6):
			selected = self.actorActive[i].get()
			gender = self.actorGender[i].get()

			actorSelections.append( [selected , gender ] )

		sonifySettings.append(self.tonelen.get())
		sonifySettings.append(self.bpm.get())
		sonifySettings.append(self.dpt.get())

		self.parent.actorSelections = actorSelections
		self.parent.sonifySettings = sonifySettings
		# print actorSelections
		# print sonifySettings

	def finishedPage(self):
		Label(self, text="Sonification Complete!", justify=CENTER, font=root.fontH1).pack(pady=200)



	def sonifyProcessPage(self):

		Label(self, text="Processing", justify=CENTER, font=root.fontH1).pack(pady=20)

		self.processing = Label(self, text="", justify=CENTER)
		self.processing.pack(pady=20)

		self.pbar = Progressbar(self, orient='horizontal', mode='indeterminate')
		self.pbar.start(10)
		self.pbar.pack()

		self.after(100, self.sonifyProcess)


	def sonifyProcess(self):
		# Create Output Directory
		path = dirname(normpath(self.parent.scriptpath))

		self.outdir = join(path, 'output_' + str(self.parent.movietitle))

		self.tempdir = join(self.outdir, 'temp')
		self.tempdir = join(self.tempdir, '')

		if not isdir(self.tempdir):
			makedirs(self.tempdir)

		notelen = self.parent.sonifySettings[0]
		notelen = int( notelen[-1:] )
		bpm = int( self.parent.sonifySettings[1] )
		cutoff = int( self.parent.sonifySettings[2] )

		# Create dictionary based on settings
		self.parent.Script.createSceneDictionary(cutoff=cutoff)
		sceneAmount = len(self.parent.Script.scenedictionary)

		for index, character in enumerate(self.parent.Script.topcharacters):
			selected = self.parent.actorSelections[index][0]
			gender = self.parent.actorSelections[index][1]

			if selected:
				charSong = Sonification(character, gender, index)

				for scene in range(sceneAmount-1):

					if character in self.parent.Script.sceneComposition(scene):
						textamount = self.parent.Script.sceneComposition(scene)[character]
						participation = ( float(textamount) / float(cutoff) ) * 100
					else:
						participation = None

					self.processing.config(text= 'Creating Audio for ' + character.title())
					self.update()
					charSong.songBrick(participation, length=notelen)

				charSong.make_song(self.update, bpm=bpm, path=self.tempdir)

		self.mergeAudiotracks()
		

	def mergeAudiotracks(self):

		self.processing.config(text='Creating Multichannel Audiofile\nThis can take a while!')
		self.update()

		outfile = join(self.outdir, 'output.wav')
		
		filearray = []

		for index, character in enumerate(self.parent.Script.topcharacters):
			filename = character.lower() + str(index) + '.wav'
			filearray.append( join(self.tempdir, filename) )

		amix.mix_audiofiles(filearray, outfile, self.update)

		self.parent.nextPage()



	def getScript(self):
		scriptpath = askopenfilename(parent=self.parent, filetypes=[('Fountain Script File','.fountain')], title='Select Script')
		self.parent.scriptpath = scriptpath
		self.parent.scriptname = basename(self.parent.scriptpath)
		self.parent.movietitle = splitext(self.parent.scriptname)[0]

		self.loadedscript.config(text=self.parent.scriptname)
		self.parent.nextButton.config(state='normal')


	def updateVars(self):
		self.submitSettings()

	def updateCombobox(self, event):
		self.submitSettings()
Exemple #18
0
    class Monitor(Frame):
        def __init__(self, parent, port, baud_rate, ser, toolchain, bii):
            '''
            Params:
                parent: The parent Frame
                port: string
                baud_rate:
                ser: serial
            '''

            Frame.__init__(self, parent)
            self.parent = parent
            self.port = port
            self.baud_rate = baud_rate
            self.ser = ser
            self.toolchain = toolchain
            self.bii = bii
            self.initUI()

        def initUI(self):
            self.parent.title("Biicode serial monitor %s" % self.port)
            self.style = Style(
            )  # We need to define a style, otherwhise seems flat whit in macos
            self.style.theme_use(get_style())
            for x in range(1):
                Grid.columnconfigure(self, x, weight=1)
            for y in [1, 2]:
                Grid.rowconfigure(self, y, weight=1)

            self._make_top_bar()
            self._make_user_input()
            self._make_rcv_log()
            self._make_button_bar()

            self.pack(fill=BOTH, expand=1)

            self.serial_buffer = ""
            self.count = 0
            self.running = True
            self.after(50, self.read_serial)  # check serial again soon

        def _make_top_bar(self):
            menubar = Menu(self.parent)
            filemenu = Menu(menubar, tearoff=0)
            biimenu = Menu(menubar, tearoff=0)
            editmenu = Menu(menubar, tearoff=0)

            biimenu.add_command(label="Work (Save and process)",
                                command=self.bii.work)
            biimenu.add_command(label="Find", command=self.bii.find)
            menubar.add_cascade(label="bii", menu=biimenu)

            filemenu.add_command(label="Flash code", command=self.upload)
            filemenu.add_separator()
            filemenu.add_command(label="Exit", command=self.parent.quit)
            menubar.add_cascade(label="File", menu=filemenu)

            editmenu.add_command(label="Clear", command=self.clear)
            # editmenu.add_separator()
            menubar.add_cascade(label="Edit", menu=editmenu)
            self.parent.config(menu=menubar)

        def _make_button_bar(self):
            self.button_upload = Button(self,
                                        text="Flash code",
                                        command=self.upload)
            self.button_upload.style = self.style
            self.button_upload.grid(row=0, column=0, padx=2, pady=2)

            self.baud_rate = 9600
            self.button_combobox = Combobox(self)
            self.button_combobox.bind("<<ComboboxSelected>>",
                                      self._update_baud_rate)
            bauds = (300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400,
                     57600, 115200)
            self.button_combobox['values'] = bauds
            self.button_combobox.current(4)
            self.button_combobox.grid(row=3, column=1, padx=2, pady=2)

        def _make_user_input(self):
            # make user input
            self.user_input = Text(self,
                                   width=52,
                                   height=3,
                                   takefocus=1,
                                   borderwidth=1,
                                   relief='ridge')
            self.user_input.grid(row=1,
                                 column=0,
                                 padx=2,
                                 pady=2,
                                 sticky=N + S + E + W)

            # make send button
            self.button_send = Button(self,
                                      text="Send",
                                      command=self.send_clicked)
            self.button_send.style = self.style
            self.button_send.grid(row=1,
                                  column=1,
                                  padx=2,
                                  pady=2,
                                  sticky=N + S + E + W)

        def _make_rcv_log(self):
            # make receive log
            recvLogFrame = Frame(self, width=400, height=200)
            recvLogFrame.style = self.style
            recvLogFrame.grid(row=2,
                              column=0,
                              padx=2,
                              pady=2,
                              sticky=N + S + E + W)
            self.start_stop_button = Button(self,
                                            text="Stop",
                                            command=self.start_stop_clicked)
            self.start_stop_button.style = self.style
            self.start_stop_button.grid(row=2,
                                        column=1,
                                        padx=2,
                                        pady=2,
                                        sticky=N + S + E + W)

            # make a scrollbar
            self.scrollbar = Scrollbar(recvLogFrame)
            self.scrollbar.pack(side=RIGHT, fill=Y)

            # make a text box to put the serial output
            self.log = Text(recvLogFrame,
                            width=50,
                            height=30,
                            takefocus=0,
                            borderwidth=1,
                            relief='ridge')
            self.log.pack(fill=BOTH, expand=True)

            # attach text box to scrollbar
            self.log.config(yscrollcommand=self.scrollbar.set)
            self.scrollbar.config(command=self.log.yview)

        def send_clicked(self):
            data = str(self.user_input.get(1.0, "end-1c") + '\0')
            self.ser.write(data)
            self._log(data)
            self.user_input.delete(1.0, END)

        def _log(self, msg):
            # if platform.system() == 'Darwin':
            #    print '>> %s' % msg
            # else:
            self.log.insert(END, '\n>> %s' % msg)
            self.log.yview(END)
            self.update_idletasks()

        def clear(self):
            self.log.delete(1.0, END)
            self.update_idletasks()

        def start_stop_clicked(self):
            if self.running:
                self.running = False
                self.start_stop_button['text'] = 'Start'
            else:
                self.running = True
                self.start_stop_button['text'] = 'Stop'
                self.read_serial()  # check serial again soon

        def upload(self):
            self.bii.work()
            try:
                if platform.system() == 'Darwin':
                    self.toolchain.upload()
                else:
                    self.ser.close()
                    self.toolchain.upload()
                    self.ser.open()
                self._log('** Code uploaded **')
            except BiiException:
                self._log('** Code upload failed **')

        def _update_baud_rate(self, event=None):
            new_rate = self.button_combobox.get()
            if new_rate != self.baud_rate:
                self.baud_rate = new_rate
                self.ser.setBaudrate(new_rate)
                logger.debug('Updated serial speed to %s' % new_rate)
                self.update_idletasks()

        def read_serial(self):
            self.log.update()  # display input text

            self._read_character()
            if self.running:
                self.after(100, self.read_serial)  # check serial again soon
            self.after(100, self.update_idletasks)

        def _read_character(self):
            try:
                c = self.ser.read()  # attempt to read a character from Serial
            except SerialException as e:
                logger.error("Couldn't read serial port: %s" % str(e))
                return

            # was anything read?
            while len(c) > 0 and c != '\r':
                # get the buffer from outside of this function
                # check if character is a delimeter
                if c == '\r':
                    c = ''  # don't want returns. chuck it
                if c == '\n':
                    # self.serial_buffer += "\n"  # add the newline to the buffer
                    self.log.insert(END, "\n")
                    self.log.insert(END, self.serial_buffer)
                    self.log.yview(END)
                    self.update_idletasks()
                    self.serial_buffer = ""  # empty the buffer
                else:
                    self.serial_buffer += c  # add to the buffer
                c = self.ser.read()
Exemple #19
0
class DirList(object):
    def __init__(self, initdir=None):
        self.top = Tk()
        self.top.geometry('850x560+200+180')
        self.top.wm_title("SLA2.4")

        #Label(self.top, text='').pack()
        fm_title = Frame(self.top)
        self.label_title = Label(fm_title, text='Site Log Analyzer v2.4',\
         font = ('Helvetica', 16, 'bold'), fg= my_color_blue_office)
        self.label_title.pack()
        fm_title.pack()

        self.top.iconbitmap(icon_path)

        fm_directory = Frame(self.top)
        self.entry_label = Label(fm_directory, text="Search in: ")
        self.cwd = StringVar(self.top)
        self.entry_dir = Entry(fm_directory, width=80, textvariable=self.cwd)
        self.entry_dir.bind('<Return>', self.enter_directory)
        self.button_dir = Button(fm_directory, text='List directory', \
         command=self.choose_dir, activeforeground='white', activebackground='orange')
        self.button_dir.pack(side=RIGHT)
        self.entry_label.pack(side=LEFT)
        self.entry_dir.pack(side=LEFT)
        fm_directory.pack()

        fm_listbox = Frame(self.top)
        self.listbox_dirsby = Scrollbar(fm_listbox)
        self.listbox_dirsby.pack(side=RIGHT, fill=Y)
        self.listbox_dirsbx = Scrollbar(fm_listbox, orient=HORIZONTAL)
        self.listbox_dirsbx.pack(side=BOTTOM, fill=X)

        self.list_v = StringVar()
        #selectmode=EXTENDED,BROWSE,MULTIPLE,SINGLE
        #exportselection is used to enable "ctrl+c" to copy the content selected
        #in the listbox into the windows clipboard when =1
        self.listbox_dirs = Listbox(fm_listbox, height=10, width=10, selectmode=EXTENDED,\
         exportselection=1,listvariable=self.list_v)
        #2017.8.23 BUG: 滚动轴导致程序挂掉,原因可能是由于多线程子线程更新GUI界面
        #产生内部错误导致
        #2017.10.25,fixthis BUG, 要想thread-safe,使用python3,或者使用mttkinter模块!
        self.listbox_dirs.bind('<Double-1>', self.setDirAndGo)
        self.listbox_dirs.bind('<1>', lambda event: self.listbox_click(event))
        self.listbox_dirs.bind('<ButtonRelease-1>',
                               lambda event: self.listbox_click_release(event))
        self.listbox_dirs.bind('<Return>', self.setDirAndGo)
        #self.listbox_dirs.bind('<Return>', self.start_thread_analyse)
        #self.listbox_dirs.bind('<3>', self.listbox_Rclick)
        self.listbox_dirs['yscrollcommand'] = self.listbox_dirsby.set
        self.listbox_dirsby.config(command=self.listbox_dirs.yview)
        self.listbox_dirs['xscrollcommand'] = self.listbox_dirsbx.set
        self.listbox_dirsbx.config(command=self.listbox_dirs.xview)
        self.listbox_dirs.pack(expand=YES, fill=BOTH)
        self.listbox_dirs.focus_set()
        fm_listbox.pack(expand=YES, fill=BOTH)

        fm_search = Frame(self.top)
        label_search = Label(fm_search, text="Search for: ")
        self.keyword = StringVar(self.top)
        self.keyword.set(PREDIFINED_KEYWORD)
        self.combo_search = Combobox(fm_search,
                                     width=30,
                                     textvariable=self.keyword)
        self.combo_search.bind('<KeyPress-Escape>', self.get_default_keywords)

        s = "keywords.csv is the predefined keywords data\nyou can input a specific keyword\nclick 'esc' for default"
        tooltip.ToolTip(self.combo_search,
                        msg=None,
                        msgFunc=lambda: s,
                        follow=True,
                        delay=0.2)

        #read the first 10 custom keywords in history file 'custom_keyword.txt'
        self.ck_list = []
        self.ck_list = get_custom_keyword()
        if self.ck_list:
            value = self.ck_list[-10:]
            value.reverse()
            self.combo_search['values'] = value
            self.ck_list = []
        else:
            self.ck_list = []

        label_search.pack(side=LEFT)
        self.combo_search.pack(side=LEFT)

        #feature files type filtering
        Label(fm_search, text="in files of: ").pack(side=LEFT)
        self.v_files_types = StringVar()
        self.v_files_types.set('.*\.txt;.*\.out')
        self.entry_files_type = Entry(fm_search,
                                      width=30,
                                      textvariable=self.v_files_types)
        self.entry_files_type.pack(side=LEFT)
        self.entry_files_type.bind('<KeyPress-Escape>',
                                   self.get_default_files_filters)

        fs = "Refer to Python Regular Expression\n '.*'means any characters\n use ';' to seperate"
        tooltip.ToolTip(self.entry_files_type,
                        msg=None,
                        msgFunc=lambda: fs,
                        follow=True,
                        delay=0.2)

        #terminate button
        self.stop_b = Button(fm_search,
                             text="Stop",
                             command=self.terminate_threads)
        self.stop_b.pack(side=RIGHT)
        #search start button
        self.search_b = Button(fm_search, text="Auto analyse", command=self.start_thread_analyse, activeforeground\
         ='white', activebackground='orange',bg = 'white', relief='raised', width=10)
        self.search_b.pack(side=RIGHT)
        fm_search.pack()

        tooltip.ToolTip( self.search_b, msg=None, msgFunc=\
         lambda : 'To unpack, decode and search the selected files or directories', \
         follow=True, delay=0.2)

        self.pro_fm = Frame(self.top)
        self.ptext = StringVar()
        self.ptext.set("")
        self.pro_label = Label(self.pro_fm,
                               textvariable=self.ptext,
                               justify='left')
        self.pro_label.grid(row=0, column=0)  #.pack(side=LEFT)

        self.pro_fm.pack(side=LEFT)

        self.current_path_item_number = 0
        self.current_path_item_selected_number = 0

        ############# menu init ################################
        menubar = Menu(self.top)

        #keyword update menu
        menubar.add_command(label='keywords', command=self.menu_keywords)

        #filter_menu
        self.search_filter = ['none']
        filter_menu = Menu(menubar, tearoff=0)
        #all the module used for filter keyword belonging to that module out
        #['Telecom', 'Platform', 'OAM'])
        self.lf = list(set(zip(*PRE_KEYWORD_LIST)[1]))

        self.d_filter = {}
        for i in range(len(self.lf)):
            self.d_filter[self.lf[i]] = StringVar()

        #filter_menu
        filter_menu.add_command(label="select all",
                                command=self.menu_selectall)
        filter_menu.add_separator()
        for item, v in self.d_filter.items():
            #filter_menu.add_command(label = item,command=self.menu_hello)
            filter_menu.add_checkbutton(label = item,command=self.menu_filter,\
             variable=v)
        #将menubar 的menu 属性指定为filemenu,即filemenu 为menubar 的下拉菜单
        menubar.add_cascade(label='Filters', menu=filter_menu)

        #decode menue
        menubar.add_command(label='RTTP', command=self.menu_decode_log)

        #decode menue
        menubar.add_command(label='FTP',
                            command=self.menu_start_monitor_ftp_download)

        #about menue
        about_menu = Menu(menubar, tearoff=0)
        about_menu.add_command(label='About', command=self.menu_about)
        about_menu.add_separator()
        about_menu.add_command(label='How To Use', command=self.menu_howto)
        menubar.add_cascade(label='About', menu=about_menu)
        self.top['menu'] = menubar

        ##popup menu
        self.popup_menu = Menu(self.top, tearoff=0)
        self.popup_menu.add_command(label='Open', command=self.cm_file_open)
        self.popup_menu.add_separator()
        self.popup_menu.add_command(label='Open folder',
                                    command=self.cm_folder_open)
        self.popup_menu.add_separator()
        self.popup_menu.add_command(label='Unpack',
                                    command=self.cm_start_unpack)
        self.popup_menu.add_separator()
        self.popup_menu.add_command(label='Search',
                                    command=self.cm_start_file_search)
        self.popup_menu.add_separator()
        self.popup_menu.add_command(label='Decode',
                                    command=self.cm_start_bsc_decode)
        self.popup_menu.add_separator()
        self.popup_menu.add_command(label='Lines Repetition',
                                    command=self.cm_start_logline_count)
        #popup_menu.entryconfig("Open", state="disable")
        ############# menu init ################################

        #MAC OS GUI
        if (self.top.tk.call('tk', 'windowingsystem') == 'aqua'):
            self.listbox_dirs.bind(
                '<3>',
                lambda event: self.listbox_Rclick(event, self.popup_menu))
            self.listbox_dirs.bind(
                '<Control-1>',
                lambda event: self.listbox_Rclick(event, self.popup_menu))
        #Win32
        else:
            #右击可以弹出菜单,用lambda的写法可以传递参数
            self.listbox_dirs.bind(
                '<3>',
                lambda event: self.listbox_Rclick(event, self.popup_menu))

        if initdir:
            #self.cwd.set(os.getcwd())
            #desktop is default path
            self.cwd.set(DESKTOP_PATH)
            self.menu_selectall()
            self.enter_directory()

        self.dnd_enable(self.listbox_dirs)

    ############# menu function ###############

    def menu_keywords(self):

        kdir = os.path.join(WORKING_PATH, PREDIFINED_KEYWORD)
        cmd = [kdir]
        try:
            multi_operates.call_proc(cmd)
        except Exception as e:
            print "DEBUG call_proc error=", e
            self.listbox_dirs.config(selectbackground='red')

    def menu_decode_log(self):
        decode_window = RTTP_decoder.rttp(self.top)

    def monitor_ftp_download(self, ftp_top):
        global SEARCH_RESULT_LIST
        global NO_KEYWORD_FIND

        print("DEBUG monitor_ftp_download start")
        while 1:
            if not ftp_top.running:
                break
            else:
                if my_ftp.AUTOANA_ENABLE:
                    #here should add mutext to dirlist or ptext or something
                    #which maybe used by auto_analyse
                    s = "Now detecting ftp downloaded files..."
                    self.ptext.set(s)
                    print("DEBUG wating to get file_path from FTP QUEUE..")
                    file_path = my_ftp.FTP_FILE_QUE.get()
                    #here also can use ftp.MONITOR_THREADS to make the stop
                    #exit this circle
                    if 'ftp quit' in file_path:
                        break
                    #display on the dirlist
                    self.listbox_dirs.delete(0, END)
                    current_dir = os.curdir.encode('gb2312').decode('utf-8')
                    self.listbox_dirs.insert(END, current_dir)
                    s = file_path.encode('gb2312').decode('utf-8')
                    self.listbox_dirs.insert(END, s)

                    #start search
                    self.auto_analyse([file_path], PRE_KEYWORD_LIST)
                    self.start_thread_progressbar()

                    #record result in the file_path as a format of xx.res
                    result_file = ''
                    if os.path.isdir(file_path):
                        result_file = os.path.join(file_path,
                                                   'search_result.txt')
                    else:
                        result_file = os.path.join(\
                         os.path.dirname(file_path), 'search_result.txt')
                    record_result(SEARCH_RESULT_LIST, result_file)

                    #send email
                    if not NO_KEYWORD_FIND:
                        print("DEBUG keyword find result=",
                              multi_operates.search_result)
                        print("Result has been saved in %s" % result_file)
                        NO_KEYWORD_FIND = True
                    else:
                        print("DEBUG no keyword found")
                else:
                    pass

        print("'mail monitor quit'")
        s = "Detecting stopped"
        self.ptext.set(s)
        return

    ####################monitor_ftp_download()#######################

    def menu_start_monitor_ftp_download(self):
        global FTP_TOP
        global l_threads
        print "hello this is ftp function"

        #how to singleton?
        ftp_top = my_ftp.My_Ftp(self.top)
        FTP_TOP = ftp_top
        if FTP_TOP:
            t = threading.Thread(target=self.monitor_ftp_download,
                                 args=(ftp_top, ))
            l_threads.append(t)
            t.start()
            print("monitor ftp thread:", t)
        else:
            print("DEBUG FTP_TOP none error")

    ##########menu_start_monitor_ftp_download()#############

    def menu_about(self):
        s = askyesnocancel(title='about', message = "SLA - Site Log Analyser v2.4, any idea, just feedback to us:",\
         detail="[email protected]\[email protected]\[email protected]\[email protected]\[email protected]\[email protected]\n\
			2017 Qingdao GSM-A SLA Team"                                     ,icon=INFO)
        '''
		d = Dialog(None,title='about',text="SLA - Site Log Analyser v2.1\
			\nAny idea, just feedback to us:\[email protected]\
			\[email protected]\[email protected]",bitmap=DIALOG_ICON,default=0,strings=('OK','no'))
		d.num
		'''

    def menu_howto(self):
        s = askyesno(
            title='How To',
            message="把要分析的trace文件夹直接拖放到显示目录框中,点击'Auto analyse'\n简单吧?\n")
        if s:
            print s
        else:
            print "no s=", s

    def filter_keyword(self):
        '''
		filter the keyword list according to d_filter
		'''
        global PRE_KEYWORD_LIST
        pre_k = PRE_KEYWORD_LIST

        filtered_keyword_list = copy.deepcopy(pre_k)

        k = self.keyword.get()
        if k == PREDIFINED_KEYWORD:
            ln = len(pre_k)
            for i in xrange(ln):
                if pre_k[i][1] in self.d_filter:
                    if self.d_filter[pre_k[i][1]].get() == '0':
                        filtered_keyword_list.remove(pre_k[i])
                #print 'DEBUG filtered keyword_list=',filtered_keyword_list

        else:
            filtered_keyword_list[0][0] = k
            filtered_keyword_list[0][5] = "customized keyword"
            return filtered_keyword_list[:1]

        return filtered_keyword_list

    def menu_filter(self):
        self.search_filter = []
        for fi, va in self.d_filter.items():
            if va.get() == '1':
                self.search_filter.append(fi)

        s = "{0} of {1} items selected. Keyword filters: {2}".\
        format(self.current_path_item_selected_number, self.current_path_item_number,self.search_filter)
        self.ptext.set(s)
        self.keyword.set(PREDIFINED_KEYWORD)

    def menu_selectall(self):
        all_true_flag = True
        for i in range(len(self.lf)):
            #print self.d_filter[self.lf[i]].get()
            if self.d_filter[self.lf[i]].get() == '0':
                all_true_flag = False

        if all_true_flag and self.d_filter[self.lf[0]].get() != '':
            for i in range(len(self.lf)):
                self.d_filter[self.lf[i]].set(False)
            self.search_filter = ['none']
        else:
            self.search_filter = []

            for i in range(len(self.lf)):
                self.d_filter[self.lf[i]].set(True)
                self.search_filter.append(self.lf[i])

        s = "{0} items. Keyword filters: {1}".format(
            self.current_path_item_number, self.search_filter)
        self.ptext.set(s)
        self.keyword.set(PREDIFINED_KEYWORD)
        #print "filter:{0},value:{1}".format(self.lf[i],self.d_filter[self.lf[i]].get())

    def menu_popup(self, event, m):

        #The curselection return a tuple of the selected indexs
        sel = self.listbox_dirs.curselection()
        if len(sel) == 1:
            check = self.listbox_dirs.get(self.listbox_dirs.curselection())
            m.post(event.x_root, event.y_root)
        else:
            pass
            #by nearest(click y point)to locate the line in the listbox
            #print "DEBUG-",self.listbox_dirs.nearest(event.y)
            #line_index = self.listbox_dirs.nearest(event.y)
            #self.listbox_dirs.selection_set(line_index,line_index)
            #self.listbox_dirs.config(selectbackground=my_color_blue)
            #m.post(event.x_root,event.y_root)

    def cm_file_open(self, ev=None):
        #print "DEBUG print list_var=",self.list_v.get()
        print "cm_file_open called"

        select_file_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_file_list.append(self.listbox_dirs.get(idx))

        print(select_file_list)
        for file in select_file_list:
            file = file.encode('gb2312')
            cmd = [file]
            try:
                multi_operates.call_proc(cmd)
            except Exception as e:
                print "DEBUG call_proc error=", e
                self.listbox_dirs.config(selectbackground='red')

    ##############################

    ###########context menu functions#####################
    def cm_start_file_search(self, ev=None):
        global l_threads

        print("Start_file_search")
        #There is a problem when no filter a crash will occur after do_search
        if self.search_filter[0] == 'none' and self.keyword.get(
        ) == PREDIFINED_KEYWORD:
            showwarning(title='No filters', message="No keywords to search!")
            #self._Thread__stop()
            return

        select_path_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_path_list.append(self.listbox_dirs.get(idx))

        if len(select_path_list) > 0:

            filtered_keyword_list = self.filter_keyword()
            t = threading.Thread(target=self.file_search, \
             args=(select_path_list, filtered_keyword_list))
            l_threads.append(t)
            t.start()

            self.start_thread_progressbar()
        else:
            print("DEBUG no item seleted")

    def file_search(self, path_list, keyword_list):
        global l_threads

        s = "Please wait..."
        self.search_b.config(text=s,
                             bg='orange',
                             relief='sunken',
                             state='disabled')
        self.popup_menu.entryconfig("Search", state="disable")

        #use multi_operates:
        multi_operates.PROGRESS_QUE.put("Search start")
        files_types_list = self.v_files_types.get().strip().split(';')
        search_result,searched_number = \
        multi_operates.files_search(path_list, keyword_list, files_types_list)
        multi_operates.PROGRESS_QUE.put(
            "Search finished, generating results...")

        self.show_result(keyword_list, search_result)

        s = 'All done, %d files, %d keywords searched in %s'\
         %(searched_number, len(keyword_list), multi_operates.used_time())
        multi_operates.PROGRESS_QUE.put(s)

        self.search_b.config(text="Auto analyse",
                             bg='white',
                             relief='raised',
                             state='normal')
        self.popup_menu.entryconfig("Search", state="normal")
        self.label_title.bell()
        print "file_search finished"

    ##################file_search()#########################

    def cm_folder_open(self, ev=None):
        #print "DEBUG print list_var=",self.list_v.get()
        print "cm_folder_open called"

        select_file_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_file_list.append(self.listbox_dirs.get(idx))

        for file in select_file_list:
            file = file.encode('gb2312')
            p_folder = os.path.dirname(file)
            cmd = ['start', p_folder]
            try:
                multi_operates.call_proc(cmd)
            except Exception as e:
                print "DEBUG call_proc error=", e
                self.listbox_dirs.config(selectbackground='red')
            else:
                break
                pass

    def cm_start_bsc_decode(self, ev=None):
        print("DEBUG cm_start_bsc_decode")
        select_path_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_path_list.append(self.listbox_dirs.get(idx))

        if len(select_path_list) > 0:
            t = threading.Thread(target=self.bsc_decode,
                                 args=(select_path_list, ))
            #for terminating purpose
            l_threads.append(t)
            t.start()
            self.start_thread_progressbar()
        else:
            print("DEBUG no select")
            pass

    def bsc_decode(self, path_list):
        s = u"{0} is under decode process. please wait...".format(path_list)
        multi_operates.PROGRESS_QUE.put(s)

        multi_operates.files_decode(path_list)
        tip = 'All done, decode finished, time uese:{0}'.format(
            multi_operates.used_time())
        multi_operates.PROGRESS_QUE.put(tip)

        new_path = os.path.dirname(path_list[-1])
        self.refresh_listbox(new_path)
        self.label_title.bell()
        print("DEBUG decode finished")

    def cm_start_logline_count(self, ev=None):
        print("DEBUG cm_start_logline_count")
        select_path_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_path_list.append(self.listbox_dirs.get(idx))

        if len(select_path_list) > 0:
            top_rank = 10
            t = threading.Thread(target=self.lines_count,
                                 args=(select_path_list, top_rank))
            #for terminating purpose
            l_threads.append(t)
            print("DEBUG start repeat thread", t)
            t.start()

            self.start_thread_progressbar()
        else:
            print("DEBUG no select")
            pass

    def lines_count(self, path_list, top_rank):
        '''
		counting the repeated log occurences
		'''
        s = "Please wait..."
        self.search_b.config(text=s,
                             bg='orange',
                             relief='sunken',
                             state='disabled')
        self.popup_menu.entryconfig("Search", state="disable")

        multi_operates.PROGRESS_QUE.put("Counting start")
        files_types_list = self.v_files_types.get().strip().split(';')
        l_result,counted_number = \
        multi_operates.files_lines_count(path_list, top_rank, files_types_list)
        multi_operates.PROGRESS_QUE.put(
            "Counting finished, generating results...")

        self.listbox_dirs.delete(0, END)
        self.listbox_dirs.insert(END, os.curdir)
        s = u"-----------Counting Lines Repetition Top %d Results--------------------" % (
            top_rank)
        self.listbox_dirs.insert(END, s)
        j = 0
        for item in l_result:
            j += 1
            sitem = ''
            #if 'str' in str(type(item[0])):
            #	sitem = item[0].encode('gb2312')
            s = "No.{0} repeated:[{1} times]: {2}".format(
                str(j), item[1], item[0])
            try:
                s = s.decode('gb2312')
            except Exception as e:
                print("error decode e:", e)
            self.listbox_dirs.insert(END, s)
            self.listbox_dirs.itemconfig(END, fg=my_color_blue)

        s = 'All done, counting finished, %d files, counted in %s'\
         %(counted_number, multi_operates.used_time())
        multi_operates.PROGRESS_QUE.put(s)

        self.search_b.config(text="Auto analyse",
                             bg='white',
                             relief='raised',
                             state='normal')
        self.popup_menu.entryconfig("Search", state="normal")
        self.label_title.bell()
        print "lines count finished"

    def cm_start_unpack(self, ev=None):
        print("DEBUG cm_start_unpack")

        select_path_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_path_list.append(self.listbox_dirs.get(idx))

        if len(select_path_list) > 0:
            t = threading.Thread(target=self.unpack, args=(select_path_list, ))
            #for terminating purpose
            l_threads.append(t)
            t.start()
            self.start_thread_progressbar()
        else:
            print("DEBUG no select")
            pass

    def unpack(self, path_list):
        #showinfo(title='Untar', message="To be done soon...")
        s = u"{0} is under untar process. please wait...".format(path_list)
        multi_operates.PROGRESS_QUE.put(s)

        multi_operates.files_unpack(path_list)

        tip = 'All done, unpack finished, time uese:{0}'.format(
            multi_operates.used_time())
        multi_operates.PROGRESS_QUE.put(tip)

        new_path = os.path.dirname(path_list[-1])
        self.refresh_listbox(new_path)

        self.label_title.bell()
        print("DEBUG unpack finished")

    #############context menu function#############################

    ###############Drag and Drop feature:########################
    def dnd_enable(self, widget):
        dd = dnd.DnD(self.top)

        def drag(action, actions, type, win, X, Y, x, y, data):
            return action

        def drag_enter(action, actions, type, win, X, Y, x, y, data):
            widget.focus_force()
            return action

        def drop(action, actions, type, win, X, Y, x, y, data):
            self.listbox_dirs.delete(1, END)
            os_sep = os.path.sep
            print("data=", data)
            refined_data = self.refine_data(data)
            #for f in refine_data(data):
            for f in refined_data:
                if f.startswith('{'):
                    #只去掉开头和结尾的{},其他的{}不动
                    #f = f.strip('{}')
                    f = f[1:-1]
                #deal with file_list '/' with os.sep
                f = f.replace(r'/', os_sep)
                widget.insert('end', f)
                if os.path.isdir(f):
                    widget.itemconfig(END, fg=my_color_blue_office)
                else:
                    pass

            self.current_path_item_number = len(refined_data)
            s = "{0} files dropped in".format(self.current_path_item_number)
            #print s
            self.ptext.set(s)

        dd.bindtarget(widget, 'text/uri-list', '<Drag>', drag,
                      ('%A', '%a', '%T', '%W', '%X', '%Y', '%x', '%y', '%D'))
        dd.bindtarget(widget, 'text/uri-list', '<DragEnter>', drag_enter,
                      ('%A', '%a', '%T', '%W', '%X', '%Y', '%x', '%y', '%D'))
        dd.bindtarget(widget, 'text/uri-list', '<Drop>', drop,
                      ('%A', '%a', '%T', '%W', '%X', '%Y', '%x', '%y',
                       '%D'))  #Drag and Drop

    def refine_data(self, data):
        flag = 0
        for i in range(len(data)):
            if data[i] == '{':
                flag += 1
            elif data[i] == '}':
                flag -= 1

            if data[i] == ' ' and flag == 0:
                #print "DEBUG data[:i-1]",data[:i]
                data = data[:i] + "," + data[i + 1:]
        l = data.split(',')
        return l

    ###############Drag and Drop feature:########################

    def syn_item_number(self, path):
        self.current_path_item_number = len(os.listdir(path))

    def listbox_click(self, event):
        print "listbox L click"
        self.listbox_dirs.config(selectbackground=my_color_blue)
        #this function is ahead of dirlist selection
        #so can't get the selection from this function
        #use click release function

    def listbox_click_release(self, event):
        print("click release")
        #this function triggered is behind of dirlist selection
        #Thus, we can get the selections
        sel = self.listbox_dirs.curselection()
        select_path_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_path_list.append(self.listbox_dirs.get(idx))

        ln = len(select_path_list)
        self.current_path_item_selected_number = ln
        s = "{0} of {1} items selected. Keyword filters: {2}".\
        format(ln, self.current_path_item_number,self.search_filter)
        self.ptext.set(s)

    def listbox_Rclick(self, event, m):
        #实现右击弹出菜单,在选择的line上
        print "listbox R click"
        #print "DEBUG- y",self.listbox_dirs.nearest(event.y)
        last_index = self.listbox_dirs.nearest(event.y_root)
        #找到鼠标点击事件的y(行坐标)
        line_index = self.listbox_dirs.nearest(event.y)

        #multi selection
        #self.listbox_dirs.selection_clear(0,last_index)
        self.listbox_dirs.selection_set(line_index, line_index)
        self.listbox_dirs.config(selectbackground=my_color_blue)
        self.current_path_item_selected_number = len(
            self.listbox_dirs.curselection())
        #check untar possible:
        index_list = self.listbox_dirs.curselection()
        re_pattern = r'(\.tar\.gz$)|(\.gz$)|(\.tar$)|(\.tgz$)|(\.zip$)|(\.rar$)'
        for idx in index_list:
            path = self.listbox_dirs.get(idx)
            result = re.search(re_pattern, path.lower())
            if not result:
                self.popup_menu.entryconfig("Unpack", state="disable")
                break
        else:
            self.popup_menu.entryconfig("Unpack", state="normal")

        #check decode possible:
        re_pattern = r'\.rtrc'
        for idx in index_list:
            path = self.listbox_dirs.get(idx)
            result = re.search(re_pattern, path)
            if (not result or path[-4:] == '.out') and not os.path.isdir(path):
                self.popup_menu.entryconfig("Decode", state="disable")
                break
        else:
            self.popup_menu.entryconfig("Decode", state="normal")

        #popup right contextual menu
        m.post(event.x_root, event.y_root)

    def choose_dir(self, ev=None):
        p = tkFileDialog.askdirectory()  # 返回目录路径
        print("open directory:", p)
        if 'unicode' in str(type(p)):
            p = p.encode('utf-8')  #.decode('gb2312')
        elif 'str' in str(type(p)):
            p = p.decode('utf-8')

        self.cwd.set(p)
        self.enter_directory()

    def setDirAndGo(self, ev=None):
        print "setDirAndGo"
        self.last = self.cwd.get()
        #self.listbox_dirs.config(selectbackground='red')
        self.listbox_dirs.config(selectbackground='LightSkyBlue')
        #self.listbox_dirs.config(selectbackground=my_color_blue)
        path = self.listbox_dirs.get(self.listbox_dirs.curselection())
        if not path:
            check = os.curdir
            print "DEBUG setDirAnd Go path error"

        #bug 11
        if "str" in str(type(path)):
            path = path.decode('utf-8')
        self.cwd.set(path)
        self.enter_directory()

    def enter_directory(self, ev=None):
        global FTP_TOP
        #print "DEBUG print list_var=",self.list_v.get()
        print "enter_directory"
        error = ''
        tdir = self.cwd.get()
        if not tdir:
            tdir = os.curdir
        if not os.path.exists(tdir):
            error = tdir + ':no such file'
        elif not os.path.isdir(tdir):
            error = tdir + ':is not a directory!'
            if os.path.isfile(tdir):
                #bug11
                #print "This is a file!"
                #here double click on a file and open it
                #print "DEBUG type(tdir)=",type(tdir)
                tdir = tdir.encode('gb2312')
                #print "DEBUG type(tdir)=",type(tdir)
                cmd = [tdir]
                try:
                    multi_operates.call_proc(cmd)
                except Exception as e:
                    print "DEBUG call_proc error=", e
                    self.listbox_dirs.config(selectbackground='red')
                return

        if error:
            self.cwd.set(error)
            self.top.update()
            print "DEBUG error in enter_directory"
            sleep(0.2)

            #这个self.last是什么意思?
            if not (hasattr(self, 'last') and self.last):
                self.last = os.curdir
                self.cwd.set(self.last)
                self.listbox_dirs.config(selectbackground='Red')
                self.top.update()
                return
        else:
            self.refresh_listbox(tdir)
        self.cwd.set(os.getcwd())
        self.syn_item_number(os.getcwd())
        s = "{0} items. Keyword filters: {1}".format(
            self.current_path_item_number, self.search_filter)
        self.ptext.set(s)

    def refresh_listbox(self, dir_path):

        #print "DEBUG dir_path=",dir_path
        #print"DEBUG type(dir_path) = ",type(dir_path)
        dirlist = os.listdir(dir_path)
        dirlist.sort()
        os.chdir(dir_path)
        #全部删除
        self.listbox_dirs.delete(0, END)
        #当前目录'.'
        #self.listbox_dirs.insert(END, os.curdir)
        #上一级目录'..'
        parent_dir = os.pardir.encode('gb2312').decode('utf-8')
        self.listbox_dirs.insert(END, parent_dir)

        #bug 11
        #print"DEBUG type(dirlist[0]) = ",type(dirlist[0])
        v_cwd = os.getcwd().decode('gb2312').encode('utf-8')
        for eachFile in dirlist:
            #s = os.path.join(os.getcwd(),eachFile)
            if 'unicode' in str(type(eachFile)):
                eachFile = eachFile.encode('utf-8')
            elif 'str' in str(type(eachFile)):
                #eachFIle = eachFile.decode('gb2312').encode('utf-8')
                #print("DEBUG after, type=",type(eachFile))
                pass
            s = os.path.join(v_cwd, eachFile)
            #s = os.path.join(v_cwd,eachFile.encode('utf-8'))
            #在listbox中显示中文, windows support gbk or gb2123 coding
            #bug5
            self.listbox_dirs.insert(END, s)
            if os.path.isdir(s):
                self.listbox_dirs.itemconfig(END, fg=my_color_blue_office)
            self.listbox_dirs.config(selectbackground=my_color_blue)
####################refresh_listbox()#############################

    def get_default_keywords(self, ev=None):
        self.keyword.set(PREDIFINED_KEYWORD)

    def get_default_files_filters(self, ev=None):
        self.v_files_types.set('.*\.txt;.*\.out')

    def start_thread_analyse(self, ev=None):
        global l_threads

        select_path_list = []
        index_list = self.listbox_dirs.curselection()
        for idx in index_list:
            select_path_list.append(self.listbox_dirs.get(idx))

        if len(select_path_list) > 0:

            #Check if keyword is filtered by filters or customized keyword
            filtered_keyword_list = self.filter_keyword()
            t = threading.Thread(target=self.auto_analyse,
                                 args=(select_path_list,
                                       filtered_keyword_list))
            #for terminating purpose
            l_threads.append(t)
            t.start()
            self.start_thread_progressbar()
        else:
            print("No file selected")
##########start_thread_analyse()###############

    def auto_analyse(self, path_list, keyword_list):
        '''
		one key automated analysing the directory
		'''
        print "auto_analyse start:"
        self.search_b.config(text="Please wait...",
                             bg='orange',
                             relief='sunken',
                             state='disabled',
                             width=10)
        self.popup_menu.entryconfig("Search", state="disable")

        ########multi_operates 1.unpack, 2.decode, 3.search###############
        files_types_list = self.v_files_types.get().strip().split(';')
        search_result,searched_number = \
        multi_operates.do_operates(path_list, keyword_list, files_types_list)

        multi_operates.PROGRESS_QUE.put(
            "Analysing finished, generating results...")
        self.show_result(keyword_list, multi_operates.search_result)

        #send 'All done flag to listdir.py'
        s = 'All done, %d files, %d keywords analysed in %s'\
         %(searched_number, len(keyword_list), multi_operates.used_time())
        multi_operates.PROGRESS_QUE.put(s)

        self.search_b.config(text="Auto analyse",
                             bg='white',
                             relief='raised',
                             state='normal')
        self.popup_menu.entryconfig("Search", state="normal")
        print "auto_analyse finished"
        #sound a bell
        self.label_title.bell()
################auto_ananlyse()#########################

    def start_thread_progressbar(self):
        '''
		this thread is for job process displaying in
		the bottom of sla
		'''
        global l_threads
        t = threading.Thread(target=self.progressbar)
        l_threads.append(t)
        print("DEBUG start_thead_progressbar: thread=", t)
        t.start()

    def progressbar(self):
        global l_threads

        print "progressbar start"
        n = 0
        s = "Analsis begins"
        self.ptext.set(s)
        #self.pro_label.update()

        pq = multi_operates.PROGRESS_QUE
        while 1:
            alive_number = 0
            for thread_x in l_threads:
                if thread_x.is_alive():
                    alive_number += 1
            if alive_number <= 1 and pq.empty():
                break
            else:
                #bug 11
                #s = pq.get()
                s = pq.get(True, 20)
                self.ptext.set(s)
                if "start" in s:
                    sleep(0.2)
                if "finished" in s:
                    sleep(0.5)

                #bug 11
                if "All done" in s:
                    break
        print("progressbar end")
        return
##################progressbar()################################

    def show_result(self, key_words, d_result, is_incompleted=False):
        global SEARCH_RESULT_LIST
        global NO_KEYWORD_FIND
        srl = SEARCH_RESULT_LIST
        srl[:] = []
        #写入dirs
        ln = len(key_words)
        print('  show_result start')
        self.listbox_dirs.delete(0, END)
        current_dir = os.curdir.encode('gb2312').decode('utf-8')
        #self.listbox_dirs.insert(END, os.curdir)
        self.listbox_dirs.insert(END, current_dir)
        srl.append(current_dir)
        no_find = True
        s = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.listbox_dirs.insert(END, s)
        if ln > 1:
            s = u" Predefined Keywords Searching"
        else:
            s = u" Customed Keyword Searching"

        s = '-' * 20 + s + '(' + self.v_files_types.get(
        ) + ') ' + 'Results ' + '-' * 20

        if is_incompleted:
            s = '(incompleted)' + s

        self.listbox_dirs.insert(END, s)
        srl.append(s)

        j = 0
        for i in range(ln):
            nn = 0
            lk = key_words[i]
            if key_words[i][0] in d_result:
                nn = len(d_result[lk[0]])
            if nn > 0:
                no_find = False
                j = j + 1
                #s = self.searcher.l_keywords[i][0]
                #self.listbox_dirs.insert(END,s)

                #Keyword Name
                s = u"{0}".format(lk[0])
                self.listbox_dirs.insert(END, s)
                srl.append(s)
                self.listbox_dirs.itemconfig(END, fg=my_color_blue_office)

                #Module Category
                module_category = lk[2].decode("gb2312")  #.encode("utf-8")
                s = u"[Module]:{0}".format(module_category)
                self.listbox_dirs.insert(END, s)
                self.listbox_dirs.itemconfig(END, fg=my_color_light_green)
                srl.append(s)

                #Issue Category
                issue_category = lk[5].decode("gb2312")  #.encode("utf-8")
                #s =u"issue category:---{0}---".format(lk[4])
                s = u"[Issue Category]:{0}".format(issue_category)
                self.listbox_dirs.insert(END, s)
                self.listbox_dirs.itemconfig(END, fg=my_color_red)
                srl.append(s)

                cr_category = lk[6].decode("gb2312")  #.encode("utf-8")
                #s =u"issue category:---{0}---".format(lk[4])
                s = u"[Related CRs]:{0}".format(cr_category)
                self.listbox_dirs.insert(END, s)
                self.listbox_dirs.itemconfig(END, fg=my_color_orange)
                srl.append(s)
                s = u"[File Occurence]:{0}".format(nn)
                self.listbox_dirs.insert(END, s)
                srl.append(s)
                for file in d_result[lk[0]]:
                    s = file
                    if not s:
                        print "DEBUG s= None:", s
                    try:
                        self.listbox_dirs.insert(END, s)
                        srl.append(s)
                    except Exception as e:
                        print 'error here e=', e
                        print "insert(END,s) where s=", s
                s = ' '
                self.listbox_dirs.insert(END, s)
                srl.append(s)
        s = "-" * 20 + u"totally {0} keywords occured!".format(j) + "-" * 20
        self.listbox_dirs.insert(END, s)
        srl.append(s)
        if no_find:
            if self.keyword.get() != PREDIFINED_KEYWORD:
                s = u"没有发现含有关键字'{0}'的文件, No findings".format(
                    self.keyword.get())
            else:
                s = u"没有发现含有任何关键字, No findings"
            self.listbox_dirs.insert(END, s)
            srl.append(s)

        #update custom keyword using history
        if self.keyword.get() != PREDIFINED_KEYWORD:
            self.ck_list.append(self.keyword.get())
            value = list(self.combo_search['values'])
            value.insert(0, self.keyword.get())
            self.combo_search['values'] = value

        #clear the search result which can not be used by terminate thread function
        d_result.clear()
        NO_KEYWORD_FIND = no_find
###############show_result#######################

#########force to close thread##############

    def _async_raise(self, tid, exctype):
        """raises the exception, performs cleanup if needed"""
        tid = ctypes.c_long(tid)
        if not inspect.isclass(exctype):
            exctype = type(exctype)
        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(
            tid, ctypes.py_object(exctype))
        if res == 0:
            raise ValueError("invalid thread id")
        elif res != 1:
            # """if it returns a number greater than one, you're in trouble,
            # and you should call it again with exc=NULL to revert the effect"""
            ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
            raise SystemError("PyThreadState_SetAsyncExc failed")

    def terminate_threads(self):
        '''
		强制终止线程
		'''
        global l_threads
        global PRE_KEYWORD_LIST
        #print("DEBUG teminate thread list:",l_threads)

        alive_number = 0
        for thread_x in l_threads:
            if thread_x.is_alive():
                #print("thread:{} is still alive".format(thread_x))
                alive_number += 1
        #print("THere are still %d theads alive" % alive_number)
        if alive_number == 0:
            #print("DEBUG no alive threads, return")
            l_threads[:] = []
            return

        if l_threads:
            for t in l_threads:
                if t.is_alive():
                    self._async_raise(t.ident, SystemExit)
                    t._Thread__stop()

        self.search_b.config(text="Auto analyse",
                             bg='white',
                             relief='raised',
                             state='normal')
        self.popup_menu.entryconfig("Search", state="normal")

        #list clear way:
        l_threads[:] = []
        s = "stopped"
        self.ptext.set(s)
        #self.enter_directory()
        #if partial search_results have some results, printed out
        s_re = multi_operates.search_result
        if len(s_re) > 0:
            filtered_keyword_list = self.filter_keyword()
            self.show_result(PRE_KEYWORD_LIST, s_re, True)
           borderwidth = 5, fg = "white")
msg.pack(side = "left", pady =30 )


#===========================================================================
""" From Label"""

Label(f1, text="From",bg="white", fg = "navy blue", anchor="w", font=('Lucida Sans Typewriter',(15))).pack(side = LEFT,
                                                                     padx = 10,
                                                                     pady = 20)
""" Como box for "From/ source" """

From = StringVar()
Values = ["Bangalore", "Delhi", "Mumbai", "Chennai"]
w = Combobox(f1,values = Values,width = 15, height = 4, textvariable= From)
w.bind('<<ComboboxSelected>>', Fromcall)
w.pack(side = LEFT, padx = 10, pady = 20)

""" TO Label"""

Label(f1, text="To",bg="white",  fg = "navy blue",font=('Lucida Sans Typewriter',(15))).pack(side = LEFT,padx = 10, pady = 20)

""" Como box for "To/Destination" """
                                                                         
To = StringVar()
Values = ["Bangalore", "Delhi", "Mumbai", "Chennai", "Kolkata", "Cochin"]
w = Combobox(f1,values = Values,width = 15, height = 4, textvariable= To)
w.bind('<<ComboboxSelected>>', Tocall)
w.pack(side = LEFT, padx = 10, pady = 20)

#===========================================================================
Exemple #21
0
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        #VARIABLES GLOBALES
        global codigo, direccion, piso, telefono, ciudad, zona, barrio, estrato, llaves, preguntarx, fin, vlrenta, vladmon, incluida, vlventa, vlavaluo, comiventa, pagoprop, fpagoprop, fpagoadmin, tpropiedad, area, lineas, habitaciones, closets, lamparas, duchas, lavamanos, tsala, tcocina, tpiso, tgarage, rutabus, aservicio, ascensor, citofono, aguacaliente, biblioteca, zverdes, terraza, trifilar, parqueadero, observaciones, lb, Cbx1, Cbx2, zona1, zona2, zona3, zona4, zona5, busqueda, dato, E
        #INSTANCIAS DE LOS WIDGETS
        global codE, adressE, comisionE, phoneE, cityCbx, Cbx1, Cbx2, estratoE, keysE, askforE, rent, arriendoE, admonE, include, sale, ventaE, avaluadoE, comiE, pagopropietarioE, diapagopropietarioE, diapagoadmonE, propertyCbx, areaE, lineasE, roomE, closetE, lampE, bathE, sinkE, salasCbx, cocinaCbx, pisoCbx, garageCbx, rutaE, chkb0, chkb1, chkb2, chkb3, chkb4, chkb5, chkb6, chkb7, chkb8, observaciones, add, delete, edit, clean, update

        #Variables
        codigo = IntVar()
        direccion = StringVar()
        piso = IntVar()
        telefono = StringVar()
        ciudad = StringVar()
        zona = StringVar()
        barrio = StringVar()
        estrato = StringVar()
        llaves = StringVar()
        preguntarx = StringVar()
        fin = IntVar()
        vlrenta = IntVar()
        vladmon = IntVar()
        incluida = IntVar()
        vlventa = IntVar()
        vlavaluo = IntVar()
        comiventa = DoubleVar()
        pagoprop = IntVar()
        fpagoprop = IntVar()
        fpagoadmin = IntVar()

        tpropiedad = StringVar()
        area = IntVar()
        lineas = IntVar()
        habitaciones = IntVar()
        closets = IntVar()
        lamparas = IntVar()
        duchas = IntVar()
        lavamanos = IntVar()
        tsala = StringVar()
        tcocina = StringVar()
        tpiso = StringVar()
        tgarage = StringVar()
        rutabus = StringVar()

        aservicio = IntVar()
        ascensor = IntVar()
        citofono = IntVar()
        aguacaliente = IntVar()
        biblioteca = IntVar()
        zverdes = IntVar()
        terraza = IntVar()
        trifilar = IntVar()
        parqueadero = IntVar()

        ciudades = [
            'Medellín', 'Envigado', 'Caldas', 'El Retiro', 'Guatapé',
            'Bogotá D.C', 'Bello', 'Copacabana', 'Rionegro', 'Sabaneta',
            "Girardot", "Itaguí"
        ]
        zonas = ["Zona 1", "Zona 2", "Zona 3", "Zona 4", "Zona 5"]
        zona1 = [
            'Centro', 'Manrique', 'Aranjuez', 'Prado', 'Buenos Aires',
            'Loreto', 'Milagrosa', 'Villa Hermosa', 'Boston', 'Campo Valdés'
        ]
        zona2 = [
            'Poblado', 'Patio  Bonito', 'Provenza', 'Castropol', 'Manila',
            'San Lucas', 'Envigado', 'El Dorado', 'Loma de Escobero',
            'Sabaneta', 'San Diego', 'Las Palmas', 'La Sebastiana'
        ]
        zona3 = [
            'Laureles', 'La América', 'Estadio', 'Santa Mónica', 'Floresta',
            'Conquistadores', 'Florida Nueva', 'Robledo', 'Los Colores',
            'San Joaquín', 'Castilla', 'Pedregal', 'Tricentenario', 'Bello',
            'Florencia', 'Boyacá las Brisas', 'Barrio Nuevo', 'La Mota',
            'Calazans', 'Simón Bolivar', 'El Portal', 'Envigado'
        ]
        zona4 = [
            'Rosales', 'Guayabal', 'Belén', 'Itaguí', 'La Estrella',
            'Manzanares', 'El Carmelo', 'Mayorca'
        ]
        zona5 = ['El Retiro']

        negociacion = StringVar()
        propiedades = [
            'Casa', 'Apartamento', 'Local', 'Local comercial',
            'Local industrial', 'Oficina', 'Bodega', 'Finca', 'Casa finca',
            'Cabaña', 'Apartaestudio', 'Apartalock', 'Lote', 'Consultorio',
            'Parqueadero'
        ]
        comodidades = [
            "ALCOBA DE SERVICIO", "ASCENDOR", "CITÓFONO", "AGUA CALIENTE",
            "BIBLIOTECA", "ZONAS VERDES", "PARQUEADERO VISITANES", "TRIFILAR",
            "TERRAZA"
        ]
        salas = ['Salón', 'Salón comedor', 'Sala garage']
        cocina = [
            'Integral', 'Semintegral', 'Sencilla', 'Mixta', 'Cocineta',
            'Integral a gas'
        ]
        pisos = [
            'Baldosa', 'Mármol', 'Cerámica', 'Alfombra', 'Mármol y Cerámica',
            'Alfombra y Cerámica', 'Reforzado', 'Porcelanato', 'Madera'
        ]
        garage = ['Cubierto', 'Eléctrico', 'Descubierto', 'Paralelo']

        #busqueda = ["Código","Dirección"]
        busqueda = StringVar()
        busqueda.trace("w", lambda name, index, mode: buscar())
        dato = IntVar()

        #WIDGETS

        #========================= HEADER ===========================

        self.header = Label(self, text="GESTIÓN DE IMNUEBLES", font="bold")
        self.header.pack(pady=20, side=TOP)

        #========================== WRAPPER ==========================

        self.wrapper = Frame(self)
        self.wrapper.pack(side=LEFT, fill=Y)
        #Esto centro el wrapper
        #self.wrapper.pack(side=LEFT, fill=BOTH, expand=True)

        #================ NOTEBOOK =============>

        self.nb = Notebook(self.wrapper)

        #-----------------------> TAB 1

        self.tab1 = Frame(self.nb)

        self.f0 = Frame(
            self.tab1)  #Es para dejar un espacio entre el Tab y el Label
        self.f0.pack(fill=X, pady=10)  #-------------------------------

        self.f1 = Frame(self.tab1)  #-------------------------------
        self.f1.pack(pady=5, fill=X)

        self.codL = Label(self.f1, text='Código:')
        self.codL.pack(side=LEFT)
        codE = Entry(self.f1, textvariable=codigo, width=5)
        codE.pack(side=LEFT)
        codE.focus_set()

        self.adressL = Label(self.f1, text='Dir. Casa:')
        self.adressL.pack(side=LEFT)
        adressE = Entry(self.f1, textvariable=direccion)
        adressE.pack(side=LEFT, fill=X, expand=1)
        adressE.bind("<KeyRelease>", caps)

        self.comisionL = Label(self.f1, text='Piso:')
        self.comisionL.pack(side=LEFT)
        comisionE = Entry(self.f1, textvariable=piso, width=5)
        comisionE.pack(side=LEFT)

        self.phoneL = Label(self.f1, text='Tel:')
        self.phoneL.pack(side=LEFT)
        phoneE = Entry(self.f1, textvariable=telefono, width=20)
        phoneE.pack(side=LEFT)

        self.f2 = Frame(self.tab1)
        self.f2.pack(pady=5, fill=X)  #------------------------------------

        self.cityL = Label(self.f2, text='Ciudad:')
        self.cityL.pack(side=LEFT)

        cityCbx = Combobox(self.f2,
                           textvariable=ciudad,
                           values=ciudades,
                           width=10)
        cityCbx.set('')
        cityCbx.pack(side=LEFT, fill=X, expand=1)

        self.zoneL = Label(self.f2, text='Zona:')
        self.zoneL.pack(side=LEFT)

        Cbx1 = Combobox(self.f2, textvariable=zona, values=zonas, width=10)
        Cbx1.set('')
        Cbx1.bind("<<ComboboxSelected>>", zone)
        Cbx1.pack(side=LEFT, fill=X, expand=1)

        self.neighborL = Label(self.f2, text='Barrio:')
        self.neighborL.pack(side=LEFT)

        Cbx2 = Combobox(self.f2, textvariable=barrio, width=10)
        Cbx2.set('')
        Cbx2.pack(side=LEFT, fill=X, expand=1)

        self.estratoL = Label(self.f2, text='Estrato:')
        self.estratoL.pack(side=LEFT)
        estratoE = Entry(self.f2, textvariable=estrato, width=5)
        estratoE.pack(side=LEFT)

        self.f3 = Frame(self.tab1)
        self.f3.pack(pady=5, fill=X)  #------------------------------------

        self.keysL = Label(self.f3, text='Llaves en:')
        self.keysL.pack(side=LEFT)
        keysE = Entry(self.f3, textvariable=llaves, width=24)
        keysE.pack(side=LEFT, fill=X, expand=1)
        keysE.bind("<KeyRelease>", caps)

        self.askforL = Label(self.f3, text='Preguntar por:')
        self.askforL.pack(side=LEFT)
        askforE = Entry(self.f3, textvariable=preguntarx, width=24)
        askforE.pack(side=LEFT, fill=X, expand=1)
        askforE.bind("<KeyRelease>", caps)

        self.negociacionLF = LabelFrame(self.tab1, text="Valores Negociación")
        self.negociacionLF.pack(anchor=W, pady=5,
                                fill=X)  #----------------------

        self.f5a = Frame(self.negociacionLF)
        self.f5a.pack(pady=5, fill=X)  #---------------------------

        rent = Radiobutton(self.f5a,
                           text="Se Arrienda: ",
                           variable=fin,
                           value=1)

        rent.pack(side=LEFT)

        self.arriendoL = Label(self.f5a, text='Valor $')
        self.arriendoL.pack(side=LEFT)
        arriendoE = Entry(self.f5a, textvariable=vlrenta, width=15)
        arriendoE.pack(side=LEFT)

        self.admonL = Label(self.f5a, text='Administración $')
        self.admonL.pack(side=LEFT)
        admonE = Entry(self.f5a, textvariable=vladmon, width=15)
        admonE.pack(side=LEFT)

        include = Checkbutton(self.f5a,
                              text="Admin. incluida",
                              variable=incluida)
        include.pack(side=LEFT)

        self.f5b = Frame(self.negociacionLF)
        self.f5b.pack(pady=5, fill=X)  #---------------------------

        sale = Radiobutton(self.f5b, text="Se Vende: ", variable=fin, value=2)

        sale.pack(side=LEFT)

        self.ventaL = Label(self.f5b, text='Valor $')
        self.ventaL.pack(side=LEFT)
        ventaE = Entry(self.f5b, textvariable=vlventa, width=15)
        ventaE.pack(side=LEFT)

        self.avaluadoL = Label(self.f5b, text='Avaluado $')
        self.avaluadoL.pack(side=LEFT)
        avaluadoE = Entry(self.f5b, textvariable=vlavaluo, width=15)
        avaluadoE.pack(side=LEFT)

        self.comiL = Label(self.f5b, text='Comisión Venta')
        self.comiL.pack(side=LEFT)
        comiE = Entry(self.f5b, textvariable=comiventa, width=5)
        comiE.pack(side=LEFT)
        self.porcentL = Label(self.f5b, text='%')
        self.porcentL.pack(side=LEFT)

        self.pagoLF = LabelFrame(self.tab1, text="Detalles de pago")
        self.pagoLF.pack(anchor=W, pady=5, fill=X)  #-----------

        self.f6 = Frame(self.pagoLF)
        self.f6.pack(pady=5, fill=X)  #---------------------------

        self.pagopropietarioL = Label(self.f6, text='$ Pago Propietario:')
        self.pagopropietarioL.pack(side=LEFT)
        pagopropietarioE = Entry(self.f6, textvariable=pagoprop, width=10)
        pagopropietarioE.pack(side=LEFT, fill=X, expand=1)

        self.diapagopropietarioL = Label(self.f6, text='Día Pago Propietario:')
        self.diapagopropietarioL.pack(side=LEFT)
        diapagopropietarioE = Entry(self.f6, textvariable=fpagoprop, width=5)
        diapagopropietarioE.pack(side=LEFT)

        self.diapagoadmonL = Label(self.f6, text='Día Pago Admon:')
        self.diapagoadmonL.pack(side=LEFT)
        diapagoadmonE = Entry(self.f6, textvariable=fpagoadmin, width=5)
        diapagoadmonE.pack(side=LEFT)

        self.tab1.pack()

        #-----------------------> TAB 2

        self.tab2 = Frame(self.nb)
        self.tab2.pack()

        self.f0 = Frame(self.tab2)
        self.f0.pack(fill=X, pady=10)  #-------------------------------

        self.f1 = Frame(self.tab2)
        self.f1.pack(fill=X)  #-------------------------------

        self.propertyL = Label(self.f1, text='Tipo Propiedad:')
        self.propertyL.pack(side=LEFT)

        propertyCbx = Combobox(self.f1,
                               textvariable=tpropiedad,
                               values=propiedades,
                               width=15)
        propertyCbx.set('')
        propertyCbx.pack(side=LEFT)

        self.areaL = Label(self.f1, text='Área:')
        self.areaL.pack(side=LEFT)
        areaE = Entry(self.f1, textvariable=area, width=5)
        areaE.pack(side=LEFT)
        self.m2L = Label(self.f1, text='m2')
        self.m2L.pack(side=LEFT)

        self.emptyL = Label(self.f1)  ###VACIO###
        self.emptyL.pack(padx=5, side=LEFT)

        self.lineasL = Label(self.f1, text='# Líneas:')
        self.lineasL.pack(side=LEFT)
        lineasE = Entry(self.f1, textvariable=lineas, width=5)
        lineasE.pack(side=LEFT)

        self.roomL = Label(self.f1, text='# Habitaciones:')
        self.roomL.pack(side=LEFT)
        roomE = Entry(self.f1, textvariable=habitaciones, width=5)
        roomE.pack(side=LEFT)

        self.f2 = Frame(self.tab2)  #-------------------------------
        self.f2.pack(pady=5, fill=X)

        self.closetL = Label(self.f2, text='# Closets:')
        self.closetL.pack(side=LEFT)
        closetE = Entry(self.f2, textvariable=closets, width=5)
        closetE.pack(side=LEFT)

        self.lampL = Label(self.f2, text='# Lámparas:')
        self.lampL.pack(side=LEFT)
        lampE = Entry(self.f2, textvariable=lamparas, width=5)
        lampE.pack(side=LEFT)

        self.bathL = Label(self.f2, text='# Baños:')
        self.bathL.pack(side=LEFT)
        bathE = Entry(self.f2, textvariable=duchas, width=5)
        bathE.pack(side=LEFT)

        self.sinkL = Label(self.f2, text='# Lavamanos:')
        self.sinkL.pack(side=LEFT)
        sinkE = Entry(self.f2, textvariable=lavamanos, width=5)
        sinkE.pack(side=LEFT)

        self.f4 = Frame(self.tab2)
        self.f4.pack(pady=5, fill=X)  #-------------------------------

        self.salaL = Label(self.f4, text='Tipo Sala:')
        self.salaL.pack(side=LEFT)

        salasCbx = Combobox(self.f4, textvariable=tsala, values=salas)
        salasCbx.set('')
        salasCbx.pack(side=LEFT)

        self.cocinaL = Label(self.f4, text='Tipo Cocina:')
        self.cocinaL.pack(side=LEFT)

        cocinaCbx = Combobox(self.f4, textvariable=tcocina, values=cocina)
        cocinaCbx.set('')
        cocinaCbx.pack(side=LEFT)

        self.f5 = Frame(self.tab2)
        self.f5.pack(pady=5, fill=X)  #-------------------------------

        self.pisoL = Label(self.f5, text='Tipo Piso:')
        self.pisoL.pack(side=LEFT)

        pisoCbx = Combobox(self.f5, textvariable=tpiso, values=pisos)
        pisoCbx.set('')
        pisoCbx.pack(side=LEFT)

        self.garageL = Label(self.f5, text='Tipo garage:')
        self.garageL.pack(side=LEFT)

        garageCbx = Combobox(self.f5, textvariable=tgarage, values=garage)
        garageCbx.set('')
        garageCbx.pack(side=LEFT)

        self.f6 = Frame(self.tab2)  #-------------------------------
        self.f6.pack(pady=5, fill=X)

        self.rutaL = Label(self.f6, text='Ruta de Buses:')
        self.rutaL.pack(side=LEFT)
        rutaE = Entry(self.f6, textvariable=rutabus, width=30)
        rutaE.pack(side=LEFT)

        self.f7 = Frame(self.tab2)
        self.f7.pack(pady=5, fill=X)  #-------------------------------

        self.comodidades = LabelFrame(self.f7, text="Comodidades:")
        self.comodidades.pack(anchor=W, pady=5, fill=X,
                              expand=1)  #----------------------

        chkb0 = Checkbutton(self.comodidades,
                            text="ALCOBA DE SERVICIO",
                            variable=aservicio)
        chkb0.grid(row=0, column=0, sticky=W)
        chkb1 = Checkbutton(self.comodidades,
                            text="ASCENSOR",
                            variable=ascensor)
        chkb1.grid(row=0, column=1, sticky=W)
        chkb2 = Checkbutton(self.comodidades,
                            text="CITÓFONO",
                            variable=citofono)
        chkb2.grid(row=0, column=2, sticky=W)
        chkb3 = Checkbutton(self.comodidades,
                            text="AGUA CALIENTE",
                            variable=aguacaliente)
        chkb3.grid(row=0, column=3, sticky=W)

        chkb4 = Checkbutton(self.comodidades,
                            text="BIBLIOTECA",
                            variable=biblioteca)
        chkb4.grid(row=1, column=0, sticky=W)
        chkb5 = Checkbutton(self.comodidades,
                            text="ZONAS VERDES",
                            variable=zverdes)
        chkb5.grid(row=1, column=1, sticky=W)
        chkb6 = Checkbutton(self.comodidades, text="TERRAZA", variable=terraza)
        chkb6.grid(row=1, column=2, sticky=W)
        chkb7 = Checkbutton(self.comodidades,
                            text="TRIFILAR",
                            variable=trifilar)
        chkb7.grid(row=1, column=3, sticky=W)

        chkb8 = Checkbutton(self.comodidades,
                            text="PARQUEADERO VISITANTES",
                            variable=parqueadero)
        chkb8.grid(row=2, column=0, sticky=W)

        self.f9 = Frame(self.tab2)
        self.f9.pack(pady=5, fill=X)  #------------------------------------

        self.notesL = Label(self.f9, text='Observaciones:')
        self.notesL.pack(side=LEFT)

        self.f10 = Frame(self.tab2)
        self.f10.pack(pady=5, fill=X)  #-----------------------------------

        observaciones = Text(self.f10, height=5)
        observaciones.pack(side=LEFT, fill=X, expand=1)

        #---------------------------------------------------------------

        self.nb.add(self.tab1, text="Datos Generales")
        self.nb.add(self.tab2, text="Inventario y Comodidades")

        self.nb.pack()

        #=========================== BOTONES ===========================

        self.fBtn = Frame(self.wrapper)
        self.fBtn.pack()  #-------------------------------

        clean = Button(self.fBtn,
                       text='Limpiar',
                       bg='navy',
                       foreground='white',
                       activebackground='red3',
                       activeforeground='white',
                       command=limpiar)
        clean.pack(side=RIGHT)

        update = Button(self.fBtn,
                        text='Actualizar',
                        bg='navy',
                        foreground='white',
                        activebackground='red3',
                        activeforeground='white',
                        command=actualizar,
                        state=DISABLED)
        update.pack(side=RIGHT)

        add = Button(self.fBtn,
                     text='Agregar',
                     bg='navy',
                     foreground='white',
                     activebackground='red3',
                     activeforeground='white',
                     command=Agregar)
        add.pack(side=RIGHT)

        #========================= ASIDE ===========================

        self.aside = Frame(self)
        self.aside.pack(side=TOP, fill=BOTH)

        self.wrap1 = Frame(self.aside)
        self.wrap1.pack()

        self.viewer = Label(self.wrap1, text="LISTA DE INMUEBLES")
        self.viewer.pack()

        scroll = Scrollbar(self.wrap1, orient=VERTICAL)
        scroll.pack(side=RIGHT, fill=Y)
        lb = Listbox(self.wrap1,
                     yscrollcommand=scroll.set,
                     height=20,
                     width=30,
                     bg='#d8ecf3')
        scroll.config(command=lb.yview)
        lb.pack(fill=BOTH)
        lb.bind("<Double-Button-1>", callback)

        self.wrap2 = Frame(self.aside)
        self.wrap2.pack()

        self.updateBP = Button(self.wrap2,
                               text='Cargar lista',
                               bg='navy',
                               foreground='white',
                               activebackground='red3',
                               activeforeground='white',
                               command=cargar_lista)
        self.updateBP.pack(fill=X)

        delete = Button(self.wrap2,
                        text='Borrar',
                        bg='navy',
                        foreground='white',
                        activebackground='red3',
                        activeforeground='white',
                        command=borrar)
        delete.pack(fill=X)

        edit = Button(self.wrap2,
                      text='Modificar',
                      bg='navy',
                      foreground='white',
                      activebackground='red3',
                      activeforeground='white',
                      command=modificar)
        edit.pack(fill=X)

        buscador = Label(self.wrap2, text="Buscar por Código:")
        buscador.pack()
        E = Entry(self.wrap2, textvariable=busqueda, width=24)
        E.pack()
        E.bind("<KeyRelease>", caps)
def CompareTime():
    global InputDate , HeadderRows, DateLoc
    TestPlanFileLocation = GetWorkSheet()
    
    HeadderRows = 4
    now = datetime.datetime.now()
##    print "Current date and time using str method of datetime object:"
##    print str(now)
##    print "Current date and time using instance attributes:"
    years =str(now.year)
    months = str(now.month)
    days = str(now.day)
    print "Current year: %s" % years
    print "Current month: %s" % months
    print "Current day: %s" % days
    print "%s" %Day
    print Month
    print Year
    
    if (int(Day) < int(days)) or (int(Month) < int(months)):
        tkMessageBox.showerror("Error", "Wrong input")           
        
    else:
        InputDate = "a " + Day + "/" + Month + "/" + Year
        print InputDate
        Test_Workbook = xlrd.open_workbook(TestPlanFileLocation)
        Test_Worksheet = Test_Workbook.sheet_by_name(SheetName)
    
        Test_Nrows = Test_Worksheet.nrows
        
        print 'Test_Nrows = ',Test_Nrows
        Test_Ncols = Test_Worksheet.ncols
        DateCount = 0
        DateLoc = []
        
        
        for i in range(HeadderRows,Test_Nrows):
            #print "enter1"
            
            Date = Test_Worksheet.cell_value(i,5)
            print "date = ",Date
            if Date == InputDate:
                print "match"
                DateCount += 1
                DateLoc.append(i)
        print "DateLoc = ", DateLoc
        print "DateCount = ", DateCount
        for dateCount in range (0,DateCount):
            FL = str(Test_Worksheet.cell_value(DateLoc[dateCount],19))# to get selected flight
            PL = str(Test_Worksheet.cell_value(DateLoc[dateCount],10)) # to get selected flight's price
            DEPL = str(Test_Worksheet.cell_value(DateLoc[dateCount],7)) # to get selected flight's departure time
            flightColumn = str(DateLoc[dateCount]) # to get corresponding column of the selected flight
            print "enter"
            ADDL = flightColumn + "    Flight = " + FL + "    Price = " + PL + "Rs" + "    Dept Time = " + DEPL
            FlishtsLists.append(ADDL) # print's when available flight's button is pressed
            print "exit"
##            FlishtsListsCol.append()
        FlishtsLists.append("AnyOne")  # adds anyone option too
            
            
        print "FlishtsLists = ",FlishtsLists
        #=============================================================================
        """Available flight Label"""

        Label(f4, text="Available Flights", fg = "red",font=('Lucida Sans Typewriter',(15), "bold")).pack(side = LEFT,
                                                                             padx = 10,
                                                                             pady = 40)

##    f4 = Frame(mf)
##    f4.pack(fill=X)
        global v5 
        v5 = StringVar() # will take selected flights value
        Values = FlishtsLists
        w = Combobox(f4,values = Values ,width = 60, height = 5, textvariable= v5)
        w.bind('<<ComboboxSelected>>',PassFlightCol)
        w.pack(side = LEFT,padx = 10, pady = 40)

        Button(f4, text="SUGGEST",fg ="white" ,bg = "blue" ,font=('Lucida Sans Typewriter',(10), 'bold'),
           command=lambda: Suggest1()).pack(side = LEFT, padx=10,pady=40)
    return
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()
Exemple #24
0
def createWidgets():
    nRow = 0
    Frame1 = Frame(root, height=200, width=200)
    Frame1.grid(sticky=W)

    Label7 = Label(Frame1, text='(V1)类型说明:')
    Label7.grid(
        row=nRow,
        column=0,
    )
    Label7 = Label(Frame1, text='(0:oracle  / 1:SQL)')
    Label7.grid(
        row=nRow,
        column=1,
    )
    nRow += 1
    Label7 = Label(Frame1, text='数据库类型:')
    Label7.grid(
        row=nRow,
        column=0,
    )
    Dbtype = Entry(Frame1, textvariable=varDBType)
    Dbtype.grid(row=nRow, column=1)

    Label1 = Label(Frame1, text='数据库地址:')
    # Label1.pack(anchor=W)
    Label1.grid(row=nRow, column=0)
    IPInput = Entry(Frame1, textvariable=varIP)
    IPInput.grid(row=nRow, column=1)
    nRow += 1
    #
    Label2 = Label(Frame1, text='数据库名称:')
    Label2.grid(
        row=nRow,
        column=0,
    )
    ServerName = Entry(Frame1, textvariable=varDateBase)
    ServerName.grid(row=nRow, column=1)
    nRow += 1

    Label3 = Label(Frame1, text='用户名:')
    Label3.grid(
        row=nRow,
        column=0,
    )
    User = Entry(Frame1, textvariable=varUser)
    User.grid(row=nRow, column=1)
    nRow += 1

    Label4 = Label(Frame1, text='数据库密码:')
    Label4.grid(
        row=nRow,
        column=0,
    )
    DBPass = Entry(Frame1, show='*', textvariable=varPaswd)
    DBPass.grid(row=nRow, column=1)
    nRow += 1

    Label5 = Label(Frame1, text='接口地址:')
    Label5.grid(
        row=nRow,
        column=0,
    )
    WebSerIp = Entry(Frame1, textvariable=varWebSerIp)
    WebSerIp.grid(row=nRow, column=1)
    nRow += 1

    Label12 = Label(Frame1, text='        上传间隔:')
    Label12.grid(row=nRow, column=0)
    Input3 = Entry(Frame1, textvariable=varSleeptime)
    Input3.bind('<KeyRelease>', keyPress)
    Input3.grid(row=nRow, column=1)
    nRow += 1

    Frame2 = Frame(Frame1, height=50, width=200)
    Frame2.grid(sticky=W, row=nRow, column=1)

    nRow = 0
    BtnConnet = Button(Frame2, text='写入配置', command=Connet)
    BtnConnet.grid(row=nRow, column=0)

    Frame3 = Frame(root, height=50, width=300)
    Frame3.grid(sticky=N)

    LabMess = Label(Frame3, text='等待连接。。', font=13, fg='red')
    LabMess.grid(row=0, column=0)

    TestBtn = Button(Frame3,
                     text='数据库连接',
                     command=lambda: TestDBConnet(LabMess))
    TestBtn.grid(row=1, column=0)

    Btn1 = Button(Frame3, text='接口测试', command=lambda: IntfConnetTest(LabMess))
    Btn1.grid(row=1, column=2, padx=10)

    Btn2 = Button(Frame3,
                  text='开始上传',
                  command=lambda: Thread_SaveLoad(LabMess))
    Btn2.grid(row=1, column=4, padx=10)

    quitButton = Button(Frame3, text='关闭', command=Quit)
    quitButton.grid(row=1, column=5, padx=10)

    #接口部分
    nRow = 0
    Label8 = Label(Frame1, text='        接口参数: ')
    Label8.grid(row=nRow, column=2, columnspan=2)
    nRow += 1

    Label9 = Label(Frame1, text='        景区编码:')
    Label9.grid(row=nRow, column=2)
    IPInput = Entry(Frame1, textvariable=varParkCode)
    IPInput.grid(row=nRow, column=3)
    nRow += 1

    Label10 = Label(Frame1, text='        业务编码:')
    Label10.grid(row=nRow, column=2)
    combox1 = Combobox(
        Frame1,
        textvariable=varinfoCode,
        values=GetinfoCode(),
        width=18,
    )
    combox1.bind(
        "<<ComboboxSelected>>",
        comboxChanged,
    )
    combox1.grid(
        row=nRow,
        column=3,
    )
    nRow += 1

    Label11 = Label(Frame1, text='        存储过程:')
    Label11.grid(row=nRow, column=2)
    Input3 = Entry(Frame1, textvariable=varProc)
    Input3.grid(row=nRow, column=3)
    nRow += 2

    SaveBtn = Button(Frame1, text='保存存储过程', command=SaveProc)
    SaveBtn.grid(row=nRow, column=3)
Exemple #25
0
class App:
    def __init__(self,master):
        #User Interface
        #TODO: Add progressbar so people know when the program is working
        root.title('Transit Survey Desire Lines')
        root.iconbitmap(default='busicon.ico')
        
        self.titleText=Label(master,text="OKI Transit On-board Survey Processor").grid(row=0,column=0,columnspan=4)
        self.licenseText=Label(master,text="Licensed 2012 GPL v3").grid(row=1,column=0,columnspan=4)
        self.websiteText=Label(master,text="www.oki.org").grid(row=2,column=0,columnspan=4)
        
        self.workspaceLabel=Label(master,text="GIS Workspace:").grid(row=3,column=0)
        self.workspaceText=Text(master,height=1,width=50)
        self.workspaceText.grid(row=3,column=1)
        self.workspaceBrowse=Button(master,text="Browse MDB",command=self.loadTemplate).grid(row=3,column=2)
        self.workspaceFGDB=Button(master,text="Browse GDB",command=self.loadFolder).grid(row=3,column=3)
        
        self.tableLabel=Label(master,text="Table:").grid(row=4,column=0)
        self.tableLB=Combobox(master,values=["None yet"])
        self.tableLB.bind('<<ComboboxSelected>>',self.getFieldsFromTable)
        self.tableLB.grid(row=4,column=1)
        self.idLabel=Label(master,text="Survey IDs:").grid(row=4,column=2)
        self.idCombo=Combobox(master,values=["None yet"])
        self.idCombo.grid(row=4,column=3)
        
        self.modeToLabel=Label(master,text="Mode To:").grid(row=5,column=0)
        self.modeToCombo=Combobox(master,values=["None yet"])
        self.modeToCombo.grid(row=5,column=1)
        self.modeFrLabel=Label(master,text="Mode From:").grid(row=5, column=2)
        self.modeFrCombo=Combobox(master,values=["None yet"])
        self.modeFrCombo.grid(row=5,column=3)
        
        self.oxLabel=Label(master,text="Origin X Field:").grid(row=6, column=0)
        self.oxCombo=Combobox(master,values=["None yet"])
        self.oxCombo.grid(row=6, column=1)
        self.oyLabel=Label(master,text="Origin Y Field:").grid(row=6, column=2)
        self.oyCombo=Combobox(master,values=["None yet"])
        self.oyCombo.grid(row=6,column=3)
        
        self.bxLabel=Label(master,text="Board X Field:").grid(row=7, column=0)
        self.bxCombo=Combobox(master,values=["None yet"])
        self.bxCombo.grid(row=7, column=1)
        self.byLabel=Label(master,text="Board Y Field:").grid(row=7, column=2)
        self.byCombo=Combobox(master,values=["None yet"])
        self.byCombo.grid(row=7,column=3)
        
        self.axLabel=Label(master,text="Alight X Field:").grid(row=8, column=0)
        self.axCombo=Combobox(master,values=["None yet"])
        self.axCombo.grid(row=8, column=1)
        self.ayLabel=Label(master,text="Alight Y Field:").grid(row=8, column=2)
        self.ayCombo=Combobox(master,values=["None yet"])
        self.ayCombo.grid(row=8,column=3)
        
        self.dxLabel=Label(master,text="Dest X Field:").grid(row=9, column=0)
        self.dxCombo=Combobox(master,values=["None yet"])
        self.dxCombo.grid(row=9, column=1)
        self.dyLabel=Label(master,text="Dest Y Field:").grid(row=9, column=2)
        self.dyCombo=Combobox(master,values=["None yet"])
        self.dyCombo.grid(row=9,column=3)
        
        self.breakerLabel=Label(master,text="The below are for graphing and are not needed for Desirelines").grid(row=10,column=0,columnspan=4)
        
        self.surveyBusLabel=Label(master,text="Survey Bus:").grid(row=11,column=0)
        self.surveyBusCombo=Combobox(master,values=["None yet"])
        self.surveyBusCombo.grid(row=11,column=1)
        self.firstBusLabel=Label(master,text="First Bus:").grid(row=11,column=2)
        self.firstBusCombo=Combobox(master,values=["None yet"])
        self.firstBusCombo.grid(row=11,column=3)
        
        self.goButton=Button(master,text="Create Desirelines!",command=self.buildDL).grid(row=12,column=0)
        self.quitButton=Button(master,text="Quit",command=master.quit).grid(row=12,column=1)
        self.graphOB=Button(master,text="Graph OB",command=self.graphOB).grid(row=12,column=2)
        self.graphAD=Button(master,text="Graph AD",command=self.graphAD).grid(row=12,column=3)
        
        self.addQCVarsButton=Button(master,text="Add QC Variables",command=self.QCVars).grid(row=13,column=0)
        self.CupholderButton=Button(master,text="Cupholder!",command=self.cupholder).grid(row=13,column=3)
        
    def loadTemplate(self):
        #Loads a personal geodatabase file
        filename=tkFileDialog.askopenfilename(filetypes=(("Personal Geodatabases","*.mdb")))
        if(filename):
            try:
                self.workspaceText.insert(END,filename)
                env.workspace=filename
                
            except Exception as e:
                tkMessageBox.showerror("Failed to read file",e.message)
                return
                
    def loadFolder(self):
        #Loads a file geodatabase (looks like a folder to Windows Explorer, etc.)
        foldername=tkFileDialog.askdirectory()
        if(foldername):
            try:
                self.workspaceText.insert(END,foldername)
                env.workspace=foldername
                self.getTablesFromGdb()
            except Exception as e:
                tkMessageBox.showerror("Failed to read folder",e.message)
                return
                
    def getTablesFromGdb(self):
        #Gets a table list from the geodatabase and fills the table combobox
        self.tableList=arcpy.ListTables()
        tl=()
        for table in self.tableList:
            tl=tl+(table,)
        self.tableLB['values']=tl
        
    def getFieldsFromTable(self,something):
        #Gets the fields from the selected table and loads all (relevant) comboboxes
        featClass=self.tableLB.get()
        try:
            fl=()
            if(featClass and featClass!=-1):
                fields=arcpy.ListFields(featClass)
                for field in fields:
                    fl=fl+(field.name,)
                self.oxCombo['values']=fl
                self.oyCombo['values']=fl
                self.bxCombo['values']=fl
                self.byCombo['values']=fl
                self.axCombo['values']=fl
                self.ayCombo['values']=fl
                self.dxCombo['values']=fl
                self.dyCombo['values']=fl
                self.idCombo['values']=fl
                self.modeToCombo['values']=fl
                self.modeFrCombo['values']=fl
                self.surveyBusCombo['values']=fl
                self.firstBusCombo['values']=fl
                
        except:
            return

    def buildDL(self):
        #this is the main process to build the desire lines
        try:
            #Check Inputs
            if self.idCombo.get() and self.modeToCombo.get() and self.modeFrCombo.get() and self.oxCombo.get() and self.oyCombo.get() and self.bxCombo.get() and self.byCombo.get() and self.axCombo.get() and self.ayCombo.get() and self.dxCombo.get() and self.dyCombo.get():
                SurveyIDField=self.idCombo.get()
                ModeToField=self.modeToCombo.get()
                ModeFrField=self.modeFrCombo.get()
                OXField=self.oxCombo.get()
                OYField=self.oyCombo.get()
                BXField=self.bxCombo.get()
                BYField=self.byCombo.get()
                AXField=self.axCombo.get()
                AYField=self.ayCombo.get()
                DXField=self.dxCombo.get()
                DYField=self.dyCombo.get()
                
                #Origin ~> Boarding 
                OutputFC="OBDesireLines"
                arcpy.CreateFeatureclass_management(env.workspace,OutputFC,"POLYLINE")
                arcpy.AddField_management(OutputFC,"SurveyID","LONG")
                arcpy.AddField_management(OutputFC,"ModeTo","LONG")
                arcpy.AddField_management(OutputFC,"ModeFrom","LONG")
                arcpy.AddField_management(OutputFC,"DistanceSL","DOUBLE")
                rows=arcpy.SearchCursor(self.tableLB.get())
                insRows=arcpy.InsertCursor(OutputFC)
                x=1
                for row in rows:
                    if(x % 100 == 0):
                        print "Working on ",x
                    insRow=insRows.newRow()
                    insRow.SurveyID=row.getValue(SurveyIDField)
                    insRow.ModeTo=row.getValue(ModeToField)
                    insRow.ModeFrom=row.getValue(ModeFrField)
                    lineArray=arcpy.Array()
                    pnt1=arcpy.Point()
                    pnt2=arcpy.Point()
                    if(row.getValue(OXField) and row.getValue(OYField) and row.getValue(BXField) and row.getValue(BYField)):
                        pnt1.X=row.getValue(OXField)
                        pnt1.Y=row.getValue(OYField)
                        lineArray.add(pnt1)
                        pnt2.X=row.getValue(BXField)
                        pnt2.Y=row.getValue(BYField)
                        lineArray.add(pnt2)
                        insRow.shape=lineArray
                        insRow.DistanceSL=math.sqrt(math.pow(pnt2.X-pnt1.X,2)+math.pow(pnt2.Y-pnt1.Y,2))
                    
                    insRows.insertRow(insRow)
                    x+=1
                    
                #Alight ~> Destination
                OutputFC="ADDesireLines"
                arcpy.CreateFeatureclass_management(env.workspace,OutputFC,"POLYLINE")
                arcpy.AddField_management(OutputFC,"SurveyID","LONG")
                arcpy.AddField_management(OutputFC,"ModeTo","LONG")
                arcpy.AddField_management(OutputFC,"ModeFrom","LONG")
                arcpy.AddField_management(OutputFC,"DistanceSL","DOUBLE")
                rows=arcpy.SearchCursor(self.tableLB.get())
                insRows=arcpy.InsertCursor(OutputFC)
                x=1
                for row in rows:
                    if(x % 100 == 0):
                        print "Working on ",x
                    insRow=insRows.newRow()
                    insRow.SurveyID=row.getValue(SurveyIDField)
                    insRow.ModeTo=row.getValue(ModeToField)
                    insRow.ModeFrom=row.getValue(ModeFrField)
                    lineArray=arcpy.Array()
                    pnt1=arcpy.Point()
                    pnt2=arcpy.Point()
                    if(row.getValue(AXField) and row.getValue(AYField) and row.getValue(DXField) and row.getValue(DYField)):
                        pnt1.X=row.getValue(AXField)
                        pnt1.Y=row.getValue(AYField)
                        lineArray.add(pnt1)
                        pnt2.X=row.getValue(DXField)
                        pnt2.Y=row.getValue(DYField)
                        lineArray.add(pnt2)
                        insRow.shape=lineArray
                        insRow.DistanceSL=math.sqrt(math.pow(pnt2.X-pnt1.X,2)+math.pow(pnt2.Y-pnt1.Y,2))
                    
                    insRows.insertRow(insRow)
                    x+=1
                    
                #TODO: add something about progress
            else:
                tkMessageBox.showerror("Error Creating Featureclass","You need to select a field for ALL input boxes!")
        except Exception as e:
            tkMessageBox.showerror("Error Creating Featureclass",e.message)
            
    def graphOB(self):
        #Graphs Origin-Boarding Locations
        try:
            #Check Inputs
            if 1==1: 
                #self.modeToCombo.get() and self.oxCombo.get() and self.oyCombo.get() and self.bxCombo.get() and self.byCombo.get() and self.surveyBusCombo.get() and self.firstBusCombo.get():
                ###Not needed
                #SurveyIDField=self.idCombo.get()
                #ModeFrField=self.modeFrCombo.get()
                #AXField=self.axCombo.get()
                #AYField=self.ayCombo.get()
                #DXField=self.dxCombo.get()
                #DYField=self.dyCombo.get()
                
                ## Debugging
                ##ModeToField=self.modeToCombo.get()
                ModeToField="OGET"
                ##OXField=self.oxCombo.get()
                OXField="OXCORD"
                ##OYField=self.oyCombo.get()
                OYField="OYCORD"
                ##BXField=self.bxCombo.get()
                BXField="BX"
                ##BYField=self.byCombo.get()
                BYField="BY_"
                ##sBusField=self.surveyBusCombo.get()
                sBusField="RTCODE"
                ##fBusField=self.firstBusCombo.get()
                fBusField="BUS1"
                #read all this stuff into an array
                rows=arcpy.SearchCursor(self.tableLB.get())
                x=1
                rowData=[]
                for row in rows:
                    if(x % 100 == 0):
                        print "Reading on ",x
                    if(row.getValue(sBusField)==row.getValue(fBusField)):
                        if(row.getValue(OXField)>0 and row.getValue(BXField)>0 and row.getValue(OYField)>0 and row.getValue(BYField)>0):
                            iRow=[row.getValue(ModeToField),math.sqrt(math.pow(row.getValue(OXField)-row.getValue(BXField),2)+math.pow(row.getValue(OYField)-row.getValue(BYField),2))/5280]
                            rowData.append(iRow)
                newRowData=self.sortList(rowData)
                #Graph creation
                iWalk=0
                iBike=0
                iDrive=0
                graphItemsWalk=[]
                graphItemsBike=[]
                graphItemsDrive=[]
                    
                for item in newRowData:
                    if(item[0]==1):
                        graphItemsWalk.append((iWalk,item[1]))
                        iWalk+=1
                    elif(item[0]==2):
                        graphItemsBike.append((iBike,item[1]))
                        iBike+=1
                    else:
                        graphItemsDrive.append((iDrive,item[1]))
                        iDrive+=1
                if(iWalk==0):
                    graphItemsWalk.append((0,0))
                if(iBike==0):
                    graphItemsBike.append((0,0))
                if(iDrive==0):
                    graphItemsDrive.append((0,0))
                        
                graphItems=[]
                giWalk=[]
                giBike=[]
                giDrive=[]
                
                for item in graphItemsWalk:
                    giWalk.append((item[0]*100/iWalk,item[1]))
                for item in graphItemsBike:
                    giBike.append((item[0]*100/iBike,item[1]))
                for item in graphItemsDrive:
                    giDrive.append((item[0]*100/iDrive,item[1]))

                graphItems.append(giWalk)
                graphItems.append(giBike)
                graphItems.append(giDrive)
                cairoplot.scatter_plot('C:\\GraphO2B.SVG',data=graphItems,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0),(0,1,0),(0,0,1)],y_title='Miles')
                cairoplot.scatter_plot('C:\\GraphO2B_Walk.SVG',data=graphItemsWalk,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0)],y_title='Miles')
                cairoplot.scatter_plot('C:\\GraphO2B_Bike.SVG',data=graphItemsBike,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0)],y_title='Miles')
                cairoplot.scatter_plot('C:\\GraphO2B_Drive.SVG',data=graphItemsDrive,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0)],y_title='Miles')
                
                
                print "Completed for now"

        except Exception as e:
            tkMessageBox.showerror("Problem somewhere",e.message)
    
    def graphAD(self):
         #Graphs Origin-Boarding Locations
        try:
            #Check Inputs
            if 1==1: 
                #self.modeFromCombo.get() and self.oxCombo.get() and self.oyCombo.get() and self.bxCombo.get() and self.byCombo.get() and self.surveyBusCombo.get() and self.firstBusCombo.get():
                ###Not needed
                #SurveyIDField=self.idCombo.get()
                #ModeFrField=self.modeFrCombo.get()
                #AXField=self.axCombo.get()
                #AYField=self.ayCombo.get()
                #DXField=self.dxCombo.get()
                #DYField=self.dyCombo.get()
                
                ## Debugging
                ##ModeToField=self.modeToCombo.get()
                ModeFromField="DGET"
                ##DXField=self.oxCombo.get()
                DXField="DXCORD"
                ##OYField=self.oyCombo.get()
                DYField="DYCORD"
                ##BXField=self.bxCombo.get()
                AXField="AX"
                ##BYField=self.byCombo.get()
                AYField="AY"
                ##sBusField=self.surveyBusCombo.get()
                sBusField="RTCODE"
                ##fBusField=self.firstBusCombo.get()
                fBusField="BUS1"
                #read all this stuff into an array
                rows=arcpy.SearchCursor(self.tableLB.get())
                x=1
                rowData=[]
                for row in rows:
                    if(row.getValue("BUS4")):
                        lastBus=row.getValue("BUS4")
                    elif(row.getValue("BUS3")):
                        lastBus=row.getValue("BUS3")
                    elif(row.getValue("BUS2")):
                        lastBus=row.getValue("BUS2")
                    else:
                        lastBus=row.getValue("BUS1")
                    if(x % 100 == 0):
                        print "Reading on ",x
                    if(row.getValue(sBusField)==lastBus):
                        if(row.getValue(DXField)>0 and row.getValue(AXField)>0 and row.getValue(DYField)>0 and row.getValue(AYField)>0):
                            iRow=[row.getValue(ModeFromField),math.sqrt(math.pow(row.getValue(DXField)-row.getValue(AXField),2)+math.pow(row.getValue(DYField)-row.getValue(AYField),2))/5280]
                            rowData.append(iRow)

                    
                        
                newRowData=self.sortList(rowData)
                #Graph creation
                iWalk=0
                iBike=0
                iDrive=0
                graphItemsWalk=[]
                graphItemsBike=[]
                graphItemsDrive=[]
                    
                for item in newRowData:
                    if(item[0]==1):
                        graphItemsWalk.append((iWalk,item[1]))
                        iWalk+=1
                    elif(item[0]==2):
                        graphItemsBike.append((iBike,item[1]))
                        iBike+=1
                    else:
                        graphItemsDrive.append((iDrive,item[1]))
                        iDrive+=1
                        
                if(iWalk==0):
                    graphItemsWalk.append((0,0))
                    iWalk=1
                if(iBike==0):
                    graphItemsBike.append((0,0))
                    iBike=1
                if(iDrive==0):
                    graphItemsDrive.append((0,0))
                    iDrive=1
                graphItems=[]
                giWalk=[]
                giBike=[]
                giDrive=[]
                
                for item in graphItemsWalk:
                    giWalk.append((item[0]*100/iWalk,item[1]))
                for item in graphItemsBike:
                    giBike.append((item[0]*100/iBike,item[1]))
                for item in graphItemsDrive:
                    giDrive.append((item[0]*100/iDrive,item[1]))

                graphItems.append(giWalk)
                graphItems.append(giBike)
                graphItems.append(giDrive)

                cairoplot.scatter_plot('C:\\GraphA2D.SVG',data=graphItems,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0),(0,1,0),(0,0,1)],y_title='Miles')
                cairoplot.scatter_plot('C:\\GraphA2D_Walk.SVG',data=graphItemsWalk,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0)],y_title='Miles')
                cairoplot.scatter_plot('C:\\GraphA2D_Bike.SVG',data=graphItemsBike,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0)],y_title='Miles')
                cairoplot.scatter_plot('C:\\GraphA2D_Drive.SVG',data=graphItemsDrive,width=600,height=400,border=20,axis=True,grid=True,series_colors=[(1,0,0)],y_title='Miles')
                
                print "Completed for now"
        except Exception as e:
            tkMessageBox.showerror("Problem somewhere",e.message)
                
    def sortList(self,list):
        recs=len(list)
        outputlist=[]
        currentlowest=[]
        while len(outputlist)<recs:
            for item in list:
                if(currentlowest==[]):
                    currentlowest=item
                for itemcompare in list:
                    if(itemcompare[1]>item[1]):
                        item=itemcompare
                #At this point, item should be the smallest distance in list
                outputlist.append(item)
                list.remove(item)
        return outputlist
        
    def QCVars(self):
        if(tkMessageBox.askyesno("Modify Table","This WILL modify the input table.  Continue?") and self.tableLB.get()):
            print "This battlestation will be fully operational"
            #check for and delete QC fields
            inputFeatClass=self.tableLB.get()
            fieldList=arcpy.ListFields(inputFeatClass,"QC_*")
            for field in fieldList:
                arcpy.DeleteField_management(inputFeatClass,field.name)
            arcpy.AddField_management(inputFeatClass,"QC_WalkToDistance","DOUBLE")
            arcpy.AddField_management(inputFeatClass,"QC_BikeToDistance","DOUBLE")
            arcpy.AddField_management(inputFeatClass,"QC_DriveToDistance","DOUBLE")
            arcpy.AddField_management(inputFeatClass,"QC_WalkFromDistance","DOUBLE")
            arcpy.AddField_management(inputFeatClass,"QC_BikeFromDistance","DOUBLE")
            arcpy.AddField_management(inputFeatClass,"QC_DriveFromDistance","DOUBLE")
            arcpy.AddField_management(inputFeatClass,"QC_DriveToLocalRoute","SHORT")
            arcpy.AddField_management(inputFeatClass,"QC_BoardWrongState","SHORT")
            arcpy.AddField_management(inputFeatClass,"QC_AlightWrongState","SHORT")
            
            #Field Definitions
            #if(self.modeToCombo.get() and self.oxCombo.get() and self.oyCombo.get() and self.bxCombo.get() and self.byCombo.get() and self.surveyBusCombo.get() and self.firstBusCombo.get():
            ###Not needed
            #SurveyIDField=self.idCombo.get()
            #ModeFrField=self.modeFrCombo.get()
            #AXField=self.axCombo.get()
            #AYField=self.ayCombo.get()
            #DXField=self.dxCombo.get()
            #DYField=self.dyCombo.get()
            
            ## Debugging
            ##ModeToField=self.modeToCombo.get()
            ModeToField="OGET"
            ##OXField=self.oxCombo.get()
            OXField="OXCORD"
            ##OYField=self.oyCombo.get()
            OYField="OYCORD"
            ##BXField=self.bxCombo.get()
            BXField="BX"
            ##BYField=self.byCombo.get()
            BYField="BY_"
            ##sBusField=self.surveyBusCombo.get()
            sBusField="RTCODE"
            ##fBusField=self.firstBusCombo.get()
            fBusField="BUS1"
            #read all this stuff into an array
            
            ModeFromField="DGET"
            ##DXField=self.oxCombo.get()
            DXField="DXCORD"
            ##OYField=self.oyCombo.get()
            DYField="DYCORD"
            ##BXField=self.bxCombo.get()
            AXField="AX"
            ##BYField=self.byCombo.get()
            AYField="AY"
            ##sBusField=self.surveyBusCombo.get()
            
            rows=arcpy.UpdateCursor(self.tableLB.get())
            x=1
            rowData=[]
            for row in rows:
                if(x % 100 == 0):
                    print "Reading on ",x
                    
                #ToDistance    
                if(row.getValue(sBusField)==row.getValue(fBusField)):
                    if(row.getValue(OXField)>0 and row.getValue(BXField)>0 and row.getValue(OYField)>0 and row.getValue(BYField)>0):
                        dist=math.sqrt(math.pow(row.getValue(OXField)-row.getValue(BXField),2)+math.pow(row.getValue(OYField)-row.getValue(BYField),2))/5280
                        if(row.getValue(ModeToField)==1):
                            row.setValue("QC_WalkToDistance",dist)
                        elif(row.getValue(ModeToField)==2):
                            row.setValue("QC_BikeToDistance",dist)
                        else:
                            row.setValue("QC_DriveToDistance",dist)
                    else:
                        row.setValue("QC_WalkToDistance",-1)
                        row.setValue("QC_BikeToDistance",-1)
                        row.setValue("QC_DriveToDistance",-1)
                
                #FromDistance
                if(row.getValue("BUS4")):
                    lastBus=row.getValue("BUS4")
                elif(row.getValue("BUS3")):
                    lastBus=row.getValue("BUS3")
                elif(row.getValue("BUS2")):
                    lastBus=row.getValue("BUS2")
                else:
                    lastBus=row.getValue("BUS1")
                    
                if(row.getValue(sBusField)==lastBus):
                    if(row.getValue(DXField)>0 and row.getValue(AXField)>0 and row.getValue(DYField)>0 and row.getValue(AYField)>0):
                        dist=math.sqrt(math.pow(row.getValue(DXField)-row.getValue(AXField),2)+math.pow(row.getValue(DYField)-row.getValue(AYField),2))/5280
                        if(row.getValue(ModeFromField)==1):
                            row.setValue("QC_WalkFromDistance",dist)
                        elif(row.getValue(ModeFromField)==2):
                            row.setValue("QC_BikeFromDistance",dist)
                        else:
                            row.setValue("QC_DriveFromDistance",dist)
                    else:
                        row.setValue("QC_WalkFromDistance",-1)
                        row.setValue("QC_BikeFromDistance",-1)
                        row.setValue("QC_DriveFromDistance",-1)
                

                rows.updateRow(row)
                            
            
            
            print "DBG: Complete for now"
            
            
            
        elif(self.tableLB.get()==''):
            tkMessageBox.showerror("Problem","You must select a table to proceed")
        else:
            print "Your lack of faith is disturbing"
        
    def cupholder(self):
        tkMessageBox.showinfo("Cupholder","Lord Vadar finds your computer's lack of a cupholder disturbing.")
        ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door open",None,0,None)
Exemple #26
0
class MainFrame(Frame):
    def __init__(self, parent, stdoutq):
        Frame.__init__(self, parent)

        self.parent = parent
        self.width = 850
        self.height = 650
        self.title = menotexport.__version__
        self.stdoutq = stdoutq

        self.initUI()

        self.hasdb = False
        self.hasout = False
        self.hasaction = False
        self.exit = False

        self.path_frame = self.addPathFrame()
        self.action_frame = self.addActionFrame()
        self.message_frame = self.addMessageFrame()
        self.printStr()

        self.stateq = Queue.Queue()
        #self.workproc=Pool(1)

    def centerWindow(self):
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        x = (sw - self.width) / 2
        y = (sh - self.height) / 2
        self.parent.geometry('%dx%d+%d+%d' \
                %(self.width,self.height,x,y))

    def initUI(self):
        self.parent.title(self.title)
        self.style = Style()
        #Choose from default, clam, alt, classic
        self.style.theme_use('alt')
        self.pack(fill=tk.BOTH, expand=True)
        self.centerWindow()

    def printStr(self):
        while self.stdoutq.qsize() and self.exit == False:
            try:
                msg = self.stdoutq.get()
                self.text.update()
                self.text.insert(tk.END, msg)
                self.text.see(tk.END)
            except Queue.Empty:
                pass
        self.after(100, self.printStr)

    def checkReady(self):
        if self.isexport.get()==1 or self.ishighlight.get()==1\
                or self.isnote.get()==1 or self.isbib.get()==1:
            self.hasaction = True
        else:
            self.hasaction = False

        if self.hasdb and self.hasout and self.hasaction:
            self.start_button.configure(state=tk.NORMAL)
            print('# <Menotexport>: Menotexport Ready.')
        else:
            self.start_button.configure(state=tk.DISABLED)

    def addPathFrame(self):
        frame = Frame(self)
        frame.pack(fill=tk.X, expand=0, side=tk.TOP, padx=8, pady=5)

        frame.columnconfigure(1, weight=1)

        #------------------Database file------------------
        label=tk.Label(frame,text='Mendeley Data file:',\
                bg='#bbb')
        label.grid(row=0,column=0,\
                sticky=tk.W,padx=8)

        self.db_entry = tk.Entry(frame)
        self.db_entry.grid(row=0, column=1, sticky=tk.W + tk.E, padx=8)

        self.db_button = tk.Button(frame, text='Open', command=self.openFile)
        self.db_button.grid(row=0, column=2, padx=8, sticky=tk.E)

        hint = '''
Default location on Linux:
~/.local/share/data/Mendeley\ Ltd./Mendeley\ Desktop/[email protected]
Default location on Windows:
C:\Users\Your_name\AppData\Local\Mendeley Ltd\Mendeley Desktop\[email protected]'''

        hint_label=tk.Label(frame,text=hint,\
                justify=tk.LEFT,anchor=tk.NW)
        hint_label.grid(row=1,column=0,columnspan=3,\
                sticky=tk.W,padx=8)

        #--------------------Output dir--------------------
        label2=tk.Label(frame,text='Output folder:',\
                bg='#bbb')
        label2.grid(row=2,column=0,\
                sticky=tk.W,padx=8)

        self.out_entry = tk.Entry(frame)
        self.out_entry.grid(row=2, column=1, sticky=tk.W + tk.E, padx=8)
        self.out_button = tk.Button(frame, text='Choose', command=self.openDir)
        self.out_button.grid(row=2, column=2, padx=8, sticky=tk.E)

    def openDir(self):
        self.out_entry.delete(0, tk.END)
        dirname = askdirectory()
        self.out_entry.insert(tk.END, dirname)
        if len(dirname) > 0:
            print('# <Menotexport>: Output folder: %s' % dirname)
            self.hasout = True
            self.checkReady()

    def openFile(self):
        self.db_entry.delete(0, tk.END)
        ftypes = [('sqlite files', '*.sqlite'), ('ALL files', '*')]
        initialdir = '~/.local/share/data/Mendeley Ltd./Mendeley Desktop'
        initialdir = os.path.expanduser(initialdir)
        if os.path.isdir(initialdir):
            filename = askopenfilename(filetypes=ftypes, initialdir=initialdir)
        else:
            filename = askopenfilename(filetypes=ftypes)
        self.db_entry.insert(tk.END, filename)
        if len(filename) > 0:
            print('# <Menotexport>: Database file: %s' % filename)
            self.probeFolders()

    def probeFolders(self):
        dbfile = self.db_entry.get()
        try:
            db = sqlite3.connect(dbfile)
            self.menfolderlist = menotexport.getFolderList(db,
                                                           None)  #(id, name)
            self.foldernames = ['All'] + [ii[1] for ii in self.menfolderlist
                                          ]  #names to display
            self.foldersmenu['values'] = tuple(self.foldernames)
            self.foldersmenu.current(0)
            db.close()

            self.hasdb = True
            self.checkReady()

        except Exception as e:
            print(
                '# <Menotexport>: Failed to recoganize the given database file.'
            )
            print(e)

    def addActionFrame(self):

        frame = Frame(self, relief=tk.RAISED, borderwidth=1)
        frame.pack(fill=tk.X,side=tk.TOP,\
                expand=0,padx=8,pady=5)

        label = tk.Label(frame, text='Actions:', bg='#bbb')
        label.grid(row=0, column=0, sticky=tk.W, padx=8)

        #---------------Action checkbuttons---------------
        self.isexport = tk.IntVar()
        self.ishighlight = tk.IntVar()
        self.isnote = tk.IntVar()
        self.isbib = tk.IntVar()
        self.isris = tk.IntVar()
        self.isseparate = tk.IntVar()
        self.iszotero = tk.IntVar()
        self.iscustomtemp = tk.IntVar()

        self.check_export=tk.Checkbutton(frame,text='Export PDFs',\
                variable=self.isexport,command=self.doExport)

        self.check_highlight=tk.Checkbutton(frame,\
                text='Extract highlights',\
                variable=self.ishighlight,command=self.doHighlight)

        self.check_note=tk.Checkbutton(frame,\
                text='Extract notes',\
                variable=self.isnote,command=self.doNote)

        self.check_bib=tk.Checkbutton(frame,\
                text='Export .bib',\
                variable=self.isbib,command=self.doBib)

        self.check_ris=tk.Checkbutton(frame,\
                text='Export .ris',\
                variable=self.isris,command=self.doRis)

        self.check_separate=tk.Checkbutton(frame,\
                text='Save separately',\
                variable=self.isseparate,command=self.doSeparate,\
                state=tk.DISABLED)

        self.check_iszotero=tk.Checkbutton(frame,\
                text='For import to Zotero',\
                variable=self.iszotero,command=self.doIszotero,\
                state=tk.DISABLED)

        self.check_custom_template=tk.Checkbutton(frame,\
                text='Use custom template (experimental)',\
                variable=self.iscustomtemp,command=self.doCustomTemp,\
                state=tk.DISABLED)

        frame.columnconfigure(0, weight=1)

        self.check_export.grid(row=1, column=1, padx=8, sticky=tk.W)
        self.check_highlight.grid(row=1, column=2, padx=8, sticky=tk.W)
        self.check_note.grid(row=1, column=3, padx=8, sticky=tk.W)
        self.check_bib.grid(row=2, column=1, padx=8, sticky=tk.W)
        self.check_ris.grid(row=2, column=2, padx=8, sticky=tk.W)
        self.check_separate.grid(row=2, column=3, padx=8, sticky=tk.W)
        self.check_iszotero.grid(row=3, column=1, padx=8, sticky=tk.W)
        self.check_custom_template.grid(row=3, column=2, padx=8, sticky=tk.W)

        #---------------------2nd row---------------------
        subframe = Frame(frame)
        subframe.grid(row=4,column=0,columnspan=6,sticky=tk.W+tk.E,\
                pady=5)

        #-------------------Folder options-------------------
        folderlabel=tk.Label(subframe,text='Mendeley folder:',\
                bg='#bbb')
        folderlabel.pack(side=tk.LEFT, padx=8)

        self.menfolder = tk.StringVar()
        self.menfolderlist = [
            'All',
        ]
        self.foldersmenu=Combobox(subframe,textvariable=\
                self.menfolder,values=self.menfolderlist,state='readonly')
        self.foldersmenu.current(0)
        self.foldersmenu.bind('<<ComboboxSelected>>', self.setfolder)
        self.foldersmenu.pack(side=tk.LEFT, padx=8)

        #-------------------Quit button-------------------
        quit_button=tk.Button(subframe,text='Quit',\
                command=self.quit)
        quit_button.pack(side=tk.RIGHT, padx=8)

        #-------------------Stop button-------------------
        '''
        self.stop_button=tk.Button(subframe,text='Stop',\
                command=self.stop)
        self.stop_button.pack(side=tk.RIGHT,padx=8)
        '''

        #-------------------Start button-------------------
        self.start_button=tk.Button(subframe,text='Start',\
                command=self.start,state=tk.DISABLED)
        self.start_button.pack(side=tk.RIGHT, pady=8)

        #-------------------Help button-------------------
        self.help_button=tk.Button(subframe,text='Help',\
                command=self.showHelp)
        self.help_button.pack(side=tk.RIGHT, padx=8)

    def setfolder(self, x):
        self.foldersmenu.selection_clear()
        self.menfolder = self.foldersmenu.get()
        self.foldersmenu.set(self.menfolder)
        if self.menfolder == 'All':
            print('# <Menotexport>: Work on all folders.')
        else:
            print('# <Menotexport>: Select Mendeley folder: ' +
                  str(self.menfolder))

    def doExport(self):
        if self.isexport.get() == 1:
            print('# <Menotexport>: Export annotated PDFs.')
        else:
            print('# <Menotexport>: Dont export annotated PDFs.')

        self.checkReady()

    def doHighlight(self):
        if self.ishighlight.get() == 1:
            print('# <Menotexport>: Extract highlighted texts.')
            self.check_separate.configure(state=tk.NORMAL)
            self.check_custom_template.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont extract highlighted texts.')
            if self.isnote.get() == 0:
                self.check_separate.configure(state=tk.DISABLED)
                self.check_custom_template.configure(state=tk.DISABLED)
        self.checkReady()

    def doNote(self):
        if self.isnote.get() == 1:
            print('# <Menotexport>: Extract notes.')
            self.check_separate.configure(state=tk.NORMAL)
            self.check_custom_template.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont extract notes.')
            self.check_separate.state = tk.DISABLED
            if self.ishighlight.get() == 0:
                self.check_separate.configure(state=tk.DISABLED)
                self.check_custom_template.configure(state=tk.DISABLED)
        self.checkReady()
        self.checkReady()

    def doBib(self):
        if self.isbib.get() == 1:
            print('# <Menotexport>: Export to .bib file.')
            self.check_iszotero.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont export .bib file.')
            if self.isris.get() == 0:
                self.check_iszotero.configure(state=tk.DISABLED)
        self.checkReady()

    def doRis(self):
        if self.isris.get() == 1:
            print('# <Menotexport>: Export to .ris file.')
            self.check_iszotero.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont export .ris file.')
            if self.isbib.get() == 0:
                self.check_iszotero.configure(state=tk.DISABLED)
        self.checkReady()

    def doSeparate(self):
        if self.isseparate.get() == 1:
            print('# <Menotexport>: Save annotations separately.')
        else:
            print('# <Menotexport>: Save all annotations to single file.')

    def doIszotero(self):
        if self.iszotero.get() == 1:
            print(
                '# <Menotexport>: Save .bib/.ris file in Zotero preferred format.'
            )
        else:
            print('# <Menotexport>: Save .bib/.ris file to default format.')

    def doCustomTemp(self):
        if self.iscustomtemp.get() == 1:
            print(
                '# <Menotexport>: Use custom template for exported annotations.'
            )
        else:
            print(
                '# <Menotexport>: Use default template for exported annotations.'
            )

    def showHelp(self):
        helpstr = '''
%s\n\n
- Export PDFs: Bulk export PDFs.\n
- Extract highlights: Extract highlighted texts and output to txt files.\n
- Extract notes: Extract notes and output to txt files.\n
- Export .bib: Export meta-data and annotations to .bib files.\n
- Export .ris: Export meta-data and annotations to .ris files.\n
- For import to Zotero: Exported .bib and/or .ris files have suitable format to import to Zotero.\n
- Save separately: If on, save each PDF's annotations to a separate txt.\n
- Use custom annotation template: Use a custom template to format the exported annotations.
  See annotation_template.py for details.
- See README.md for more info.\n
''' % self.title

        tkMessageBox.showinfo(title='Help', message=helpstr)
        #print(self.menfolder.get())

    def start(self):
        dbfile = self.db_entry.get()
        outdir = self.out_entry.get()
        self.menfolder = self.foldersmenu.get()

        # get (folderid, folder) for folder
        for ii in self.menfolderlist:
            if ii[1] == self.menfolder:
                folder_sel = [ii[0], ii[1].split('/')[-1]]

        action = []
        if self.isexport.get() == 1:
            action.append('p')
        if self.ishighlight.get() == 1:
            action.append('m')
        if self.isnote.get() == 1:
            action.append('n')
        if self.isbib.get() == 1:
            action.append('b')
        if self.isris.get() == 1:
            action.append('r')
        if self.isseparate.get() == 1:
            separate = True
        else:
            separate = False
        if self.iszotero.get() == 1:
            iszotero = True
        else:
            iszotero = False
        if self.iscustomtemp.get() == 1:
            action.append('t')

        if 'p' in action or 'm' in action or 'n' in action or 'b' in action or 'r' in action:
            self.db_button.configure(state=tk.DISABLED)
            self.out_button.configure(state=tk.DISABLED)
            self.start_button.configure(state=tk.DISABLED)
            self.help_button.configure(state=tk.DISABLED)
            self.foldersmenu.configure(state=tk.DISABLED)
            self.check_export.configure(state=tk.DISABLED)
            self.check_highlight.configure(state=tk.DISABLED)
            self.check_note.configure(state=tk.DISABLED)
            self.check_bib.configure(state=tk.DISABLED)
            self.check_ris.configure(state=tk.DISABLED)
            self.check_separate.configure(state=tk.DISABLED)
            self.check_iszotero.configure(state=tk.DISABLED)
            self.check_custom_template.configure(state=tk.DISABLED)
            self.messagelabel.configure(text='Message (working...)')

            folder = None if self.menfolder == 'All' else folder_sel

            args = [dbfile, outdir, action, folder, separate, iszotero, True]

            self.workthread = WorkThread('work', False, self.stateq)
            self.workthread.deamon = True

            self.workthread.args = args
            self.workthread.start()
            self.reset()
            '''
            self.workproc.apply_async(menotexport.main,args,\
                    callback=self.reset)
            self.workproc.join()
            '''

    def reset(self):
        while self.stateq.qsize() and self.exit == False:
            try:
                msg = self.stateq.get()
                if msg == 'done':
                    self.db_button.configure(state=tk.NORMAL)
                    self.out_button.configure(state=tk.NORMAL)
                    self.start_button.configure(state=tk.NORMAL)
                    self.help_button.configure(state=tk.NORMAL)
                    self.foldersmenu.configure(state='readonly')
                    self.check_export.configure(state=tk.NORMAL)
                    self.check_highlight.configure(state=tk.NORMAL)
                    self.check_note.configure(state=tk.NORMAL)
                    self.check_bib.configure(state=tk.NORMAL)
                    self.check_separate.configure(state=tk.NORMAL)
                    self.check_iszotero.configure(state=tk.NORMAL)
                    self.check_custom_template.configure(state=tk.NORMAL)
                    self.messagelabel.configure(text='Message')
                    return
            except Queue.Empty:
                pass
        self.after(100, self.reset)

    def stop(self):
        #self.workthread.stop()
        pass

    def addMessageFrame(self):
        frame = Frame(self)
        frame.pack(fill=tk.BOTH,side=tk.TOP,\
                expand=1,padx=8,pady=5)

        self.messagelabel = tk.Label(frame, text='Message', bg='#bbb')
        self.messagelabel.pack(side=tk.TOP, fill=tk.X)

        self.text = tk.Text(frame)
        self.text.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
        self.text.height = 10

        scrollbar = tk.Scrollbar(self.text)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.text.yview)
Exemple #27
0
class Metadator(Tk):
    def __init__(self):
        u"""
        Main window constructor
        Creates 1 frame and 2 labeled subframes
        """
        # first: the log
        # see: http://sametmax.com/ecrire-des-logs-en-python/
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)  # all errors will be get
        log_form = logging.Formatter('%(asctime)s || %(levelname)s || %(message)s')
        logfile = RotatingFileHandler('Metadator_LOG.log', 'a', 5000000, 1)
        logfile.setLevel(logging.DEBUG)
        logfile.setFormatter(log_form)
        self.logger.addHandler(logfile)
        self.logger.info('\n\t ======== Metadator ========')  # first messages
        self.logger.info('Starting the UI')

        # checking the path to GDAL in the path
        if "GDAL_DATA" not in env.keys():
            try:
                gdal.SetConfigOption(str('GDAL_DATA'),
                                     str(path.abspath(r'data/gdal')))
            except:
                print("Oups! Something has gone wrong...\
                      see: https://github.com/Guts/Metadator/issues/21")
        else:
            pass

        # basics settings
        Tk.__init__(self)           # constructor of parent graphic class
        self.title(u'Metadator {0}'.format(MetadatorVersion))
        self.style = Style()        # more friendly windows style
        if opersys == 'win32':
            self.logger.info('Op. system: {0}'.format(platform.platform()))
            self.iconbitmap('Metadator.ico')    # windows icon
            self.uzer = env.get(u'USERNAME')
        elif opersys == 'linux2':
            self.logger.info('Op. system: {0}'.format(platform.platform()))
            self.uzer = env.get(u'USER')
            icon = Image("photo", file=r'data/img/metadator.gif')
            self.call('wm', 'iconphoto', self._w, icon)
            self.minsize(580, 100)
            self.style.theme_use('clam')
        elif opersys == 'darwin':
            self.logger.info('Op. system: {0}'.format(platform.platform()))
            self.uzer = env.get(u'USER')
        else:
            self.logger.warning('Operating system not tested')
            self.logger.info('Op. system: {0}'.format(platform.platform()))
        self.resizable(width=False, height=False)
        self.focus_force()

        self.logger.info('GDAL version: {}'.format(gdal.__version__))

        # variables
        self.def_rep = ""       # folder to search for
        self.def_lang = 'FR'    # language to start
        self.def_doc = IntVar()     # to export into Word
        self.def_xls = IntVar()     # to export into Excel 2003
        self.def_xml = IntVar()     # to export into ISO 19139
        self.def_cat = IntVar()     # to merge all output Word files
        self.def_odt = IntVar()     # to export into OpenDocumentText
        self.def_dict = IntVar()    # to make a dictionnary of data
        self.def_kass = IntVar()    # to handle field name case sensitive
        self.def_stat = IntVar()    # to active/disable stats fields
        self.li_pro = []            # list for profiles in language selected
        self.li_shp = []            # list for shapefiles path
        self.li_tab = []            # list for MapInfo tables path
        self.num_folders = 0        # number of folders explored
        self.today = strftime("%Y-%m-%d")   # date of the day
        self.dico_layer = OD()      # dictionary about layer properties
        self.dico_profil = OD()     # dictionary from profile selected
        self.dico_fields = OD()     # dictionary for fields information
        self.dico_rekur = OD()      # dictionary of recurring attributes
        self.dico_err = OD()     # errors list
        self.dico_help = OD()                # dictionary of help texts
        li_lang = [lg for lg in listdir(r'locale')]   # available languages
        self.blabla = OD()      # texts dictionary

        # GUI fonts
        ft_tit = tkFont.Font(family="Times", size=10, weight=tkFont.BOLD)

        # fillfulling
        self.load_settings()
        self.load_texts(self.def_lang)
        self.li_profiles(self.def_lang)
        self.li_rekurs(self.def_lang)
        self.recup_help(self.def_lang)

        # Tabs
        self.nb = Notebook(self)
        self.tab_globals = Frame(self.nb)   # tab_id = 0
        self.tab_options = Frame(self.nb)   # tab_id = 1
        self.tab_attribs = Frame(self.nb)   # tab_id = 2
        self.nb.add(self.tab_globals,
                    text=self.blabla.get('gui_tab1'), padding=3)
        self.nb.add(self.tab_options,
                    text=self.blabla.get('gui_tab2'), padding=3)
        self.nb.add(self.tab_attribs,
                    text=self.blabla.get('gui_tab3'), padding=3)
        self.logger.info('UI created')

                ### Tab 1: global
        # Frames
        self.FrPath = Labelframe(self.tab_globals,
                                 name='main',
                                 text=self.blabla.get('tab1_fr1'))
        self.FrProg = Labelframe(self.tab_globals,
                                 name='progression',
                                 text=self.blabla.get('tab1_frprog'))
            ## Frame 1
        # target folder
        self.labtarg = Label(self.FrPath, text=self.blabla.get('tab1_path'))
        self.target = Entry(self.FrPath, width=25)
        self.browsetarg = Button(self.FrPath,       # browse button
                                 text=self.blabla.get('tab1_browse'),
                                 command=lambda: self.setpathtarg(),
                                 takefocus=True)
        self.browsetarg.focus_force()               # force the focus on
        self.profil = Label(self.FrPath, text=self.blabla.get('tab1_prof'))
        # profiles switcher
        self.ddl_profil = Combobox(self.FrPath, values=self.li_pro, width=5)
        self.ddl_profil.current(0)
        self.ddl_profil.bind("<<ComboboxSelected>>", self.select_profil)
        # widgets placement
        self.labtarg.grid(row=1, column=1, columnspan=1,
                          sticky=N + S + W + E, padx=2, pady=8)
        self.target.grid(row=1, column=2, columnspan=1,
                         sticky=N + S + W + E, padx=2, pady=8)
        self.browsetarg.grid(row=1, column=3,
                             sticky=N + S + W + E, padx=2, pady=8)
        self.profil.grid(row=2, column=1,
                         sticky=N + S + W + E, padx=2, pady=8)
        self.ddl_profil.grid(row=2, column=2, sticky=W + E + N + S,
                             columnspan=2, padx=2, pady=8)

        # tooltips
        InfoBulle(self.target, message=self.dico_help.get(30)[1])
        InfoBulle(self.browsetarg, message=self.dico_help.get(30)[1])
        InfoBulle(self.ddl_profil, message=self.dico_help.get(31)[1])

            ## Frame 2
        # variables
        self.status = StringVar(self.FrProg, '')
        # widgets
        self.prog_layers = Progressbar(self.FrProg, orient="horizontal")
        self.prog_fields = Progressbar(self.FrProg, orient="horizontal")
        # widgets placement
        Label(self.FrProg, textvariable=self.status,
                           foreground='DodgerBlue').pack(expand=1)
        self.prog_layers.pack(expand=1, fill=X)

        # Frames placement
        self.FrPath.pack(expand=1, fill='both')
        self.FrProg.pack(expand=1, fill='both')

                ### Tab 2: options
        # Export options
        caz_doc = Checkbutton(self.tab_options,
                              text=u'HTML / Word (.doc/.docx)',
                              variable=self.def_doc,
                              command=lambda: self.catalog_dependance())
        caz_xls = Checkbutton(self.tab_options,
                              text=u'Excel 2003 (.xls)',
                              variable=self.def_xls)
        caz_xml = Checkbutton(self.tab_options,
                              text=u'XML (ISO 19139)',
                              variable=self.def_xml)
        self.caz_cat = Checkbutton(self.tab_options,
                                   text=self.blabla.get('tab2_merge'),
                                   variable=self.def_cat)
        caz_odt = Checkbutton(self.tab_options,
                              text=u'Open Document Text (.odt)',
                              variable=self.def_odt)
        # widgets placement
        caz_doc.grid(row=1,
                     column=0,
                     sticky=N + S + W + E,
                     padx=2, pady=2)
        self.caz_cat.grid(row=2,
                          column=0,
                          sticky=N + S + W + E,
                          padx=2, pady=2)
        caz_xls.grid(row=1,
                     column=1,
                     sticky=N + S + W + E,
                     padx=2, pady=2)
        caz_xml.grid(row=2,
                     column=1,
                     sticky=N + S + W + E,
                     padx=2, pady=2)
        caz_odt.grid(row=3,
                     column=1,
                     sticky=N + S + W + E,
                     padx=2, pady=2)
        # disabling the widgets which work only on Windows OS
        if opersys != 'win32':
            self.logger.info('Disabling Windows reserved functions.')
            self.def_doc.set(0)
            self.def_cat.set(0)
            caz_doc.configure(state='disabled')
            self.caz_cat.configure(state='disabled')
        else:
            pass
        # make the catalog option depending on the Word option
        self.catalog_dependance()

        # tooltips
        InfoBulle(caz_doc,
                  message=self.dico_help.get(33)[1],
                  image=self.dico_help.get(33)[2])
        InfoBulle(caz_xls,
                  message=self.dico_help.get(34)[1],
                  image=self.dico_help.get(34)[2])
        InfoBulle(caz_xml,
                  message=self.dico_help.get(35)[1],
                  image=self.dico_help.get(35)[2])
        InfoBulle(caz_odt,
                  message=self.dico_help.get(36)[1],
                  image=self.dico_help.get(36)[2])
        InfoBulle(self.caz_cat,
                  message=self.dico_help.get(37)[1],
                  image=self.dico_help.get(37)[2])

                ### Tab 3: recurring attributes
        # Attribute selector
        self.lab_chps = Label(self.tab_attribs, text=self.blabla.get('tab3_sele'))
        self.ddl_attr = Combobox(self.tab_attribs, values=self.dico_rekur.keys())
        self.ddl_attr.bind("<<ComboboxSelected>>", self.edit_rekur)
        self.supr = Button(self.tab_attribs, text=self.blabla.get('tab3_supp'),
                           command=self.del_rekur)
        # frame
        self.FrRekur = Labelframe(self.tab_attribs,
                                  name='attributes',
                                  text=self.blabla.get('tab3_tit'))
        # attribute settings
        self.tab3_LBnom = Label(self.FrRekur,
                                text=self.blabla.get('tab3_nom'),
                                state=DISABLED)
        self.tab3_ENnom = Entry(self.FrRekur, state=DISABLED)
        self.tab3_LBdesc = Label(self.FrRekur,
                                 text=self.blabla.get('tab3_desc'),
                                 state=DISABLED)
        self.tab3_TXdesc = Text(self.FrRekur,
                                height=5, width=30,
                                wrap=WORD, state=DISABLED)
        self.tab3_CBcass = Checkbutton(self.FrRekur,
                                       text=self.blabla.get('tab3_cass'),
                                       variable=self.def_kass,
                                       state=DISABLED)
        self.tab3_CBstat = Checkbutton(self.FrRekur,
                                       text=self.blabla.get('tab3_stat'),
                                       variable=self.def_stat,
                                       state=DISABLED)
        # Validation button
        self.save = Button(self.FrRekur,
                           text=self.blabla.get('tab3_save'),
                           command=self.save_rekur,
                           state='disabled')

        # widgets placement
        self.lab_chps.grid(row=1, column=1, sticky=N + S + W,
                           padx=2, pady=2)
        self.ddl_attr.grid(row=1, column=2, sticky=N + S + W + E,
                           padx=2, pady=2)
        self.supr.grid(row=1, column=3, sticky=N + S + W + E,
                       padx=2, pady=2)
        self.tab3_LBnom.grid(row=1, column=0, columnspan=1,
                             sticky=N + S + W, padx=2, pady=2)
        self.tab3_ENnom.grid(row=1, column=1, columnspan=1,
                             sticky=N + S + W + E, padx=2, pady=2)
        self.tab3_LBdesc.grid(row=2, column=0, columnspan=1,
                              sticky=N + S + W + E, padx=2, pady=2)
        self.tab3_TXdesc.grid(row=2, column=1, columnspan=2,
                              sticky=N + S + W + E, padx=2, pady=2)
        self.tab3_CBcass.grid(row=3, column=0, columnspan=1,
                              sticky=N + S + W + E, padx=2, pady=2)
        self.tab3_CBstat.grid(row=3, column=1, columnspan=1,
                              sticky=N + S + W + E, padx=2, pady=2)
        self.save.grid(row=5, column=0, columnspan=4,
                       sticky=N + S + W + E, padx=2, pady=2)

        # Frame placement
        self.FrRekur.grid(row=2, column=1, columnspan=3,
                          sticky=N + S + W + E, padx=2, pady=2)

        # tooltips
        InfoBulle(self.lab_chps, message=self.dico_help.get(38)[1])
        InfoBulle(self.ddl_attr, message=self.dico_help.get(39)[1])
        InfoBulle(self.supr, message=self.dico_help.get(40)[1])
        InfoBulle(self.tab3_CBcass, message=self.dico_help.get(41)[1])
        InfoBulle(self.tab3_CBstat, message=self.dico_help.get(42)[1])

            ## Main frame
        # Hola
        self.welcome = Label(self,
                             text=self.blabla.get('hi') + self.uzer,
                             font=ft_tit,
                             foreground="red2")
        # Image
        self.icone = PhotoImage(master=self, file=r'data/img/metadator.gif')
        Label(self, image=self.icone).grid(row=2,
                                           column=0,
                                           padx=2,
                                           pady=2,
                                           sticky=N + S + W + E)
        # credits
        s = Style(self)
        s.configure('Kim.TButton', foreground='DodgerBlue',
                    borderwidth=0, relief="flat")
        Button(self,
               text='by Julien M. (2015)',
               style='Kim.TButton',
               command=lambda: open_new('https://github.com/Guts')).grid(row=3,
                                                                         padx=2,
                                                                         pady=2,
                                                                         sticky=W+E)
        # language switcher
        self.ddl_lang = Combobox(self, values=li_lang, width=5)
        self.ddl_lang.current(li_lang.index(self.def_lang))
        self.ddl_lang.bind("<<ComboboxSelected>>", self.change_lang)
        # Go go go button
        self.val = Button(self,
                          text=self.blabla.get('tab1_go'),
                          state='active',
                          command=lambda: self.process())
        # Cancel button
        self.can = Button(self,
                          text=self.blabla.get('gui_quit'),
                          command=self.destroy)
        # widgets placement
        self.welcome.grid(row=0, column=0, columnspan=1, sticky=N + S + W + E,
                          padx=2, pady=2)
        self.ddl_lang.grid(row=1, column=0, sticky=N, padx=2, pady=0)
        self.can.grid(row=4, column=0, sticky=N + S + W + E, padx=2, pady=2)
        self.val.grid(row=4, column=1, sticky=N + S + W + E, padx=2, pady=2)

        # tooltips
        InfoBulle(self.ddl_lang, message=self.dico_help.get(32)[1])

                ### Notebook placement
        self.nb.grid(row=0, rowspan=4, column=1, sticky=N + S + W + E)
        # keep updated list of profiles
        self.maj()

    def maj(self):
        """
        update the profiles dropdown list every second
        """
        try:
            self.li_profiles(self.ddl_lang.get())
            self.ddl_profil['values'] = self.li_pro
            self.after(1000, self.maj)
        except WindowsError:    # avoid an error occuring with browse button
            self.after(1000, self.maj)
            pass

    def alter_state(self, parent, new_state):
        """
        just a function to change easily  the state of  all children widgets
        of a parent class

        parent=Tkinter class with children (Frame, Labelframe, Tk, etc.)
        new_state=Tkinter keyword for widget state (ACTIVE, NORMAL, DISABLED)
        """
        for child in parent.winfo_children():
            child.configure(state=new_state)
        # end of function
        return parent, new_state

    def catalog_dependance(self):
        """ unselect the catalog option if the word option is unselected """
        if self.def_doc.get() == 0:
            self.def_cat.set(0)
            self.caz_cat.config(state='disabled')
        elif self.def_doc.get() == 1:
            self.caz_cat.config(state='normal')
        # end of function
        return

    def load_settings(self):
        u""" load settings from last execution """
        confile = 'options.ini'
        config = ConfigParser.RawConfigParser()
        config.read(confile)
        # basics
        self.def_lang = config.get('basics', 'def_codelang')
        self.def_rep = config.get('basics', 'def_rep')
        # export preferences
        self.def_doc.set(config.get('export_preferences', 'def_word'))
        self.def_cat.set(config.get('export_preferences', 'def_cat'))
        self.def_xls.set(config.get('export_preferences', 'def_xls'))
        self.def_xml.set(config.get('export_preferences', 'def_xml'))
        self.def_dict.set(config.get('export_preferences', 'def_dict'))
        self.def_odt.set(config.get('export_preferences', 'def_odt'))
        # log
        self.logger.info('Last options loaded')
        # End of function
        return config, self.def_rep, self.def_lang, self.def_doc

    def save_settings(self):
        u""" save options in order to make the next execution easier """
        confile = 'options.ini'
        config = ConfigParser.RawConfigParser()
        # add sections
        config.add_section('basics')
        config.add_section('export_preferences')
        # basics
        config.set('basics', 'def_codelang', self.ddl_lang.get())
        config.set('basics', 'def_rep', self.target.get())
        # export preferences
        config.set('export_preferences', 'def_word', self.def_doc.get())
        config.set('export_preferences', 'def_cat', self.def_cat.get())
        config.set('export_preferences', 'def_xls', self.def_xls.get())
        config.set('export_preferences', 'def_xml', self.def_xml.get())
        config.set('export_preferences', 'def_dict', self.def_dict.get())
        config.set('export_preferences', 'def_odt', self.def_odt.get())
        # Writing the configuration file
        with open(confile, 'wb') as configfile:
            config.write(configfile)
        # End of function
        return config

    def change_lang(self, event):
        u""" update the texts dictionary with the language selected """
        new_lang = event.widget.get()
        # change to the new language selected
        self.load_texts(new_lang)
        self.li_profiles(new_lang)
        self.li_rekurs(new_lang)
        self.ddl_profil.delete(0, END)
        self.ddl_profil.config(values=self.li_pro)
        self.ddl_profil.update()
        self.ddl_attr.config(values=self.dico_rekur.keys())
        self.recup_help(new_lang)
        # update widgets text
          # tab1
        self.nb.tab(0, text=self.blabla.get('gui_tab1'))
        self.welcome.config(text=self.blabla.get('hi') + self.uzer)
        self.can.config(text=self.blabla.get('gui_quit'))
        self.FrPath.config(text=self.blabla.get('tab1_fr1'))
        self.FrProg.config(text=self.blabla.get('tab1_frprog'))
        self.labtarg.config(text=self.blabla.get('tab1_path'))
        self.browsetarg.config(text=self.blabla.get('tab1_browse'))
        self.val.config(text=self.blabla.get('tab1_go'))
        self.profil.config(text=self.blabla.get('tab1_prof'))
          # tab2
        self.nb.tab(1, text=self.blabla.get('gui_tab2'))
        self.caz_cat.config(text=self.blabla.get('tab2_merge'))
          # tab3
        self.nb.tab(2, text=self.blabla.get('gui_tab3'))
        self.lab_chps.config(text=self.blabla.get('tab3_sele'))
        self.supr.config(text=self.blabla.get('tab3_supp'))
        self.FrRekur.config(text=self.blabla.get('tab3_tit'))
        self.tab3_LBnom.config(text=self.blabla.get('tab3_nom'))
        self.tab3_LBdesc.config(text=self.blabla.get('tab3_desc'))
        self.tab3_CBcass.config(text=self.blabla.get('tab3_cass'))
        self.tab3_CBstat.config(text=self.blabla.get('tab3_stat'))
        self.save.config(text=self.blabla.get('tab3_save'))

        # End of function
        return self.blabla

    def load_texts(self, lang='FR'):
        u"""
        Load texts according to the selected language
        """
        # clearing the text dictionary
        self.blabla.clear()
        # open xml cursor
        xml = ET.parse('locale/{0}/lang_{0}.xml'.format(lang))
        # Looping and gathering texts from the xml file
        for elem in xml.getroot().getiterator():
            self.blabla[elem.tag] = elem.text
        # updating the GUI
        self.update()
        # en of function
        return self.blabla

    def setpathtarg(self):
        """ ...browse and insert the path of target folder """
        foldername = askdirectory(parent=self,
                                  initialdir=self.def_rep,
                                  mustexist=True,
                                  title=self.blabla.get('gui_cible'))
        # check if a folder has been choosen
        if foldername:
            try:
                self.target.delete(0, END)
                self.target.insert(0, foldername)
            except:
                info(title=self.blabla.get('nofolder'),
                     message=self.blabla.get('nofolder'))
                return

        # count shapefiles and MapInfo files in a separated thread
        proc = threading.Thread(target=self.li_geofiles,
                                args=(foldername, ))
        proc.daemon = True
        proc.start()

        # end of function
        return foldername

    def li_geofiles(self, foldertarget):
        u""" List shapefiles and MapInfo files (.tab, not .mid/mif) contained
        in the folders structure """
        # reseting global variables
        self.li_shp = []
        self.li_tab = []
        self.browsetarg.config(state=DISABLED)
        # Looping in folders structure
        self.status.set(self.blabla.get('tab1_prog1'))
        self.prog_layers.start()
        for root, dirs, files in walk(unicode(foldertarget)):
            self.num_folders = self.num_folders + len(dirs)
            for f in files:
                """ looking for files with geographic data """
                try:
                    unicode(path.join(root, f))
                    full_path = path.join(root, f)
                except UnicodeDecodeError:
                    full_path = path.join(root, f.decode('latin1'))
                # Looping on files contained
                if path.splitext(full_path.lower())[1].lower() == '.shp'\
                   and (path.isfile('{0}.dbf'.format(full_path[:-4]))
                        or path.isfile('{0}.DBF'.format(full_path[:-4])))\
                   and (path.isfile('{0}.shx'.format(full_path[:-4]))
                        or path.isfile('{0}.SHX'.format(full_path[:-4]))):
                    """ listing compatible shapefiles """
                    # add complete path of shapefile
                    self.li_shp.append(full_path)
                elif path.splitext(full_path.lower())[1] == '.tab'\
                    and (path.isfile(full_path[:-4] + '.dat')
                         or path.isfile(full_path[:-4] + '.DAT'))\
                    and (path.isfile(full_path[:-4] + '.map')
                         or path.isfile(full_path[:-4] + '.MAP'))\
                    and (path.isfile(full_path[:-4] + '.id')
                         or path.isfile(full_path[:-4] + '.ID')):
                    """ listing MapInfo tables """
                    # add complete path of MapInfo file
                    self.li_tab.append(full_path)
        # stopping the progress bar
        self.prog_layers.stop()
        # Lists ordering and tupling
        self.li_shp.sort()
        self.li_shp = tuple(self.li_shp)
        self.li_tab.sort()
        self.li_tab = tuple(self.li_tab)
        # setting the label text and activing the buttons
        self.status.set(unicode(len(self.li_shp)) + u' shapefiles - '
                        + unicode(len(self.li_tab)) + u' tables (MapInfo) - '
                        + unicode(self.num_folders) + self.blabla.get('log_numfold'))
        self.browsetarg.config(state=ACTIVE)
        self.val.config(state=ACTIVE)
        # End of function
        return foldertarget, self.li_shp, self.li_tab

    def li_profiles(self, lang):
        u"""
        list profiles already existing
        """
        # reseting global variable
        self.li_pro = []
        # Looping in folders structure
        folder_profiles = path.join('locale/', lang + '/profiles/')
        self.li_pro = [lg[:-4] for lg in listdir(folder_profiles)]
        self.li_pro.append(self.blabla.get('tab1_new'))
        # End of function
        return folder_profiles, self.li_pro

    def li_rekurs(self, lang):
        u"""
        List recurring attributes that already exist in the selected language
        """
        # clearing the text dictionary
        self.dico_rekur.clear()
        champis = path.abspath(r'locale/{0}/champignons_{0}.xml'.format(lang))
        xml = ET.parse(champis)
        # Looping and gathering texts from the xml file
        for elem in xml.findall('champ'):
            rek_name = elem.find('intitule').text
            rek_desc = elem.find('description').text
            rek_kass = elem.find('case').text
            rek_stat = elem.find('stats').text
            self.dico_rekur[rek_name] = rek_desc, rek_kass, rek_stat
        self.dico_rekur[self.blabla.get('tab3_new')] = '', 0, 0
        # updating the GUI
        self.update()
        # End of function
        return self.dico_rekur

    def edit_rekur(self, event):
        u"""
        preparing the form to edit a recurring attribute
        """
        rekur = event.widget.get()
        # deactivate the selector
        self.ddl_attr.config(state=DISABLED)
        # activate the form
        self.alter_state(self.FrRekur, NORMAL)
        # change to the new language selected
        self.tab3_ENnom.insert(0, rekur)
        self.tab3_TXdesc.insert(1.0, self.dico_rekur.get(rekur)[0])
        self.def_kass.set(self.dico_rekur.get(rekur)[1])
        self.def_stat.set(self.dico_rekur.get(rekur)[2])
        # End of function
        return self.dico_rekur

    def save_rekur(self):
        u""" save the recurring attribute edited """
        # check if the attribute already exists
        if self.tab3_ENnom.get() in self.dico_rekur:
            if not askyesno(title=self.blabla.get('tab3_alert_exist1'),
                            message=self.blabla.get('tab3_alert_exist2')):
                return
            else:
                pass
        else:
            pass

        # save
        self.dico_rekur[self.tab3_ENnom.get()] = self.tab3_TXdesc.get(1.0, END).rstrip(),\
                                                 self.def_kass.get(),\
                                                 self.def_stat.get()
        # reset the form
        self.tab3_ENnom.delete(0, END)
        self.tab3_TXdesc.delete(1.0, END)
        self.def_kass.set(0)
        self.def_stat.set(0)
        # deactivate the form
        self.alter_state(self.FrRekur, DISABLED)
        # updating the dropdown list
        self.ddl_attr.config(state=NORMAL)
        self.ddl_attr.delete(0, END)
        self.ddl_attr['values'] = self.dico_rekur.keys()

        # End of function
        return self.dico_rekur

    def del_rekur(self):
        u""" delete the selected recurring attribute """
        # reactivate the selector
        self.ddl_attr.config(state=ACTIVE)
        self.dico_rekur.pop(self.ddl_attr.get())

        self.ddl_attr.delete(0, END)
        self.ddl_attr['values'] = self.dico_rekur.keys()
        # reset the form
        self.tab3_ENnom.delete(0, END)
        self.tab3_TXdesc.delete(1.0, END)
        self.def_kass.set(0)
        self.def_stat.set(0)
        # deactivate the form
        self.alter_state(self.FrRekur, DISABLED)

        # End of function
        return self.dico_rekur

    def saveas_rekurs(self, lang):
        u""" save the recurring fields into the file dedicated """
        rekur = ET.Element(u'champs')
        xml_path = r'locale/{0}/champignons_{0}.xml'.format(lang)
        self.dico_rekur.pop(self.blabla.get('tab3_new'))
        with open(xml_path, 'w') as champis:
            for elem in self.dico_rekur.keys():
                rek = ET.SubElement(rekur, u'champ')
                # name of recurring attribute
                rek_name = ET.SubElement(rek, u'intitule')
                rek_name.text = elem
                # description of recurring attribute
                rek_desc = ET.SubElement(rek, u'description')
                rek_desc.text = self.dico_rekur.get(elem)[0]
                # stats option of recurring attribute
                rek_stats = ET.SubElement(rek, u'stats')
                rek_stats.text = unicode(self.dico_rekur.get(elem)[1])
                # case sensitive option of recurring attribute
                rek_case = ET.SubElement(rek, u'case')
                rek_case.text = unicode(self.dico_rekur.get(elem)[2])

        # creating the xml tree
        out_rekurs = ET.ElementTree(rekur)
        # saving it
        out_rekurs.write(xml_path,
                         encoding='utf-8',
                         xml_declaration='version="1.0"',
                         method='xml')

        # End of function
        return self.dico_rekur

    def select_profil(self, event):
        """ when a profile is selected... """
        profsel = event.widget.get()
        # if user wants to use an existing profile or create a new one
        if profsel == self.blabla.get('tab1_new'):
            self.val.config(text=self.blabla.get('tab1_crprofil'))
        else:
            self.val.config(text=self.blabla.get('tab1_go'))

        # end of function
        return self.val

    def recup_profil(self, lang):
        """ get the information from the profile selected """
        # clearing the profile dictionary
        self.dico_profil.clear()
        # specific path to profile file
        path_profile = path.join('locale/{0}/profiles/{1}.xml'.format(lang,
                                                                      self.ddl_profil.get()))
        with open(path_profile, 'r') as profile:
            # open xml parser
            xml = ET.parse(profile)
            # basic informations
            self.dico_profil['description'] = xml.find('description').text
            self.dico_profil['sources'] = xml.find('sources').text
            self.dico_profil['url'] = xml.find('url').text
            self.dico_profil['url_label'] = xml.find('url_label').text
            self.dico_profil[u'diffusion'] = xml.find('diffusion').text
            # data language
            lang_data = xml.find(u'lang_data')
            self.dico_profil[u"lang_data"] = lang_data.find(u'name').text
            # metadata language
            lang_metad = xml.find(u'lang_metad')
            self.dico_profil[u"lang_md"] = lang_metad.find(u'name').text
            # diffusion constraints
            diff = xml.find(u'diffusion')
            self.dico_profil['diffusion'] = diff.find(u'name').text
            # update rythm
            rythm = xml.find(u'rythm')
            self.dico_profil['rythm'] = rythm.find(u'name').text
            # INSPIRE themes
            themes = xml.find('themesinspire')
            li_themesinspire = [theme.find('name').text for theme in themes.findall('theme')]
            self.dico_profil['themesinspire'] = li_themesinspire
            # custom keywords
            keywords = xml.find('keywords')
            li_keywords = [keyword.find('name').text for keyword in keywords.findall('keyword')]
            self.dico_profil['keywords'] = li_keywords
            # places keywords
            geokeywords = xml.find('geokeywords')
            li_geokeywords = [geokeyword.find('name').text for geokeyword in geokeywords.findall('geokeyword')]
            self.dico_profil['geokeywords'] = li_geokeywords
            # contacts
            contacts = xml.find(u'contacts')
            # point of contact
            cont = contacts.find(u'pointdecontact')
            self.dico_profil[u'cont_name'] = cont.find(u'name').text
            self.dico_profil[u'cont_orga'] = cont.find(u'org').text
            self.dico_profil[u'cont_mail'] = cont.find(u'mail').text
            self.dico_profil[u'cont_role'] = cont.find(u'role').text
            self.dico_profil[u'cont_func'] = cont.find(u'func')[0].text
            self.dico_profil[u'cont_street'] = cont.find(u'street').text
            self.dico_profil[u'cont_city'] = cont.find(u'city').text
            self.dico_profil[u'cont_cp'] = cont.find(u'cp').text
            self.dico_profil[u'cont_country'] = cont.find(u'country').text
            self.dico_profil[u'cont_phone'] = cont.find(u'tel').text
            # second contact (responsable, etc.)
            resp = contacts.find(u'second_contact')
            self.dico_profil[u'resp_name'] = resp.find(u'name').text
            self.dico_profil[u'resp_orga'] = resp.find(u'org').text
            self.dico_profil[u'resp_mail'] = resp.find(u'mail').text
            self.dico_profil[u'resp_role'] = resp.find(u'role').text
            self.dico_profil[u'resp_func'] = resp.find(u'func')[0].text
            self.dico_profil[u'resp_street'] = resp.find(u'street').text
            self.dico_profil[u'resp_city'] = resp.find(u'city').text
            self.dico_profil[u'resp_cp'] = resp.find(u'cp').text
            self.dico_profil[u'resp_country'] = resp.find(u'country').text
            self.dico_profil[u'resp_phone'] = resp.find(u'tel').text
        # End of function
        return self.dico_profil

    def recup_help(self, lang):
        """ get the help texts """
        # specific path to xml file
        path_help = 'locale/%s/help_%s.xml' % (lang, lang)
        # reading and parsing the xml
        with open(path_help, 'r') as source:
            xml = ET.parse(source)                  # xml cursor
            for tooltip in xml.findall('tooltip'):
                idu = tooltip.find('id').text
                ref = tooltip.find('ref').text
                txt = tooltip.find('txt').text
                img = tooltip.find('image').text
                doc = tooltip.find('doc').text
                # fillfulling the INSPIRE dictionary
                self.dico_help[int(idu)] = ref, txt, img, doc
        # End of function
        return self.dico_help

    def process(self):
        u""" launch the different processes """
        # display the main tab
        self.nb.select(0)
        # check option selected: process or create a new profile
        if self.ddl_profil.get() == self.blabla.get('tab1_new'):
            # launching the profile form
            self.logger.info('Creation of a new profile')
            tr_profile = threading.Thread(target=NewProfile,
                                          args=(self.blabla,
                                                self.ddl_lang.get(),
                                                self.dico_help,
                                                self.li_pro))
            tr_profile.daemon = True
            tr_profile.run()
            # NewProfile(self.blabla, self.ddl_lang.get(), self.li_pro)
            self.li_profiles(self.ddl_lang.get())   # updating the dropdow list
            self.ddl_profil['values'] = self.li_pro
            return
        # check if the target folder has been selected
        if self.target.get() == "":
            info(title=self.blabla.get('info_blanktarget1'),
                 message=self.blabla.get('info_blanktarget2'))
            return
        # check if a profile has been selected
        if self.ddl_profil.get() == "":
            info(title=self.blabla.get('info_blankprofile1'),
                 message=self.blabla.get('info_blankprofile2'))
            return
        # disabling others GUI parts
        self.tab_globals.focus_force()
        self.alter_state(self.FrPath, DISABLED)

        # check if there are some layers into the folder structure
        if len(self.li_shp) + len(self.li_tab) == 0:
            self.logger.warning("No geofiles found in the folder structure")
            self.status.set(self.blabla.get('log_nodata'))
            return
        # specific variables
        dest = path.join(self.target.get(), 'metadator')
        if not path.isdir(dest):    # test if folder already exists
            mkdir(dest, 0777)       # if not, we create it
        # getting profile informations
        self.recup_profil(self.ddl_lang.get())
        # saving options in a separated thread
        tr_options = threading.Thread(target=self.save_settings)
        tr_options.daemon = True
        tr_options.start()
        self.logger.info('Current options saved')
        # saving recurring fiels in a separated thread
        tr_rekurs = threading.Thread(target=self.saveas_rekurs,
                                     args=(self.ddl_lang.get(), ))
        tr_rekurs.daemon = True
        tr_rekurs.start()
        # configuring the progression bar
        self.prog_layers["maximum"] = len(self.li_shp) + len(self.li_tab)
        self.prog_layers["value"]
        # Processing the shapefiles
        self.logger.info('\tStart processing the files')
        for shp in self.li_shp:
            """ looping on shapefiles list """
            self.logger.info('Processing: %s' % path.basename(shp))
            self.status.set(path.basename(shp))
            # reset recipient data
            self.dico_layer.clear()
            self.dico_fields.clear()
            # getting separated process threads
            Read_SHP(shp,
                     self.dico_layer,
                     self.dico_fields,
                     'shape',
                     self.blabla)
            # checking layer error
            if self.dico_layer.get('error'):
                # increment the progress bar
                self.prog_layers["value"] = self.prog_layers["value"] + 1
                self.update()
                self.logger.warning('This shape has an issue: %s' % shp)
                continue
            # getting fields statistics only if needed
            if self.def_doc.get() == 1 or self.def_xls.get() == 1 or self.def_odt.get() == 1:
                StatsFields(shp, self.dico_fields, self.dico_rekur, self.blabla)
            # export according to options selected
            if self.def_doc.get() == 1:
                ExportToHTML(dest,
                             self.dico_layer,
                             self.dico_fields,
                             self.dico_profil,
                             self.dico_rekur,
                             self.blabla)
                html_path = path.join(dest,
                                      "{0}_MD.html".format(self.dico_layer['name'][:-4]))
                ExportToDocX(html_path, dest)
            if self.def_xls.get() == 1:
                ExportToXLS(dest,
                            self.dico_layer,
                            self.dico_fields,
                            self.dico_profil,
                            self.dico_rekur,
                            self.blabla)
            if self.def_xml.get() == 1:
                ExportToXML(dest,
                            self.dico_layer,
                            self.dico_profil,
                            '',
                            self.blabla,
                            1,
                            0)
            if self.def_odt.get() == 1:
                ExportToODT(dest,
                            self.dico_layer,
                            self.dico_fields,
                            self.dico_profil,
                            self.dico_rekur,
                            self.blabla)
            # increment the progress bar
            self.prog_layers["value"] = self.prog_layers["value"] + 1
            self.update()

        # Processing the MapInfo tables
        for tab in self.li_tab:
            """ looping on MapInfo tables list """
            self.logger.info('Processing: %s' % path.basename(tab))
            self.status.set(path.basename(tab))
            # reset recipient data
            self.dico_layer.clear()
            self.dico_fields.clear()
            # getting the informations
            Read_TAB(tab,
                     self.dico_layer,
                     self.dico_fields,
                     'table',
                     self.blabla)
            # checking layer error
            if self.dico_layer.get('error'):
                self.logger.warning('This MapInfo table has an issue: %s' % tab)
                # increment the progress bar
                self.prog_layers["value"] = self.prog_layers["value"] +1
                self.update()
                continue
            # getting fields statistics only if needed
            if self.def_doc.get() == 1 \
               or self.def_xls.get() == 1 \
               or self.def_odt.get() == 1:
                StatsFields(tab, self.dico_fields, self.dico_rekur, self.blabla)
            # export according to options selected
            if self.def_doc.get() == 1:
                ExportToHTML(dest,
                             self.dico_layer,
                             self.dico_fields,
                             self.dico_profil,
                             self.dico_rekur,
                             self.blabla)
                html_path = path.join(dest,
                                      "{0}_MD.html".format(self.dico_layer['name'][:-4]))
                ExportToDocX(html_path, dest)
            if self.def_xls.get() == 1:
                ExportToXLS(dest,
                            self.dico_layer,
                            self.dico_fields,
                            self.dico_profil,
                            self.dico_rekur,
                            self.blabla)
            if self.def_xml.get() == 1:
                ExportToXML(dest,
                            self.dico_layer,
                            self.dico_profil,
                            '',
                            self.blabla,
                            1,
                            0)
            if self.def_odt.get() == 1:
                ExportToODT(dest,
                            self.dico_layer,
                            self.dico_fields,
                            self.dico_profil,
                            self.dico_rekur,
                            self.blabla)
            # increment the progress bar
            self.prog_layers["value"] = self.prog_layers["value"] + 1
            self.update()

        # Word catalog export
        if self.def_doc.get() == 1 and self.def_cat.get() == 1:
            self.status.set(self.blabla.get('info_cat'))
            self.update()
            DocxMerger(dest, '00_Metadator_Catalog', 'metadator_')
        else:
            pass

        # final message
        # msg = self.blabla.get('info_end2') + self.blabla.get('info_end3')
        # info(title=self.blabla.get('info_end'), message=msg)
        # opening the destination folder
        self.open_dir_file(dest)
        # cleaning up
        logging.info('Hurray! It worked! All seem to have been fine!')
        self.destroy()
        # end of function
        return

    def open_dir_file(self, target):
        """
        Open a file or a directory in the explorer of the operating system
        http://sametmax.com/ouvrir-un-fichier-avec-le-bon-programme-en-python
        """
        # check if the file or the directory exists
        if not path.exists(target):
            raise IOError('No such file: {0}'.format(target))

        # check the read permission
        if not access(target, R_OK):
            raise IOError('Cannot access file: {0}'.format(target))

        # open the directory or the file according to the os
        if opersys == 'win32':  # Windows
            proc = startfile(target)

        elif opersys.startswith('linux'):  # Linux:
            proc = subprocess.Popen(['xdg-open', target],
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)

        elif opersys == 'darwin':  # Mac:
            proc = subprocess.Popen(['open', '--', target],
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)

        else:
            raise NotImplementedError(
                "Your `%s` isn't a supported operating system`." % opersys)

        # end of function
        return proc
Exemple #28
0
class MainFrame(Frame):
    def __init__(self,parent,stdoutq):
        Frame.__init__(self,parent)

        self.parent=parent
        self.width=750
        self.height=450
        self.title=ximaexport.__version__
        self.stdoutq=stdoutq
        
        self.initUI()

        self.hasdb=False
        self.hasout=False
        self.exit=False

        self.path_frame=self.addPathFrame()
        self.action_frame=self.addActionFrame()
        self.message_frame=self.addMessageFrame()
        self.printStr()

        self.stateq=Queue.Queue()


    def centerWindow(self):
        sw=self.parent.winfo_screenwidth()
        sh=self.parent.winfo_screenheight()
        x=(sw-self.width)/2
        y=(sh-self.height)/2
        self.parent.geometry('%dx%d+%d+%d' \
                %(self.width,self.height,x,y))


    def initUI(self):
        self.parent.title(self.title)
        self.style=Style()
        #Choose from default, clam, alt, classic
        self.style.theme_use('alt')
        self.pack(fill=tk.BOTH,expand=True)
        self.centerWindow()


    def printStr(self):
        while self.stdoutq.qsize() and self.exit==False:
            try:
                msg=self.stdoutq.get()
                self.text.update()
                self.text.insert(tk.END,msg)
                self.text.see(tk.END)
            except Queue.Empty:
                pass
        self.after(100,self.printStr)



    def checkReady(self):

        if self.hasdb and self.hasout:
            self.start_button.configure(state=tk.NORMAL)
            #print('XimaExport Ready.')
            printch('XimaExport 就绪.')
        else:
            self.start_button.configure(state=tk.DISABLED)


    def addPathFrame(self):
        frame=Frame(self)
        frame.pack(fill=tk.X,expand=0,side=tk.TOP,padx=8,pady=5)

        frame.columnconfigure(1,weight=1)

        #------------------Database file------------------
        label=tk.Label(frame,text=dgbk('ting.sqlite文件:'),\
                bg='#bbb')
        label.grid(row=0,column=0,\
                sticky=tk.W,padx=8)

        self.db_entry=tk.Entry(frame)
        self.db_entry.grid(row=0,column=1,sticky=tk.W+tk.E,padx=8)

        self.db_button=tk.Button(frame,text=dgbk('打开'),command=self.openFile)
        self.db_button.grid(row=0,column=2,padx=8,sticky=tk.E)

        #--------------------Output dir--------------------
        label2=tk.Label(frame,text=dgbk('导出到文件夹:'),\
                bg='#bbb')
        label2.grid(row=2,column=0,\
                sticky=tk.W,padx=8)

        self.out_entry=tk.Entry(frame)
        self.out_entry.grid(row=2,column=1,sticky=tk.W+tk.E,padx=8)
        self.out_button=tk.Button(frame,text=dgbk('选择'),command=self.openDir)
        self.out_button.grid(row=2,column=2,padx=8,sticky=tk.E)
        


    def openDir(self):
        self.out_entry.delete(0,tk.END)
        dirname=askdirectory()
        self.out_entry.insert(tk.END,dirname)
        if len(dirname)>0:
            #print('Output folder: %s' %dirname)
            printch('输出到文件夹:')
	    print('   '+dirname)
            self.hasout=True
            self.checkReady()


    def openFile(self):
        self.db_entry.delete(0,tk.END)
        ftypes=[('sqlite files','*.sqlite'),('ALL files','*')]
        filename=askopenfilename(filetypes=ftypes)
        self.db_entry.insert(tk.END,filename)
        if len(filename)>0:
            #print('Database file: %s' %filename)
            printch('数据文件:')
	    print('   '+filename)
            self.probeAlbums()


    def probeAlbums(self):
        dbfile=self.db_entry.get()
        try:
            db=sqlite3.connect(dbfile)
            df=ximaexport.getData(db)
            self.albumlist=ximaexport.getAlbumList(df,None)   #(id, name)
            self.albumnames=['All']+[ii[1] for ii in self.albumlist] #names to display
            self.albummenu['values']=tuple(self.albumnames)
            self.albummenu.current(0)
            db.close()

            self.hasdb=True
            self.checkReady()

        except Exception as e:
            #print('Failed to recoganize the given database file.') 
            printch('无法识别sqlite数据文件.') 
            print(e)



    
    def addActionFrame(self):

        frame=Frame(self,relief=tk.RAISED,borderwidth=1)
        frame.pack(fill=tk.X,side=tk.TOP,\
                expand=0,padx=8,pady=5)

        #label=tk.Label(frame,text='Actions:',bg='#bbb')
        #label.grid(row=0,column=0,sticky=tk.W,padx=8)

        #---------------Action checkbuttons---------------
        frame.columnconfigure(0,weight=1)

        #---------------------2nd row---------------------
        subframe=Frame(frame)
        subframe.grid(row=1,column=0,columnspan=6,sticky=tk.W+tk.E,\
                pady=5)

        #-------------------Album options-------------------
        albumlabel=tk.Label(subframe,text=dgbk('专辑:'),\
                bg='#bbb')
        albumlabel.pack(side=tk.LEFT, padx=8)

        self.album=tk.StringVar()
        self.albumnames=['All',]
        self.albummenu=Combobox(subframe,textvariable=\
                self.album,values=self.albumnames,state='readonly')
        self.albummenu.current(0)
        self.albummenu.bind('<<ComboboxSelected>>',self.setAlbum)
        self.albummenu.pack(side=tk.LEFT,padx=8)
        
        #-------------------Quit button-------------------
        quit_button=tk.Button(subframe,text=dgbk('退出'),\
                command=self.quit)
        quit_button.pack(side=tk.RIGHT,padx=8)

        #-------------------Stop button-------------------
        '''
        self.stop_button=tk.Button(subframe,text='Stop',\
                command=self.stop)
        self.stop_button.pack(side=tk.RIGHT,padx=8)
        '''
                
        #-------------------Start button-------------------
        self.start_button=tk.Button(subframe,text=dgbk('开始'),\
                command=self.start,state=tk.DISABLED)
        self.start_button.pack(side=tk.RIGHT,pady=8)

        #-------------------Help button-------------------
        self.help_button=tk.Button(subframe,text=dgbk('帮助'),\
                command=self.showHelp)
        self.help_button.pack(side=tk.RIGHT,padx=8)





    def setAlbum(self,x):
	import json
        self.albummenu.selection_clear()
        self.album=self.albummenu.get()
        self.albummenu.set(self.album)
        if self.album=='All':
            #print('Work on all albums.')
            printch('导出所有专辑.')
        else:
            #print('Select album: '+self.album)
            printch('导出所选专辑:')
	    print('   '+self.album)





    def showHelp(self):
        helpstr=dgbk('''\n\n
导出喜马拉雅下载音频,并自动按专辑归档、重命名:\n
1. 找到手机/pad中的喜马拉雅数据文件夹:\n
    (1)苹果用户:链接电脑itunes,在app一栏中找到“喜马拉雅”,单击,右侧会出现“喜马拉雅”的数据文件。选择“iDoc”,并导出到电脑。\n
    (2)安卓用户:链接电脑后,拷贝出ting文件夹。\n
2. 运行ximaexport-gui.exe。\n
    在 “ting.sqlite文件”一栏,选择步骤1中拷贝出的文件夹里的 ting.sqlite. 文件。\n
    在 “导出到文件夹”一栏,选择音频存储位置。\n
    在 “专辑”下拉菜单,选择要导出的专辑。若全部导出选择“All”。\n
    点击“开始”开始处理。
''')

        tkMessageBox.showinfo(title='Help', message=helpstr)
        #print(self.menfolder.get())



    def start(self):
        dbfile=self.db_entry.get()
        outdir=self.out_entry.get()
        self.album=self.albummenu.get()

        self.out_button.configure(state=tk.DISABLED)
        self.start_button.configure(state=tk.DISABLED)
        self.help_button.configure(state=tk.DISABLED)
        self.albummenu.configure(state=tk.DISABLED)
        self.messagelabel.configure(text=dgbk('信息 (处理中...)'))

        album=None if self.album=='All' else self.album

        args=[dbfile,outdir,album,True]

        self.workthread=WorkThread('work',False,self.stateq)
        self.workthread.deamon=True

        self.workthread.args=args
        self.workthread.start()
        self.reset()


    def reset(self):
        while self.stateq.qsize() and self.exit==False:
            try:
                msg=self.stateq.get()
                if msg=='done':
                    self.db_button.configure(state=tk.NORMAL)
                    self.out_button.configure(state=tk.NORMAL)
                    self.start_button.configure(state=tk.NORMAL)
                    self.help_button.configure(state=tk.NORMAL)
                    self.albummenu.configure(state='readonly')
                    self.messagelabel.configure(text=dgbk('消息'))
                    return
            except Queue.Empty:
                pass
        self.after(100,self.reset)


    
    def stop(self):
        #self.workthread.stop()
        pass
        

    def addMessageFrame(self):
        frame=Frame(self)
        frame.pack(fill=tk.BOTH,side=tk.TOP,\
                expand=1,padx=8,pady=5)

        self.messagelabel=tk.Label(frame,text=dgbk('消息'),bg='#bbb')
        self.messagelabel.pack(side=tk.TOP,fill=tk.X)

        self.text=tk.Text(frame)
        self.text.pack(side=tk.TOP,fill=tk.BOTH,expand=1)
        self.text.height=10

        scrollbar=tk.Scrollbar(self.text)
        scrollbar.pack(side=tk.RIGHT,fill=tk.Y)

        self.text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.text.yview)
Exemple #29
0
class UIBidding(Notify):


    class CoincheException(Exception):
        def __init__(self, pid):
            self.pid = pid


    def __init__(self, root, x, y, size_x, size_y):
        Notify.__init__(self)

        # Memorise the frame
        self._root = root 

        self._frame = Frame(width = size_x, height = size_y) 
        # No resize
        self._frame.pack_propagate(0)
        # Style
        self._frame.config(borderwidth = 5)

        self._x = x
        self._y = y

        # Init the buttons
        self._init_buttons()

        # Will be used to notify the main thread when waiting for a call 
        self.need_bid_event = Event() 
        # Will be used to notify the main thread when waiting for a coinche 
        self.coinche_event = Event() 

        self.pid = 0
        self._last_bid = None 
        
        self.enable()
     
    def display(self): 
        """
            Display the widget on the table

        """
        self._frame.place(in_ = self._root, x = self._x, y = self._y)


    def hide(self):
        """
            Hide the pannel when the biddings are closed for example

        """
        self._frame.place_forget()


    def _init_color_buttons(self):
        """
            Init the buttons to select the color

        """
        # Dedicated frame for buttons
        self._buttons_frame = Frame()
        # This dictionnary will contains all the color buttons
        self._buttons = dict()
        # Several colors are available
        colors = list(Bidding.colors)
        colors.pop()
        # The buttons need to have a fixed size
        h = 2
        w = 2

        for c in colors:
            self._buttons[c] = Button(self._buttons_frame, text=c, \
                                      height=h, width=w, \
                                      command=lambda c=c: self._click_color(c))
            self._buttons[c].pack(side = LEFT)

        # Pack the dedicated frame into the main frame
        self._buttons_frame.pack(in_ = self._frame)

        self._selected_color = None 


    def _init_value_box(self):
        """
            Init the list box which select the value of the bid

        """
        availableValue = Bidding.values 
        # TODO: display "pass" instead of "0"
        #availableValue[0] = "pass"
        self._value_box = Combobox(self._frame, \
                                   values = availableValue, \
                                   # TODO
                                   # Only justify the selected value
                                   #justify = RIGHT, \
                                   state = 'readonly')
        self._value_box.bind("<<ComboboxSelected>>", lambda x: self._update_bid_button())
        self._value_box.set(availableValue[0])
        self._value_box.pack(fill = X)


    @staticmethod
    def raise_(e):
        raise e


    def _init_bid_button(self):
        # To bid
        self._bid_button = Button(self._frame, text = "Pass", \
                                  command = self._click_bidding)
        self._bid_button.pack(fill = X)
        # To coinche
        self._coinche_button = Button(self._frame, text = "Coinche", \
                command = lambda: self._event[EVT_UI_COINCHE]()) 
        self._coinche_button.pack(fill = X)


    def _init_buttons(self):
        """
            Init the buttons 

        """
        # Put the value box on top of the buttons
        self._init_value_box()
        self._init_color_buttons()
        self._init_bid_button() 


    def _click_color(self, color):
        self._selected_color = color 
        self._update_bid_button()


    def _click_bidding(self):
        """
            Callback function on bidding click  

        """
        if self._bid_button.config('text')[-1] == "Pass":
            self._last_bid = Bidding(self.pid)
        else:
            if self._selected_color is None:
                self._event[CONSOLE_RED]("Choose a color!")
                return
            c = self._selected_color
            v = int(self._value_box.get())
            self._last_bid = Bidding(self.pid, v, c) 
        # Notify the consumer (main thread)
        self.need_bid_event.set()
        # Reset the event
        self.need_bid_event.clear()


    def _click_coinche(self):
        # Notify the consumer
        self.coinche_event.set()
        # Reset the event
        self.coinche_event.clear()


    def _update_bid_button(self):
        value = self._value_box.get()
        color = self._selected_color
        if value == "0" and color is None:
            self._bid_button.config(text = "Pass")
        elif value == "0":
            self._bid_button.config(text = "Bid " + color)
        elif color is None: 
            self._bid_button.config(text = "Bid " + value)
        else:
            self._bid_button.config(text = "Bid " + value + " " + color)


    @property
    def last_bid(self):
        return self._last_bid


    @last_bid.setter
    def last_bid(self, value):
        if value is None:
            self._bid_button.config(text = "Pass")
            self._last_bid = None 
        else:
            raise Exception("Should not be called")


    def disable(self):
        """
            Disable the bid button

        """
        self._bid_button.config(state = DISABLED)


    def enable(self):
        """
            Enable the bid button

        """
        self._bid_button.config(state = NORMAL)
class MainFrame(Frame):
    def __init__(self,parent,stdoutq):
        Frame.__init__(self,parent)

        self.parent=parent
        self.width=700
        self.height=400
        self.title='Menotexport v1.0'
        self.stdoutq=stdoutq

        self.initUI()

        self.hasdb=False
        self.hasout=False
        self.hasaction=False
        self.exit=False

        self.path_frame=self.addPathFrame()
        self.action_frame=self.addActionFrame()
        self.message_frame=self.addMessageFrame()
        self.printStr()

        self.stateq=Queue.Queue()
        #self.workproc=Pool(1)




    def centerWindow(self):
        sw=self.parent.winfo_screenwidth()
        sh=self.parent.winfo_screenheight()
        x=(sw-self.width)/2
        y=(sh-self.height)/2
        self.parent.geometry('%dx%d+%d+%d' \
                %(self.width,self.height,x,y))


    def initUI(self):
        self.parent.title(self.title)
        self.style=Style()
        #Choose from default, clam, alt, classic
        self.style.theme_use('alt')
        self.pack(fill=tk.BOTH,expand=True)
        self.centerWindow()


    def printStr(self):
        while self.stdoutq.qsize() and self.exit==False:
            try:
                msg=self.stdoutq.get()
                self.text.update()
                self.text.insert(tk.END,'# '+msg)
                self.text.see(tk.END)
            except Queue.Empty:
                pass
        self.after(100,self.printStr)


    def checkReady(self):
        if self.isexport.get()==1 or self.ishighlight.get()==1\
                or self.isnote.get()==1:
            self.hasaction=True
        else:
            self.hasaction=False

        if self.hasdb and self.hasout and self.hasaction:
            self.start_button.configure(state=tk.NORMAL)
            print('Menotexport Ready.')
        else:
            self.start_button.configure(state=tk.DISABLED)


    def addPathFrame(self):
        frame=Frame(self)
        frame.pack(fill=tk.X,expand=0,side=tk.TOP,padx=8,pady=5)

        frame.columnconfigure(1,weight=1)

        #------------------Database file------------------
        label=tk.Label(frame,text='Mendeley Data file:',\
                bg='#bbb')
        label.grid(row=0,column=0,\
                sticky=tk.W,padx=8)

        self.db_entry=tk.Entry(frame)
        self.db_entry.grid(row=0,column=1,sticky=tk.W+tk.E,padx=8)

        self.db_button=tk.Button(frame,text='Open',command=self.openFile)
        self.db_button.grid(row=0,column=2,padx=8,sticky=tk.E)

        hint='''
Default location on Linux:
~/.local/share/data/Mendeley\ Ltd./Mendeley\ Desktop/[email protected]
Default location on Windows:
C:\Users\Your_name\AppData\Local\Mendeley Ltd\Mendeley Desktop\[email protected]'''

        hint_label=tk.Label(frame,text=hint,\
                justify=tk.LEFT,anchor=tk.NW)
        hint_label.grid(row=1,column=0,columnspan=3,\
                sticky=tk.W,padx=8)

        #--------------------Output dir--------------------
        label2=tk.Label(frame,text='Output folder:',\
                bg='#bbb')
        label2.grid(row=2,column=0,\
                sticky=tk.W,padx=8)

        self.out_entry=tk.Entry(frame)
        self.out_entry.grid(row=2,column=1,sticky=tk.W+tk.E,padx=8)
        self.out_button=tk.Button(frame,text='Choose',command=self.openDir)
        self.out_button.grid(row=2,column=2,padx=8,sticky=tk.E)
        


    def openDir(self):
        self.out_entry.delete(0,tk.END)
        dirname=askdirectory()
        self.out_entry.insert(tk.END,dirname)
        if len(dirname)>0:
            print('Output folder: %s' %dirname)
            self.hasout=True
            self.checkReady()


    def openFile(self):
        self.db_entry.delete(0,tk.END)
        ftypes=[('sqlite files','*.sqlite'),('ALl files','*')]
        filename=askopenfilename(filetypes=ftypes)
        self.db_entry.insert(tk.END,filename)
        if len(filename)>0:
            print('Database file: %s' %filename)
            self.probeFolders()


    def probeFolders(self):
        dbfile=self.db_entry.get()
        try:
            db=sqlite3.connect(dbfile)
            query=\
            '''SELECT Documents.title,
                      DocumentFolders.folderid,
                      Folders.name
               FROM Documents
               LEFT JOIN DocumentFolders
                   ON Documents.id=DocumentFolders.documentId
               LEFT JOIN Folders
                   ON Folders.id=DocumentFolders.folderid
            '''
            ret=db.execute(query)
            data=ret.fetchall()
            df=pd.DataFrame(data=data,columns=['title',\
                    'folerid','name'])
            fetchField=lambda x, f: x[f].unique().tolist()
            folders=fetchField(df,'name')
            folders.sort()
            folders.remove(None)

            self.menfolderlist=['All',]+folders
            self.foldersmenu['values']=tuple(self.menfolderlist)
            self.foldersmenu.current(0)
            db.close()

            self.hasdb=True
            self.checkReady()

        except Exception as e:
            print('Failed to recoganize the given database file.') 
            print(e)





    
    def addActionFrame(self):

        frame=Frame(self,relief=tk.RAISED,borderwidth=1)
        frame.pack(fill=tk.X,side=tk.TOP,\
                expand=0,padx=8,pady=5)

        label=tk.Label(frame,text='Actions:',bg='#bbb')
        label.grid(row=0,column=0,sticky=tk.W,padx=8)

        #---------------Action checkbuttons---------------
        self.isexport=tk.IntVar()
        self.ishighlight=tk.IntVar()
        self.isnote=tk.IntVar()
        self.isseparate=tk.IntVar()

        self.check_export=tk.Checkbutton(frame,text='Export PDFs',\
                variable=self.isexport,command=self.doExport)

        self.check_highlight=tk.Checkbutton(frame,\
                text='Extract highlights',\
                variable=self.ishighlight,command=self.doHighlight)

        self.check_note=tk.Checkbutton(frame,\
                text='Extract notes',\
                variable=self.isnote,command=self.doNote)

        self.check_separate=tk.Checkbutton(frame,\
                text='Save separately',\
                variable=self.isseparate,command=self.doSeparate,\
                state=tk.DISABLED)

        frame.columnconfigure(0,weight=1)

        self.check_export.grid(row=0,column=1,padx=8,sticky=tk.W)
        self.check_highlight.grid(row=0,column=2,padx=8,sticky=tk.W)
        self.check_note.grid(row=0,column=3,padx=8,sticky=tk.W)
        self.check_separate.grid(row=0,column=4,padx=8,sticky=tk.W)

        #---------------------2nd row---------------------
        subframe=Frame(frame)
        subframe.grid(row=1,column=0,columnspan=5,sticky=tk.W+tk.E,\
                pady=5)

        #-------------------Folder options-------------------
        folderlabel=tk.Label(subframe,text='Mendeley folder:',\
                bg='#bbb')
        folderlabel.pack(side=tk.LEFT, padx=8)

        self.menfolder=tk.StringVar()
        self.menfolderlist=['All',]
        self.foldersmenu=Combobox(subframe,textvariable=\
                self.menfolder,values=self.menfolderlist,state='readonly')
        self.foldersmenu.current(0)
        self.foldersmenu.bind('<<ComboboxSelected>>',self.setfolder)
        self.foldersmenu.pack(side=tk.LEFT,padx=8)

        
        #-------------------Quit button-------------------
        quit_button=tk.Button(subframe,text='Quit',\
                command=self.quit)
        quit_button.pack(side=tk.RIGHT,padx=8)

        #-------------------Stop button-------------------
        '''
        self.stop_button=tk.Button(subframe,text='Stop',\
                command=self.stop)
        self.stop_button.pack(side=tk.RIGHT,padx=8)
        '''
                
        #-------------------Start button-------------------
        self.start_button=tk.Button(subframe,text='Start',\
                command=self.start,state=tk.DISABLED)
        self.start_button.pack(side=tk.RIGHT,pady=8)

        #-------------------Help button-------------------

        self.help_button=tk.Button(subframe,text='Help',\
                command=self.showHelp)
        self.help_button.pack(side=tk.RIGHT,padx=8)



    def setfolder(self,x):
        self.foldersmenu.selection_clear()
        self.menfolder=self.foldersmenu.get()
        self.foldersmenu.set(self.menfolder)
        if self.menfolder=='All':
            print('Work on all folders.')
        else:
            print('Select Mendeley folder: '+str(self.menfolder))



    def doExport(self):
        if self.isexport.get()==1:
            print('Export annotated PDFs.')
        else:
            print('Dont export annotated PDFs.')

        self.checkReady()



    def doHighlight(self):
        if self.ishighlight.get()==1:
            print('Extract highlighted texts.')
            self.check_separate.configure(state=tk.NORMAL)
        else:
            print('Dont extract highlighted texts.')
            if self.isnote.get()==0:
                self.check_separate.configure(state=tk.DISABLED)
        self.checkReady()

    def doNote(self):
        if self.isnote.get()==1:
            print('Extract notes.')
            self.check_separate.configure(state=tk.NORMAL)
        else:
            print('Dont extract notes.')
            self.check_separate.state=tk.DISABLED
            if self.ishighlight.get()==0:
                self.check_separate.configure(state=tk.DISABLED)
        self.checkReady()


    def doSeparate(self):
        if self.isseparate.get()==1:
            print('Save annotations separately.')
        else:
            print('Save all annotations to single file.')



    def showHelp(self):
        helpstr='''
Menotexport v1.0\n\n
- Export PDFs: Bulk export PDFs with annotations to <output folder>.\n
- Extract highlights: Extract highlighted texts and output to a txt file in <output folder>.\n
- Extract highlights: Extract notes and output to a txt file in <output folder>.\n
- Save separately: If on, save each PDF's annotations to a separate txt.\n
- See README.md for more info.\n
'''

        tkMessageBox.showinfo(title='Help', message=helpstr)
        print(self.menfolder.get())




    def start(self):
        dbfile=self.db_entry.get()
        outdir=self.out_entry.get()
        action=[]
        if self.isexport.get()==1:
            action.append('e')
        if self.ishighlight.get()==1:
            action.append('m')
        if self.isnote.get()==1:
            action.append('n')
        if self.isseparate.get()==1:
            separate=True
        else:
            separate=False
            
        if 'e' in action or 'm' in action or 'n' in action:
            self.db_button.configure(state=tk.DISABLED)
            self.out_button.configure(state=tk.DISABLED)
            self.start_button.configure(state=tk.DISABLED)
            self.help_button.configure(state=tk.DISABLED)
            self.foldersmenu.configure(state=tk.DISABLED)
            self.check_export.configure(state=tk.DISABLED)
            self.check_highlight.configure(state=tk.DISABLED)
            self.check_note.configure(state=tk.DISABLED)
            self.check_separate.configure(state=tk.DISABLED)
	    self.messagelabel.configure(text='Message (working...)')

            folder=None if self.menfolder=='All' else [self.menfolder,]

            args=[dbfile,outdir,action,folder,True,True,separate,True]

            self.workthread=WorkThread('work',False,self.stateq)
            self.workthread.deamon=True

            self.workthread.args=args
            self.workthread.start()
            self.reset()
            '''
            self.workproc.apply_async(menotexport.main,args,\
                    callback=self.reset)
            self.workproc.join()
            '''



    def reset(self):
        while self.stateq.qsize() and self.exit==False:
            try:
                msg=self.stateq.get()
                if msg=='done':
                    self.db_button.configure(state=tk.NORMAL)
                    self.out_button.configure(state=tk.NORMAL)
                    self.start_button.configure(state=tk.NORMAL)
                    self.help_button.configure(state=tk.NORMAL)
                    self.foldersmenu.configure(state='readonly')
                    self.check_export.configure(state=tk.NORMAL)
                    self.check_highlight.configure(state=tk.NORMAL)
                    self.check_note.configure(state=tk.NORMAL)
                    self.check_separate.configure(state=tk.NORMAL)
                    self.messagelabel.configure(text='Message')
                    return
            except Queue.Empty:
                pass
        self.after(100,self.reset)


    
    def stop(self):
        #self.workthread.stop()
        pass
        

    def addMessageFrame(self):
        frame=Frame(self)
        frame.pack(fill=tk.BOTH,side=tk.TOP,\
                expand=1,padx=8,pady=5)

        self.messagelabel=tk.Label(frame,text='Message',bg='#bbb')
        self.messagelabel.pack(side=tk.TOP,fill=tk.X)

        self.text=tk.Text(frame)
        self.text.pack(side=tk.TOP,fill=tk.BOTH,expand=1)
        self.text.height=10

        scrollbar=tk.Scrollbar(self.text)
        scrollbar.pack(side=tk.RIGHT,fill=tk.Y)

        self.text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.text.yview)
Exemple #31
0
class View(Frame):    
    def __init__(self, parent,controller):
        Frame.__init__(self, parent)   
        self.parent = parent
        self.parent.title("Autocompleter")
        
        self.pack(fill = 'both', expand = 1)
        
        self.initializeComponents()
        CenterWindow(self.parent)
        
        self.controller = controller

    def initializeComponents(self):
        self.boxValue = StringVar()
        self.boxValue.trace('w', \
            lambda name, index, mode, \
            boxValue = self.boxValue : \
            self.box_valueEditted(boxValue))
            
        self.box = Combobox(self,\
            justify = 'left',\
            width = 50, \
            textvariable = self.boxValue,\
        )
        self.box.pack(side = 'left',expand = 1, padx = 5, pady = 5)
        self.box.bind('<<ComboboxSelected>>',self.box_selected)
        self.box.bind('<Return>',self.box_returned)
        
        self.importButton = Button(self, \
            text = "Import", \
            command = self.importButton_clicked,\
        )
        self.importButton.pack(side = 'left',expand = 1)
        
        self.cmd_str = StringVar(None,"Prefix Only")
        self.switchButton = Button(self, \
            textvariable = self.cmd_str, \
            command = self.switchButton_clicked, \
        )
        self.switchButton.pack(side = 'right', padx = 5, pady = 5)
       
    #******************Callbacks******************
    def box_valueEditted(self,sv):
        '''
        Edit text of combo box will trigger autocomplete
        This implementation is moved to "box_returned"
        '''
        pass

    def box_selected(self,event):
        '''
        Selecting 1 value of dropdown list finds all strings 
        with this prefix. Testing only.
        '''
        # tag = event.widget.get()
        # print self.controller.Contains(tag)
        pass

    def box_returned(self,event):
        '''
        Press 'return' will show combo box's dropdown list
        '''
        tag = self.boxValue.get()
        container = self.controller.List(tag)
        self.box['value'] = [] # clear
        self.box['value'] = container
        self.box.event_generate('<Down>')
            
    def importButton_clicked(self):
        '''       
        Press 'import' button will import test file and initialize Trie
        '''
        self.box['value'] = self.controller.LoadFile()   
        self.controller.Construct()
        
    def switchButton_clicked(self):
        '''
        Press will switch between 
        'Prefix Only' and 'Prefix and Infix' mode
        '''
        self.controller.SwitchCommand()
        cmd_str = self.cmd_str.get()
        if cmd_str == 'Prefix Only':
            self.cmd_str.set('Prefix and Infix')
        else:
            self.cmd_str.set('Prefix Only')
Exemple #32
0
class App:
    def __init__(self, master,cam):
        self.cam = cam
        self.master = master
        self.frame = None
        self.canvas = None
        self.histCanvas = None
        self.video = None
        self.position = None



##window frame
        self.frame = tk.LabelFrame(self.master,text='Captured video')
        self.frame.pack()

##toolbar
        self.toolbar = tk.Frame(self.master)
        self.toolbar.configure(background='grey',borderwidth=2)
        self.toolbar.pack(side=tk.BOTTOM,padx=5,pady=5)                       #),expand=tk.YES,fill=tk.BOTH)



##adding buttons to toolbar
        self.button = tk.Button(self.toolbar, text="QUIT", fg="red", command=master.destroy)
        self.button.configure(background='tan')
        self.button.pack(side=tk.LEFT,padx=5, pady=5)
## ttk Combobox
        self.efLabel = Labelframe(self.toolbar, text="Choose an effect:")
        self.efLabel.pack(anchor = tk.W, padx=5, pady=2)
        self.efCombo = Combobox(self.efLabel, values = ['none','erode','smooth','dilate','laplace','threshold_otsu'], state='readonly')
        self.efCombo.current(0)
        self.efCombo.bind('<FocusIn>', self._update_values)
        self.efCombo.pack(anchor=tk.NW,padx=5, pady=5)

##fps

## for using of command binding see: 'Thinkink in Tkinter' tt077.py
        self.camon = tk.Button(self.toolbar, text="CAM on", fg="darkgreen", command=lambda: self.video.setOnoff(True))
        self.camon.configure(background='tan')
        self.camon.pack(side=tk.LEFT,padx=5, pady=5)

        self.camoff = tk.Button(self.toolbar, text="CAM off", fg="blue", command=lambda: self.video.setOnoff(False))
        self.camoff.configure(background='tan')
        self.camoff.pack(side=tk.LEFT,padx=5, pady=5)

        self.detector = tk.Button(self.toolbar, text="detect face", fg="blue", command=lambda: self.video.setDetection())
        self.detector.configure(background='tan')
        self.detector.pack(side=tk.LEFT,padx=5, pady=5)

        self.effect = tk.Button(self.toolbar, text="effect", fg="yellow", command=lambda: self.video.setEffect(self.efCombo.get()))
        self.effect.configure(background='tan')
        self.effect.pack(side=tk.LEFT,padx=5, pady=5)

        self.hi_there = tk.Button(self.toolbar, text="Hello")                   #, command=self.say_hi)
        self.hi_there.bind("<Control-Button-1>", self.say_hi)                   #event binding
        self.hi_there.configure(background='tan')
        self.hi_there.pack(side=tk.LEFT,padx=5, pady=5)
##canvas to draw on
        self.canvas = tk.Canvas(self.frame, width=620,height=460)
        self.canvas.configure(background="black",relief='ridge',highlightthickness=5,borderwidth=5)
        self.canvas.pack(side=tk.RIGHT,padx=5,pady=5)                             #(expand=tk.YES,fill=tk.BOTH)
##canvas to draw histogram
        self.histLabel = Labelframe(self.frame, text="Histogram")
        self.histLabel.pack(anchor = tk.W, padx=5, pady=2)
        self.histCanvas = tk.Canvas(self.histLabel, width=300,height=240)
        self.histCanvas.configure(background="black",relief='ridge',highlightthickness=5,borderwidth=5)
        self.histCanvas.pack(side=tk.TOP,padx=5,pady=5)
##sliders
        var=tk.DoubleVar()
        self.contrast = tk.Scale(self.frame, orient=tk.HORIZONTAL,
        label='Contrast',variable=var,resolution=0.5,from_=0.0, to=100.0, command=self._update_contrast)
        self.contrast.pack(side=tk.LEFT, anchor=tk.NW, padx=5, pady=5)
        self.brightness = tk.Scale(self.frame, orient=tk.HORIZONTAL,
        label='Brightness',from_=0, to=100, command=self._update_brightness)
        #self.brightness.bind('<FocusIn>', self._update_brightness)
        self.brightness.pack(side=tk.LEFT, anchor=tk.NW, padx=5, pady=5)
##position label
        self.position = tk.StringVar()
        self.xyLabel = tk.Label(self.toolbar, textvariable = self.position, fg='red',width=30,justify='left').pack(padx=1, pady=5)

##set the camera
        self.video = Camera(self.cam,self.master,self.canvas,self.histCanvas,self.frame,self.position)
        self.video.setOnoff(False)
##==============================================================================
##pooling video from camera
    def pool(self):
        if self.video != None:
            self.id=self.master.after(33,lambda: self.video.update_video())

##            self.master.after(50, lambda: self.pool())

##==============================================================================
##for test purposes only
    def say_hi(self, event):
        print "hi there, everyone!"
##==============================================================================
##combo event
    def _update_values(self, evt):
        # add entered text to combobox list of values
        widget = evt.widget           # get widget
        txt = widget.get()            # get current text
        #vals = widget.cget('values')  # get values

        print txt
        #print vals
##for editable widgets: update list of items with entered value
##        if not vals:
##            widget.configure(values = (txt, ))
##        elif txt not in vals:
##            widget.configure(values = vals + (txt, ))

        return 'break'  # don't propagate event
##==============================================================================
    def _update_brightness(self, val):
        self.video.setBrightness(float(val))
##==============================================================================
    def _update_contrast(self, val):
        self.video.setContrast(float(val))



def switch_sub_ddl(event):
    """ set the sub dropdownlist values according to the selected value in the main dropdownlist """
    if event.widget.get() == 'Open':
        ddl_sub["values"] = li_sub_open
    elif event.widget.get() == 'Limited':
        ddl_sub["values"] = li_sub_cloz

# main program
root = Tk()

li_main = ['Open', 'Limited']   # main list
li_sub_open = ["Open Database Licence", "Licence Ouverte / Open Licence"]   # 1st sublist
li_sub_cloz = ["Security", "Legal", ""] # 2nd sublist

# main dropdownlist
ddl_main = Combobox(root, values = li_main)
ddl_main.pack()
ddl_main.bind("<<ComboboxSelected>>", switch_sub_ddl)

# a separator to see better ^^
Separator(orient=HORIZONTAL).pack()

# sub dropdownlist
ddl_sub = Combobox(root, values = li_sub_open)
ddl_sub.pack()

root.mainloop()
class App:
    def __init__(self, master, cam):
        self.cam = cam
        self.master = master
        self.frame = None
        self.canvas = None
        self.histCanvas = None
        self.video = None
        self.position = None

        ##window frame
        self.frame = tk.LabelFrame(self.master, text='Captured video')
        self.frame.pack()

        ##toolbar
        self.toolbar = tk.Frame(self.master)
        self.toolbar.configure(background='grey', borderwidth=2)
        self.toolbar.pack(side=tk.BOTTOM, padx=5, pady=5)  # ),expand=tk.YES,fill=tk.BOTH)

        ##adding buttons to toolbar
        self.button = tk.Button(self.toolbar, text="QUIT", fg="red", command=master.destroy)
        self.button.configure(background='tan')
        self.button.pack(side=tk.LEFT, padx=5, pady=5)
        ## ttk Combobox
        self.efLabel = Labelframe(self.toolbar, text="Choose an effect:")
        self.efLabel.pack(anchor=tk.W, padx=5, pady=2)
        self.efCombo = Combobox(self.efLabel, values=['none', 'erode', 'smooth', 'dilate', 'laplace', 'threshold_otsu'],
                                state='readonly')
        self.efCombo.current(0)
        self.efCombo.bind('<FocusIn>', self._update_values)
        self.efCombo.pack(anchor=tk.NW, padx=5, pady=5)

        ##fps

        ## for using of command binding see: 'Thinkink in Tkinter' tt077.py
        self.camon = tk.Button(self.toolbar, text="CAM on", fg="darkgreen", command=lambda: self.video.setOnoff(True))
        self.camon.configure(background='tan')
        self.camon.pack(side=tk.LEFT, padx=5, pady=5)

        self.camoff = tk.Button(self.toolbar, text="CAM off", fg="blue", command=lambda: self.video.setOnoff(False))
        self.camoff.configure(background='tan')
        self.camoff.pack(side=tk.LEFT, padx=5, pady=5)

        self.detector = tk.Button(self.toolbar, text="detect face", fg="blue",
                                  command=lambda: self.video.setDetection())
        self.detector.configure(background='tan')
        self.detector.pack(side=tk.LEFT, padx=5, pady=5)

        self.effect = tk.Button(self.toolbar, text="effect", fg="yellow",
                                command=lambda: self.video.setEffect(self.efCombo.get()))
        self.effect.configure(background='tan')
        self.effect.pack(side=tk.LEFT, padx=5, pady=5)

        self.hi_there = tk.Button(self.toolbar, text="Hello")  # , command=self.say_hi)
        self.hi_there.bind("<Control-Button-1>", self.say_hi)  # event binding
        self.hi_there.configure(background='tan')
        self.hi_there.pack(side=tk.LEFT, padx=5, pady=5)
        ##canvas to draw on
        self.canvas = tk.Canvas(self.frame, width=620, height=460)
        self.canvas.configure(background="black", relief='ridge', highlightthickness=5, borderwidth=5)
        self.canvas.pack(side=tk.RIGHT, padx=5, pady=5)  # (expand=tk.YES,fill=tk.BOTH)
        ##canvas to draw histogram
        self.histLabel = Labelframe(self.frame, text="Histogram")
        self.histLabel.pack(anchor=tk.W, padx=5, pady=2)
        self.histCanvas = tk.Canvas(self.histLabel, width=300, height=240)
        self.histCanvas.configure(background="black", relief='ridge', highlightthickness=5, borderwidth=5)
        self.histCanvas.pack(side=tk.TOP, padx=5, pady=5)
        ##sliders
        var = tk.DoubleVar()
        self.contrast = tk.Scale(self.frame, orient=tk.HORIZONTAL,
                                 label='Contrast', variable=var, resolution=0.5, from_=0.0, to=100.0,
                                 command=self._update_contrast)
        self.contrast.pack(side=tk.LEFT, anchor=tk.NW, padx=5, pady=5)
        self.brightness = tk.Scale(self.frame, orient=tk.HORIZONTAL,
                                   label='Brightness', from_=0, to=100, command=self._update_brightness)
        # self.brightness.bind('<FocusIn>', self._update_brightness)
        self.brightness.pack(side=tk.LEFT, anchor=tk.NW, padx=5, pady=5)
        ##position label
        self.position = tk.StringVar()
        self.xyLabel = tk.Label(self.toolbar, textvariable=self.position, fg='red', width=30, justify='left').pack(
            padx=1, pady=5)

        ##set the camera
        self.video = Camera(self.cam, self.master, self.canvas, self.histCanvas, self.frame, self.position)
        self.video.setOnoff(False)

    ##==============================================================================
    ##pooling video from camera
    def pool(self):
        if self.video != None:
            self.id = self.master.after(33, lambda: self.video.update_video())

            ##            self.master.after(50, lambda: self.pool())

            ##==============================================================================
            ##for test purposes only

    def say_hi(self, event):
        print "hi there, everyone!"

    ##==============================================================================
    ##combo event
    def _update_values(self, evt):
        # add entered text to combobox list of values
        widget = evt.widget  # get widget
        txt = widget.get()  # get current text
        # vals = widget.cget('values')  # get values

        print txt
        # print vals
        ##for editable widgets: update list of items with entered value
        ##        if not vals:
        ##            widget.configure(values = (txt, ))
        ##        elif txt not in vals:
        ##            widget.configure(values = vals + (txt, ))

        return 'break'  # don't propagate event

    ##==============================================================================
    def _update_brightness(self, val):
        self.video.setBrightness(float(val))

    ##==============================================================================
    def _update_contrast(self, val):
        self.video.setContrast(float(val))
Exemple #35
0
class MainFrame(Frame):
    def __init__(self,parent,stdoutq):
        Frame.__init__(self,parent)

        self.parent=parent
        self.width=850
        self.height=650
        self.title=menotexport.__version__
        self.stdoutq=stdoutq

        self.initUI()

        self.hasdb=False
        self.hasout=False
        self.hasaction=False
        self.exit=False

        self.path_frame=self.addPathFrame()
        self.action_frame=self.addActionFrame()
        self.message_frame=self.addMessageFrame()
        self.printStr()

        self.stateq=Queue.Queue()
        #self.workproc=Pool(1)




    def centerWindow(self):
        sw=self.parent.winfo_screenwidth()
        sh=self.parent.winfo_screenheight()
        x=(sw-self.width)/2
        y=(sh-self.height)/2
        self.parent.geometry('%dx%d+%d+%d' \
                %(self.width,self.height,x,y))


    def initUI(self):
        self.parent.title(self.title)
        self.style=Style()
        #Choose from default, clam, alt, classic
        self.style.theme_use('alt')
        self.pack(fill=tk.BOTH,expand=True)
        self.centerWindow()


    def printStr(self):
        while self.stdoutq.qsize() and self.exit==False:
            try:
                msg=self.stdoutq.get()
                self.text.update()
                self.text.insert(tk.END,msg)
                self.text.see(tk.END)
            except Queue.Empty:
                pass
        self.after(100,self.printStr)


    def checkReady(self):
        if self.isexport.get()==1 or self.ishighlight.get()==1\
                or self.isnote.get()==1 or self.isbib.get()==1:
            self.hasaction=True
        else:
            self.hasaction=False

        if self.hasdb and self.hasout and self.hasaction:
            self.start_button.configure(state=tk.NORMAL)
            print('# <Menotexport>: Menotexport Ready.')
        else:
            self.start_button.configure(state=tk.DISABLED)


    def addPathFrame(self):
        frame=Frame(self)
        frame.pack(fill=tk.X,expand=0,side=tk.TOP,padx=8,pady=5)

        frame.columnconfigure(1,weight=1)

        #------------------Database file------------------
        label=tk.Label(frame,text='Mendeley Data file:',\
                bg='#bbb')
        label.grid(row=0,column=0,\
                sticky=tk.W,padx=8)

        self.db_entry=tk.Entry(frame)
        self.db_entry.grid(row=0,column=1,sticky=tk.W+tk.E,padx=8)

        self.db_button=tk.Button(frame,text='Open',command=self.openFile)
        self.db_button.grid(row=0,column=2,padx=8,sticky=tk.E)

        hint='''
Default location on Linux:
~/.local/share/data/Mendeley\ Ltd./Mendeley\ Desktop/[email protected]
Default location on Windows:
C:\Users\Your_name\AppData\Local\Mendeley Ltd\Mendeley Desktop\[email protected]'''

        hint_label=tk.Label(frame,text=hint,\
                justify=tk.LEFT,anchor=tk.NW)
        hint_label.grid(row=1,column=0,columnspan=3,\
                sticky=tk.W,padx=8)

        #--------------------Output dir--------------------
        label2=tk.Label(frame,text='Output folder:',\
                bg='#bbb')
        label2.grid(row=2,column=0,\
                sticky=tk.W,padx=8)

        self.out_entry=tk.Entry(frame)
        self.out_entry.grid(row=2,column=1,sticky=tk.W+tk.E,padx=8)
        self.out_button=tk.Button(frame,text='Choose',command=self.openDir)
        self.out_button.grid(row=2,column=2,padx=8,sticky=tk.E)
        


    def openDir(self):
        self.out_entry.delete(0,tk.END)
        dirname=askdirectory()
        self.out_entry.insert(tk.END,dirname)
        if len(dirname)>0:
            print('# <Menotexport>: Output folder: %s' %dirname)
            self.hasout=True
            self.checkReady()


    def openFile(self):
        self.db_entry.delete(0,tk.END)
        ftypes=[('sqlite files','*.sqlite'),('ALL files','*')]
        initialdir='~/.local/share/data/Mendeley Ltd./Mendeley Desktop'
        initialdir=os.path.expanduser(initialdir)
        if os.path.isdir(initialdir):
            filename=askopenfilename(filetypes=ftypes,initialdir=initialdir)
        else:
            filename=askopenfilename(filetypes=ftypes)
        self.db_entry.insert(tk.END,filename)
        if len(filename)>0:
            print('# <Menotexport>: Database file: %s' %filename)
            self.probeFolders()


    def probeFolders(self):
        dbfile=self.db_entry.get()
        try:
            db=sqlite3.connect(dbfile)
            self.menfolderlist=menotexport.getFolderList(db,None)   #(id, name)
            self.foldernames=['All']+[ii[1] for ii in self.menfolderlist] #names to display
            self.foldersmenu['values']=tuple(self.foldernames)
            self.foldersmenu.current(0)
            db.close()

            self.hasdb=True
            self.checkReady()

        except Exception as e:
            print('# <Menotexport>: Failed to recoganize the given database file.') 
            print(e)





    
    def addActionFrame(self):

        frame=Frame(self,relief=tk.RAISED,borderwidth=1)
        frame.pack(fill=tk.X,side=tk.TOP,\
                expand=0,padx=8,pady=5)

        label=tk.Label(frame,text='Actions:',bg='#bbb')
        label.grid(row=0,column=0,sticky=tk.W,padx=8)

        #---------------Action checkbuttons---------------
        self.isexport=tk.IntVar()
        self.ishighlight=tk.IntVar()
        self.isnote=tk.IntVar()
        self.isbib=tk.IntVar()
        self.isris=tk.IntVar()
        self.isseparate=tk.IntVar()
        self.iszotero=tk.IntVar()
        self.iscustomtemp=tk.IntVar()

        self.check_export=tk.Checkbutton(frame,text='Export PDFs',\
                variable=self.isexport,command=self.doExport)

        self.check_highlight=tk.Checkbutton(frame,\
                text='Extract highlights',\
                variable=self.ishighlight,command=self.doHighlight)

        self.check_note=tk.Checkbutton(frame,\
                text='Extract notes',\
                variable=self.isnote,command=self.doNote)

        self.check_bib=tk.Checkbutton(frame,\
                text='Export .bib',\
                variable=self.isbib,command=self.doBib)

        self.check_ris=tk.Checkbutton(frame,\
                text='Export .ris',\
                variable=self.isris,command=self.doRis)

        self.check_separate=tk.Checkbutton(frame,\
                text='Save separately',\
                variable=self.isseparate,command=self.doSeparate,\
                state=tk.DISABLED)

        self.check_iszotero=tk.Checkbutton(frame,\
                text='For import to Zotero',\
                variable=self.iszotero,command=self.doIszotero,\
                state=tk.DISABLED)

        self.check_custom_template=tk.Checkbutton(frame,\
                text='Use custom template (experimental)',\
                variable=self.iscustomtemp,command=self.doCustomTemp,\
                state=tk.DISABLED)

        frame.columnconfigure(0,weight=1)

        self.check_export.grid(row=1,column=1,padx=8,sticky=tk.W)
        self.check_highlight.grid(row=1,column=2,padx=8,sticky=tk.W)
        self.check_note.grid(row=1,column=3,padx=8,sticky=tk.W)
        self.check_bib.grid(row=2,column=1,padx=8,sticky=tk.W)
        self.check_ris.grid(row=2,column=2,padx=8,sticky=tk.W)
        self.check_separate.grid(row=2,column=3,padx=8,sticky=tk.W)
        self.check_iszotero.grid(row=3,column=1,padx=8,sticky=tk.W)
        self.check_custom_template.grid(row=3,column=2,padx=8,sticky=tk.W)

        #---------------------2nd row---------------------
        subframe=Frame(frame)
        subframe.grid(row=4,column=0,columnspan=6,sticky=tk.W+tk.E,\
                pady=5)

        #-------------------Folder options-------------------
        folderlabel=tk.Label(subframe,text='Mendeley folder:',\
                bg='#bbb')
        folderlabel.pack(side=tk.LEFT, padx=8)

        self.menfolder=tk.StringVar()
        self.menfolderlist=['All',]
        self.foldersmenu=Combobox(subframe,textvariable=\
                self.menfolder,values=self.menfolderlist,state='readonly')
        self.foldersmenu.current(0)
        self.foldersmenu.bind('<<ComboboxSelected>>',self.setfolder)
        self.foldersmenu.pack(side=tk.LEFT,padx=8)
        
        #-------------------Quit button-------------------
        quit_button=tk.Button(subframe,text='Quit',\
                command=self.quit)
        quit_button.pack(side=tk.RIGHT,padx=8)

        #-------------------Stop button-------------------
        '''
        self.stop_button=tk.Button(subframe,text='Stop',\
                command=self.stop)
        self.stop_button.pack(side=tk.RIGHT,padx=8)
        '''
                
        #-------------------Start button-------------------
        self.start_button=tk.Button(subframe,text='Start',\
                command=self.start,state=tk.DISABLED)
        self.start_button.pack(side=tk.RIGHT,pady=8)

        #-------------------Help button-------------------
        self.help_button=tk.Button(subframe,text='Help',\
                command=self.showHelp)
        self.help_button.pack(side=tk.RIGHT,padx=8)



    def setfolder(self,x):
        self.foldersmenu.selection_clear()
        self.menfolder=self.foldersmenu.get()
        self.foldersmenu.set(self.menfolder)
        if self.menfolder=='All':
            print('# <Menotexport>: Work on all folders.')
        else:
            print('# <Menotexport>: Select Mendeley folder: '+str(self.menfolder))



    def doExport(self):
        if self.isexport.get()==1:
            print('# <Menotexport>: Export annotated PDFs.')
        else:
            print('# <Menotexport>: Dont export annotated PDFs.')

        self.checkReady()



    def doHighlight(self):
        if self.ishighlight.get()==1:
            print('# <Menotexport>: Extract highlighted texts.')
            self.check_separate.configure(state=tk.NORMAL)
            self.check_custom_template.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont extract highlighted texts.')
            if self.isnote.get()==0:
                self.check_separate.configure(state=tk.DISABLED)
                self.check_custom_template.configure(state=tk.DISABLED)
        self.checkReady()

    def doNote(self):
        if self.isnote.get()==1:
            print('# <Menotexport>: Extract notes.')
            self.check_separate.configure(state=tk.NORMAL)
            self.check_custom_template.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont extract notes.')
            self.check_separate.state=tk.DISABLED
            if self.ishighlight.get()==0:
                self.check_separate.configure(state=tk.DISABLED)
                self.check_custom_template.configure(state=tk.DISABLED)
        self.checkReady()
        self.checkReady()

    def doBib(self):
        if self.isbib.get()==1:
            print('# <Menotexport>: Export to .bib file.')
            self.check_iszotero.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont export .bib file.')
            if self.isris.get()==0:
                self.check_iszotero.configure(state=tk.DISABLED)
        self.checkReady()

    def doRis(self):
        if self.isris.get()==1:
            print('# <Menotexport>: Export to .ris file.')
            self.check_iszotero.configure(state=tk.NORMAL)
        else:
            print('# <Menotexport>: Dont export .ris file.')
            if self.isbib.get()==0:
                self.check_iszotero.configure(state=tk.DISABLED)
        self.checkReady()

    def doSeparate(self):
        if self.isseparate.get()==1:
            print('# <Menotexport>: Save annotations separately.')
        else:
            print('# <Menotexport>: Save all annotations to single file.')

    def doIszotero(self):
        if self.iszotero.get()==1:
            print('# <Menotexport>: Save .bib/.ris file in Zotero preferred format.')
        else:
            print('# <Menotexport>: Save .bib/.ris file to default format.')

    def doCustomTemp(self):
        if self.iscustomtemp.get()==1:
            print('# <Menotexport>: Use custom template for exported annotations.')
        else:
            print('# <Menotexport>: Use default template for exported annotations.')



    def showHelp(self):
        helpstr='''
%s\n\n
- Export PDFs: Bulk export PDFs.\n
- Extract highlights: Extract highlighted texts and output to txt files.\n
- Extract notes: Extract notes and output to txt files.\n
- Export .bib: Export meta-data and annotations to .bib files.\n
- Export .ris: Export meta-data and annotations to .ris files.\n
- For import to Zotero: Exported .bib and/or .ris files have suitable format to import to Zotero.\n
- Save separately: If on, save each PDF's annotations to a separate txt.\n
- Use custom annotation template: Use a custom template to format the exported annotations.
  See annotation_template.py for details.
- See README.md for more info.\n
''' %self.title

        tkMessageBox.showinfo(title='Help', message=helpstr)
        #print(self.menfolder.get())




    def start(self):
        dbfile=self.db_entry.get()
        outdir=self.out_entry.get()
        self.menfolder=self.foldersmenu.get()

        # get (folderid, folder) for folder
        for ii in self.menfolderlist:
            if ii[1]==self.menfolder:
                folder_sel=[ii[0],ii[1].split('/')[-1]]

        action=[]
        if self.isexport.get()==1:
            action.append('p')
        if self.ishighlight.get()==1:
            action.append('m')
        if self.isnote.get()==1:
            action.append('n')
        if self.isbib.get()==1:
            action.append('b')
        if self.isris.get()==1:
            action.append('r')
        if self.isseparate.get()==1:
            separate=True
        else:
            separate=False
        if self.iszotero.get()==1:
            iszotero=True
        else:
            iszotero=False
        if self.iscustomtemp.get()==1:
            action.append('t')

            
        if 'p' in action or 'm' in action or 'n' in action or 'b' in action or 'r' in action:
            self.db_button.configure(state=tk.DISABLED)
            self.out_button.configure(state=tk.DISABLED)
            self.start_button.configure(state=tk.DISABLED)
            self.help_button.configure(state=tk.DISABLED)
            self.foldersmenu.configure(state=tk.DISABLED)
            self.check_export.configure(state=tk.DISABLED)
            self.check_highlight.configure(state=tk.DISABLED)
            self.check_note.configure(state=tk.DISABLED)
            self.check_bib.configure(state=tk.DISABLED)
            self.check_ris.configure(state=tk.DISABLED)
            self.check_separate.configure(state=tk.DISABLED)
            self.check_iszotero.configure(state=tk.DISABLED)
            self.check_custom_template.configure(state=tk.DISABLED)
            self.messagelabel.configure(text='Message (working...)')

            folder=None if self.menfolder=='All' else folder_sel

            args=[dbfile,outdir,action,folder,separate,iszotero,True]

            self.workthread=WorkThread('work',False,self.stateq)
            self.workthread.deamon=True

            self.workthread.args=args
            self.workthread.start()
            self.reset()
            '''
            self.workproc.apply_async(menotexport.main,args,\
                    callback=self.reset)
            self.workproc.join()
            '''



    def reset(self):
        while self.stateq.qsize() and self.exit==False:
            try:
                msg=self.stateq.get()
                if msg=='done':
                    self.db_button.configure(state=tk.NORMAL)
                    self.out_button.configure(state=tk.NORMAL)
                    self.start_button.configure(state=tk.NORMAL)
                    self.help_button.configure(state=tk.NORMAL)
                    self.foldersmenu.configure(state='readonly')
                    self.check_export.configure(state=tk.NORMAL)
                    self.check_highlight.configure(state=tk.NORMAL)
                    self.check_note.configure(state=tk.NORMAL)
                    self.check_bib.configure(state=tk.NORMAL)
                    self.check_separate.configure(state=tk.NORMAL)
                    self.check_iszotero.configure(state=tk.NORMAL)
                    self.check_custom_template.configure(state=tk.NORMAL)
                    self.messagelabel.configure(text='Message')
                    return
            except Queue.Empty:
                pass
        self.after(100,self.reset)


    
    def stop(self):
        #self.workthread.stop()
        pass
        

    def addMessageFrame(self):
        frame=Frame(self)
        frame.pack(fill=tk.BOTH,side=tk.TOP,\
                expand=1,padx=8,pady=5)

        self.messagelabel=tk.Label(frame,text='Message',bg='#bbb')
        self.messagelabel.pack(side=tk.TOP,fill=tk.X)

        self.text=tk.Text(frame)
        self.text.pack(side=tk.TOP,fill=tk.BOTH,expand=1)
        self.text.height=10

        scrollbar=tk.Scrollbar(self.text)
        scrollbar.pack(side=tk.RIGHT,fill=tk.Y)

        self.text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.text.yview)
Exemple #36
0
class CMDHost(object):
    def __init__(self):
        # Styles
        self.style = MainWindowStyles()
        self.mw = Tk()
        self.setup()

    def setup(self):
        self.mw.title("Python Z-5212 Command Host " + c.port + ", " + c.baud)
        resize_and_center(self.mw, 800, 600)

        # Variables
        self.cmd_message = StringVar(self.mw, "--empty--")
        self.conn_status = StringVar(self.mw, '...')

        # Top Frame (name entry box, buttons, conn status)
        self.login_frame = Frame(self.mw, **self.style.Frame)
        self.lower_frame = Frame(self.mw, **self.style.Frame)
        self.login_frame.pack(side="top", fill="x")
        self.lower_frame.pack(side="top", fill="both", expand=1)

        # The lower left (message entry, chat history) and lower right
        self.left_frame = Frame(self.lower_frame, **self.style.Frame)
        self.right_frame = Frame(self.lower_frame, **self.style.Frame)
        self.right_frame.pack(side="right", fill="y")
        self.left_frame.pack(side="right", fill="both", expand=1)

        # The cmd entry & history frames
        self.message_frame = Frame(self.login_frame, **self.style.Frame)
        self.dialogue_frame = Frame(self.left_frame, **self.style.Frame)
        self.message_frame.pack(side="top", fill="x")
        self.dialogue_frame.pack(side="top", fill="both", expand=1)

        ###
        # Top Frame Widgets
        ###
        self.enter_Connecte_button = Button(self.login_frame,
                                            text="Connect",
                                            command=self.conn,
                                            **self.style.Button)
        self.enter_Connecte_button.pack(side="left", padx=5, pady=5)

        self.status_label = Label(self.login_frame,
                                  textvariable=self.conn_status,
                                  **self.style.Label).pack(side="left",
                                                           padx=5,
                                                           pady=5)

        self.enter_Connecte_button = Button(self.login_frame,
                                            text="Send CMD",
                                            command=self.send,
                                            **self.style.Button).pack(
                                                side="right", padx=5, pady=5)

        self.ports_Combobox = Combobox(self.login_frame,
                                       values=c.port,
                                       width=8)
        # assign function to combobox
        self.ports_Combobox.bind('<<ComboboxSelected>>', self.port_on_select)
        self.ports_Combobox.current(portindex)
        self.ports_Combobox.pack(side="left", padx=5, pady=5)

        self.baud_rate_Combo = Combobox(self.login_frame,
                                        values=c.baud,
                                        width=8)
        self.baud_rate_Combo.bind('<<ComboboxSelected>>',
                                  self.baud_rate_on_select)
        self.baud_rate_Combo.current(baudindex)
        self.baud_rate_Combo.pack(side="left", padx=5, pady=5)

        ###
        # Message Frame Widgets
        ###

        self.message_entry = Entry(self.message_frame,
                                   textvariable=self.cmd_message,
                                   state="disabled",
                                   **self.style.Entry)
        self.message_entry.pack(
            side="top",
            fill="x",
            padx=10,
            pady=10,
            expand=1,
        )

        ###
        # commandlist Frame Widgets
        ###

        self.commandlist_label = Label(self.right_frame,
                                       text="SSI Command List",
                                       anchor="w",
                                       **self.style.Label)
        self.commandlist_label.pack(side="top", fill="x")

        self.commandlist = Scrolled(
            self.right_frame,
            Listbox,
            attributes=self.style.Listbox,
            scrollbar=self.style.Scrollbar,
        )
        self.commandlist.pack(side="top", fill="both", expand=1)

        # Add command
        self.commandlist.widget.insert(END, "0x10 FLUSH_MACRO_PDF")
        self.commandlist.widget.insert(END, "0x11 ABORT_MACRO_PDF")
        self.commandlist.widget.insert(END, "0x12 CUSTOM_DEFAULTS")
        self.commandlist.widget.insert(END, "0x80 SSI_MGMT_COMMAND")
        self.commandlist.widget.insert(END, "0xA3 REQUEST_REVISION")
        self.commandlist.widget.insert(END, "0xA4 REPLY_REVISION")
        self.commandlist.widget.insert(END, "0xB0 Reserved")
        self.commandlist.widget.insert(END, "0xB1 IMAGE_DATA")
        self.commandlist.widget.insert(END, "0xB4 VIDEO_DATA")
        self.commandlist.widget.insert(END, "0xC0 ILLUMINATION_OFF")
        self.commandlist.widget.insert(END, "0xC1 ILLUMINATION_ON")
        self.commandlist.widget.insert(END, "0xC4 AIM_OFF")
        self.commandlist.widget.insert(END, "0xC5 AIM_ON")
        self.commandlist.widget.insert(END, "0xC6 PARAM_SEND")
        self.commandlist.widget.insert(END, "0xC7 PARAM_REQUEST")
        self.commandlist.widget.insert(END, "0xC8 PARAM_DEFAULTS")
        self.commandlist.widget.insert(END, "0xC9 CHANGE_ALL_CODE_TYPES")
        self.commandlist.widget.insert(END, "0xCA PAGER_MOTOR_ACTIVATION")
        self.commandlist.widget.insert(END, "0xD0 CMD_ACK")
        self.commandlist.widget.insert(END, "0xD1 CMD_NAK")
        self.commandlist.widget.insert(END, "0xD2 FLUSH_QUEUE")
        self.commandlist.widget.insert(END, "0xD3 CAPABILITIES_REQUEST")
        self.commandlist.widget.insert(END, "0xD4 CAPABILITIES_REPLY")
        self.commandlist.widget.insert(END, "0xD5 BATCH_REQUEST")
        self.commandlist.widget.insert(END, "0xD6 BATCH_DATA")
        self.commandlist.widget.insert(END, "0xD8 CMD_ACK_ACTION")
        self.commandlist.widget.insert(END, "0xE4 START_SESSION")
        self.commandlist.widget.insert(END, "0xE5 STOP_SESSION")
        self.commandlist.widget.insert(END, "0xE6 BEEP")
        self.commandlist.widget.insert(END, "0xE7 LED_ON")
        self.commandlist.widget.insert(END, "0xE8 LED_OFF")
        self.commandlist.widget.insert(END, "0xE9 SCAN_ENABLE")
        self.commandlist.widget.insert(END, "0xEA SCAN_DISABLE")
        self.commandlist.widget.insert(END, "0xEB SLEEP")
        self.commandlist.widget.insert(END, "0xF3 DECODE_DATA")
        self.commandlist.widget.insert(END, "0xF6 EVENT")
        self.commandlist.widget.insert(END, "0xF7 IMAGER_MODE")
        self.commandlist.widget.insert(END, "N/A WAKEUP")

        ###
        # Dialogue Frame Widgets
        ###

        self.dialogue_text = Scrolled(
            self.dialogue_frame,
            Text,
            attributes=self.style.Dialogue,
            scrollbar=self.style.Scrollbar,
        )
        self.chat_styles(self.dialogue_text.widget)
        self.dialogue_text.pack(side="top",
                                fill="both",
                                padx=10,
                                pady=0,
                                expand=1)

        # Dummy junk
        messages = [
            [["[JK] ", "Host"], ["Welcome to the JK SSI tool."]],
            [["[JK] ", "Host"], ["There are only a few rules:"]],
            [["[JK] ", "Host"], ["   Be respectful and sensitive to me"]],
            [["[JK] ", "Host"], ["   And HAVE FUN!"]],
            [["[JK] ", "Host"], [""]],
            [["[JK] ", "Host"],
             ["Termination of use can happen without warning!"]],
            [["[JK] ", "Host"], [""]],
            [["[JK] ", "Host"], ["JK SSI Tool version v0.01"]],
        ]

        for line in messages:
            self.insert_readonly(self.dialogue_text, 0.0, "\n")
            line.reverse()
            for part in line:
                self.insert_readonly(self.dialogue_text, 0.0, *part)
                #self.insert_readonly(self.dialogue_text, END, "[Admin]", "admin")

    @staticmethod
    def chat_styles(widget):
        """Configure chat text styles."""
        # User colors
        widget.tag_configure("user", foreground="#FFFFFF")
        widget.tag_configure("guest", foreground="#FF9900")
        widget.tag_configure("admin", foreground="#00FFFF")
        widget.tag_configure("server", foreground="#00FF00")
        widget.tag_configure("client", foreground="#FF0000")

    def insert_readonly(self, widget, *args):
        """Insert text into a readonly (disabled) widget."""
        widget.widget.configure(state="normal")
        widget.widget.insert(*args)
        widget.widget.configure(state="disabled")

    def start(self):
        self.mw.mainloop()

    def exit(self):
        self.serConnector.close()

    def conn(self):
        self.serConnector = connect(c)
        serConnector = self.serConnector
        if serConnector.is_open:
            self.conn_status.set('Open')
        else:
            self.conn_status.set('Connect fail')

    def send(self):
        value = self.commandlist.getSelectedIndex()
        print(self.commandlist.get(value))

    def baud_rate_on_select(self, event=None):
        print("event.widget:", event.widget.get())

    def port_on_select(self, event=None):
        print("event.widget:", event.widget.get())
class SerialTerm(Tk):
    def __init__(self, serial_queue, serial_thread):
        Tk.__init__(self)
        self.title("Foss SerialTerminal for Multi")
        self.serial_queue = serial_queue
        self.serial_thread  = serial_thread

        menu_bar = Menu(self)

        file_menu = Menu(menu_bar, tearoff=0)
        file_menu.add_command(label="Save as...")
        file_menu.add_command(label="Exit", command=self.quit)
        menu_bar.add_cascade(label="File", menu=file_menu)

        self.parser_menu = Menu(menu_bar, tearoff=0)
        self.serial_parser_enabled = IntVar()
        self.serial_parser_enabled.set(1)
        self.parser_menu.add_checkbutton(
            label="Serial parser enabled",
            variable=self.serial_parser_enabled
        )
        self.parser_menu.add_command(label="Edit parser rules", command=self.open_conditionals_editor)
        menu_bar.add_cascade(label="Parser", menu=self.parser_menu)


        self.config(menu=menu_bar)
        main_frame = Frame(self)
        output_frame = Frame(main_frame)
        input_frame = Frame(main_frame)

        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)
        main_frame.grid(column=0, row=0, padx=3, pady=3, sticky=(N, W, E, S))
        main_frame.grid_columnconfigure(0, weight=1)
        main_frame.grid_rowconfigure(0, weight=1)



        output_text_vertical_scrollbar = Scrollbar(output_frame, orient=VERTICAL)
        output_text_horizontal_scrollbar = Scrollbar(output_frame, orient=HORIZONTAL)
        self.output_text = Text(
            output_frame,
            wrap=NONE,
            xscrollcommand=output_text_horizontal_scrollbar.set,
            yscrollcommand=output_text_vertical_scrollbar.set
        )
        self.output_text.configure(bg="white", state="disabled")
        self.output_text.grid(column=0, row=0, sticky=(N, S, E, W))
        output_text_vertical_scrollbar.grid(column=1, row=0, sticky=(N, S))
        output_text_vertical_scrollbar.config(command=self.output_text.yview)
        output_text_horizontal_scrollbar.grid(column=0, row=1, sticky=(E, W))
        output_text_horizontal_scrollbar.config(command=self.output_text.xview)

        output_frame.grid(column=0, row=0, sticky=(N, S, E, W))
        output_frame.grid_columnconfigure(0, weight=1)
        output_frame.grid_rowconfigure(0, weight=1)


        self.input_string = StringVar()
        input_entry = Entry(input_frame, textvariable=self.input_string)
        input_entry.grid(column=0, row=0, sticky=(E, W))

        line_end_selection_items = ["CR&NL", "NL", "CR", "None"]
        self.line_end_selection = Combobox(
            input_frame,
            values=line_end_selection_items,
            state="readonly",
            width=len(max(line_end_selection_items, key=len))
        )
        self.line_end_selection.current(newindex=0)
        self.line_end_selection.grid(column=1, row=0)

        serial_port_names = ["Port"]
        serial_port_names.extend([s.name for s in serial.tools.list_ports.comports()])
        self.port_name_selection = Combobox(
            input_frame,
            values = serial_port_names,
            state="readonly",
            width=len(max(serial_port_names, key=len))
        )
        self.port_name_selection.current(newindex=0)
        self.port_name_selection_index = 0
        self.port_name_selection.grid(column=2, row=0)


        baudrates = [
            "300 baud",
            "1200 baud",
            "2400 baud",
            "4800 baud",
            "9600 baud",
            "19200 baud",
            "38400 baud",
            "57600 baud",
            "74880 baud",
            "115200 baud",
            "230400 baud",
            "250000 baud"
        ]

        self.baudrate_selection = Combobox(
            input_frame,
            values = baudrates,
            state="readonly",
            width=len(max(baudrates, key=len))
        )
        self.baudrate_selection.current(newindex=9)
        self.baudrate_selection.grid(column=3, row=0)

        input_frame.grid(column=0, row=1, sticky=(E, W))
        input_frame.grid_columnconfigure(0, weight=1)

        self.port_name_selection.bind("<<ComboboxSelected>>", self.port_name_selected)
        self.baudrate_selection.bind("<<ComboboxSelected>>", self.baudrate_selected)

        self.after(100, self.serial_tick)

        # TODO Load from pickle file.
        self.conditionals = [
            ["Enabled", "line.startswith(\"Hello\")", "Python", "print 'Fooobaaaaar. Jibb.'"],
            ["Enabled", "line.startswith(\"Foo\")", "Debugger", "halt\nreset"],
        ]
        self.counter = 0


    def open_conditionals_editor(self):
        self.conditionals_editor = Toplevel(master=self)
        self.parser_menu.entryconfig("Edit parser rules", state="disabled")
        ConditionalsEditor(self.conditionals_editor, self.conditionals, self.closing_conditionals_editor)

    def closing_conditionals_editor(self):
        self.parser_menu.entryconfig("Edit parser rules", state="normal")


    def update_output_text(self, line):
        self.output_text.configure(state="normal")
        self.output_text.insert(END, line)
        self.output_text.configure(state="disabled")
        self.output_text.see(END)

    def evaluate_conditionals(self, line):
        if self.serial_parser_enabled.get() == 1:
            for condition in self.conditionals:
                if condition[0] == "Enabled":
                    if eval(condition[1]):
                        if condition[2] == "Python":
                            exec(condition[3], locals())
                        elif condition[2] == "Debugger":
                            print "Send to debugger: %s"%condition[3]



    def serial_tick(self):
        while True:
            try:
                line = self.serial_queue.get_nowait()
                self.update_output_text(line)
                self.evaluate_conditionals(line)
            except Queue.Empty:
                break
        self.after(100, self.serial_tick)

    def port_name_selected(self, event):
        port_name = event.widget.selection_get()
        if port_name == "Port":
            event.widget.current(newindex=self.port_name_selection_index)
            return
        self.port_name_selection_index = event.widget.current()
        self.serial_thread.set_port(port_name)

    def baudrate_selected(self, event):
        self.serial_thread.set_baudrate(event.widget.selection_get())
class MainWindow(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title(mainWindowTitle)
        self.resizable(width=0, height=0)
        self.__setStyles()
        self.__initializeComponents()
        self.__dataController = DataController();
        self.mainloop()
            
    def __initializeComponents(self):
        self.imageCanvas = Canvas(master=self, width=imageCanvasWidth,
                                  height=windowElementsHeight, bg="white")
        self.imageCanvas.pack(side=LEFT, padx=(windowPadding, 0),
                              pady=windowPadding, fill=BOTH)
        
        self.buttonsFrame = Frame(master=self, width=buttonsFrameWidth,
                                  height=windowElementsHeight)
        self.buttonsFrame.propagate(0)
        self.loadFileButton = Button(master=self.buttonsFrame,
                                     text=loadFileButtonText, command=self.loadFileButtonClick)
        self.loadFileButton.pack(fill=X, pady=buttonsPadding);
        
        self.colorByLabel = Label(self.buttonsFrame, text=colorByLabelText)
        self.colorByLabel.pack(fill=X)
        self.colorByCombobox = Combobox(self.buttonsFrame, state=DISABLED,
                                        values=colorByComboboxValues)
        self.colorByCombobox.set(colorByComboboxValues[0])
        self.colorByCombobox.bind("<<ComboboxSelected>>", self.__colorByComboboxChange)
        self.colorByCombobox.pack(fill=X, pady=buttonsPadding)
        self.rejectedValuesPercentLabel = Label(self.buttonsFrame, text=rejectedMarginLabelText)
        self.rejectedValuesPercentLabel.pack(fill=X)
        self.rejectedValuesPercentEntry = Entry(self.buttonsFrame)
        self.rejectedValuesPercentEntry.insert(0, defaultRejectedValuesPercent)
        self.rejectedValuesPercentEntry.config(state=DISABLED)
        self.rejectedValuesPercentEntry.pack(fill=X, pady=buttonsPadding)        
        
        self.colorsSettingsPanel = Labelframe(self.buttonsFrame, text=visualisationSettingsPanelText)
        self.colorsTableLengthLabel = Label(self.colorsSettingsPanel, text=colorsTableLengthLabelText)
        self.colorsTableLengthLabel.pack(fill=X)
        self.colorsTableLengthEntry = Entry(self.colorsSettingsPanel)
        self.colorsTableLengthEntry.insert(0, defaultColorsTableLength)
        self.colorsTableLengthEntry.config(state=DISABLED)
        self.colorsTableLengthEntry.pack(fill=X)
        self.scaleTypeLabel = Label(self.colorsSettingsPanel, text=scaleTypeLabelText)
        self.scaleTypeLabel.pack(fill=X)
        self.scaleTypeCombobox = Combobox(self.colorsSettingsPanel, state=DISABLED,
                                          values=scaleTypesComboboxValues)
        self.scaleTypeCombobox.set(scaleTypesComboboxValues[0])
        self.scaleTypeCombobox.bind("<<ComboboxSelected>>", self.__scaleTypeComboboxChange)
        self.scaleTypeCombobox.pack(fill=X)
        self.colorsTableMinLabel = Label(self.colorsSettingsPanel, text=colorsTableMinLabelText)
        self.colorsTableMinLabel.pack(fill=X)
        self.colorsTableMinEntry = Entry(self.colorsSettingsPanel)
        self.colorsTableMinEntry.insert(0, defaultColorsTableMin)
        self.colorsTableMinEntry.config(state=DISABLED)
        self.colorsTableMinEntry.pack(fill=X)
        self.colorsTableMaxLabel = Label(self.colorsSettingsPanel, text=colorsTableMaxLabelText)
        self.colorsTableMaxLabel.pack(fill=X)
        self.colorsTableMaxEntry = Entry(self.colorsSettingsPanel)
        self.colorsTableMaxEntry.insert(0, defaultColorsTableMax)
        self.colorsTableMaxEntry.config(state=DISABLED)
        self.colorsTableMaxEntry.pack(fill=X)
        self.colorsSettingsPanel.pack(fill=X, pady=buttonsPadding)
        
        self.redrawButton = Button(master=self.buttonsFrame, text=redrawButtonText,
                                   state=DISABLED, command=self.__redrawButtonClick)
        self.redrawButton.pack(fill=X, pady=buttonsPadding)
        self.buttonsFrame.pack(side=RIGHT, padx=windowPadding, pady=windowPadding, fill=BOTH)
        
    def __setStyles(self):
        Style().configure("TButton", padding=buttonsTextPadding, font=buttonsFont)
    
    def loadFileButtonClick(self):
        fileName = tkFileDialog.askopenfilename(filetypes=[('Tablet files', '*.mtb'), ('Tablet files', '*.htd')])
        if (fileName):
            if (not self.__getInputParams()):
                self.__showInvalidInputMessage()
                return
            
            self.lastFileName = fileName;
            self.title(mainWindowTitle + " " + fileName)
            self.__draw(fileName)
            tkMessageBox.showinfo(measureDialogTitle, 
                                  measureDialogText + str(self.__dataController.getMeasure(fileName)))
            
            self.redrawButton.config(state=NORMAL)
            self.colorByCombobox.config(state="readonly")
            self.colorsTableLengthEntry.config(state=NORMAL)
            self.scaleTypeCombobox.config(state="readonly")
            
    def __redrawButtonClick(self):
        if (not self.__getInputParams()):
            self.__showInvalidInputMessage()
            return
        
        self.__draw(self.lastFileName)

    def __scaleTypeComboboxChange(self, event):
        if (self.scaleTypeCombobox.get() == relativeScaleType):
            self.colorsTableMinEntry.config(state=DISABLED)
            self.colorsTableMaxEntry.config(state=DISABLED)
        else:
            self.colorsTableMinEntry.config(state=NORMAL)
            self.colorsTableMaxEntry.config(state=NORMAL)
        
    def __colorByComboboxChange(self, event):
        if (self.colorByCombobox.get() == colorByNoneOption):
            self.rejectedValuesPercentEntry.config(state=DISABLED)
        else:
            self.rejectedValuesPercentEntry.config(state=NORMAL)
        
    def __draw(self, fileName):
        self.imageCanvas.delete(ALL)

        dataForDrawing = self.__dataController.getDataForDrawing(
            fileName, self.colorByCombobox.get(), self.colorsTableLength,
            self.scaleTypeCombobox.get(), self.colorsTableMinValue,
            self.colorsTableMaxValue, self.rejectedValuesPercent)
        
        for package in dataForDrawing:
            x = package[0];
            y = package[1];
            color = package[2];
            self.imageCanvas.create_line(x, y, x + 1, y + 1, fill=color)
            
    def __drawColorBySpeed(self, dataPackages, minX, minY, ratio, hsv):   
        allSpeeds = self.__getAllSpeeds(dataPackages)
        minSpeed = min(allSpeeds)
        maxSpeed = max(allSpeeds)
        
        if (self.scaleTypeCombobox.get() == relativeScaleType):
            colorsTableMinValue = minSpeed
            colorsTableMaxValue = maxSpeed
        else:
            colorsTableMinValue = self.colorsTableMinValue
            colorsTableMaxValue = self.colorsTableMaxValue
        
        i = 0
        for package in dataPackages:
            x = (package[dataXNumber] - minX) * ratio
            y = (package[dataYNumber] - minY) * ratio
            
            color = hsv.getColorByValue(colorsTableMinValue,
                                        colorsTableMaxValue,
                                        allSpeeds[i])
                
            tk_rgb = "#%02x%02x%02x" % color
            self.imageCanvas.create_line(x, y, x + 1, y + 1, fill=tk_rgb)
            i += 1
            
    def __showInvalidInputMessage(self):
        tkMessageBox.showinfo(invalidInputMessageTitle, invalidInputMessageText)
    
    def __getInputParams(self):
        try:
            self.colorsTableLength = int(self.colorsTableLengthEntry.get())
            self.colorsTableMinValue = float(self.colorsTableMinEntry.get())
            self.colorsTableMaxValue = float(self.colorsTableMaxEntry.get())
            self.rejectedValuesPercent = float(self.rejectedValuesPercentEntry.get())
        
            if (self.colorsTableLength < 1 or
                self.colorsTableMinValue >= self.colorsTableMaxValue or
                self.rejectedValuesPercent < 0 or self.rejectedValuesPercent >= 100):
                raise
            return True
        except:
            return False
class EpiGui:

    REQ_MASTER_VERSION = 'Epi Master 1.14'

    CURRENT_EPI_ID = -1

    CHOOSE_MASTER = 1
    SET_PARAMS = 2
    SEED_EPIDEMIC = 3

    BUTTON_COL = 16
    TOP = 1
    LEFT = 12

    STATUS_SUSCEPTIBLE = 'green'
    STATUS_INFECTED = 'red'
    STATUS_RECOVERED = 'blue'

    # The defaults are:
    # (1) The ID of an epidemic (so we can distinguish one epidemic from another)
    # (2) Previously used sets of parameters for an epidemic.
    #
    # I store these in a defaults.ini file, with a CSV-like format:-
    # First line is always:    epid,1    -
    # All other lines:         "Param Set",r0_value,"r_type",min_poi,max_poi,transmit_power,exposure_time
    #              eg:         "Default",2,"poisson",1,5,4,10

    # Here I load all the parameter sets...

    def load_defaults(self):
        with open("defaults.ini","r") as ini_file:
            for line in ini_file:
                line = line.replace('\r','')
                line = line.replace('\n','')
                s = line.split(",")

                if ((len(s) == 2) & (s[0] == 'epid')):
                    self.CURRENT_EPI_ID = int(s[1])+1

                elif (len(s)==10):
                    self.paramsets.append(s[0].replace('"', ''))
                    self.p_r0.append(s[1])
                    self.p_rtype.append(s[2])
                    self.p_poimin.append(s[3])
                    self.p_poimax.append(s[4])
                    self.p_rpower.append(s[5])
                    self.p_exposure.append(str(s[6]))
                    self.p_btrans.append(s[7])
                    self.p_brec.append(s[8])
                    self.p_icons.append(s[9])

        self.cb_paramset['values']=self.paramsets
        self.cb_paramset.current(0)
        self.remember_paramset = 0
        self.select_parameterset()

    # Save the defaults.ini file with new data.

    def save_defaults(self):
        out_file = open("defaults.ini", "w")
        out_file.write("epid,{0}\n".format(self.CURRENT_EPI_ID))
        for i in range(0, len(self.paramsets)):
            out_file.write('"{0}",{1},{2},{3},{4},{5},{6},{7},{8},{9}\n'.format(
                self.paramsets[i],
                self.p_r0[i],
                self.p_rtype[i],
                self.p_poimin[i],
                self.p_poimax[i],
                self.p_rpower[i],
                self.p_exposure[i],
                self.p_btrans[i],
                self.p_brec[i],
                self.p_icons[i]))

        out_file.close()

    # Choose a particular parameter set from the list...

    def change_paramset(self, event):
        i = self.cb_paramset.current()
        if (self.remember_paramset != i):
            resp = False
            if (self.b_save_pset['state'] == 'active'):
                resp = tkMessageBox.askyesnocancel(self.lang.save_first, self.lang.save_first_q)
            if (resp == True):
                self.save_params(index = self.remember_paramset)
                resp = False

            # Either... there were no changes, or, there were changes we didn't want to save,
            # Or, there were changes we saved and wanted to continue... resp == False for all 3.

            if (resp == False):
                self.select_parameterset()
                self.remember_paramset = i

    def select_parameterset(self):
        i = self.cb_paramset.current()
        self.sv_r0.set(self.p_r0[i])
        self.cb_rtype.current(int(self.p_rtype[i]))
        self.cb_poimin.current(self.cb_poimin['values'].index(self.p_poimin[i]))
        self.cb_poimax.current(self.cb_poimax['values'].index(self.p_poimax[i]))
        self.cb_rpower.current(self.cb_rpower['values'].index(self.p_rpower[i]))
        self.cb_exposure.current(self.cb_exposure['values'].index(self.p_exposure[i]))
        self.cb_btrans.current(int(self.p_btrans[i]))
        self.cb_brec.current(int(self.p_brec[i]))
        self.cb_icons.current(int(self.p_icons[i]))

        if (len(self.paramsets) > 1):
            self.b_del_pset['state'] = 'active'
        else:
            self.b_del_pset['state'] = 'disabled'
        self.b_save_pset['state'] = 'disabled'

    # Delete a parameter set

    def del_params(self):
        if tkMessageBox.askokcancel(self.lang.delete, self.lang.delete_conf):
            i = self.cb_paramset.current()
            del self.p_r0.remove[i]
            del self.p_rtype[i]
            del self.p_poimax[i]
            del self.p_poimin[i]
            del self.p_rpower[i]
            del self.p_exposure[i]
            del self.p_btrans[i]
            del self.p_brec[i]
            del self.p_icons[i]
            del self.paramsets[i]
            self.b_save_pset['state'] = 'disabled'
            self.cb_paramset['values'] = self.paramsets
            self.cb_paramset.current(min(i, len(self.paramsets) - 1))
            self.save_defaults()
            self.select_parameterset()

    # Save changes to the parameter set structure in RAM.
    # And then write all parameter sets to the file.

    def validate_params(self):
        # Do some validation first.
        valid = True
        try:
            float(self.sv_r0.get())
        except:
            tkMessageBox.showerror(self.lang.error, self.lang.err_r0)
            valid = False

        try:
            int(self.sv_epidno.get())
        except:
            tkMessageBox.showerror(self.lang.error, self.lang.epi_id_err)
            valid = False

        return valid

    # Save parameter config...

    def save_params(self, index = -1):

        # Default: save the currently viewed parameter set (index=-1)
        # If this happened because of a "save unsaved changes", then index can specify
        # which parameter set we want to save.


        if self.validate_params():
            if (index==-1):
                index = self.cb_paramset.current()

            self.p_r0[index] = self.sv_r0.get()
            self.p_rtype[index] = self.cb_rtype.current()
            self.p_poimin[index] = self.cb_poimin.get()
            self.p_poimax[index] = self.cb_poimax.get()
            self.p_rpower[index] = self.cb_rpower.get()
            self.p_exposure[index] = self.cb_exposure.get()
            self.p_btrans[index] = self.cb_btrans.current()
            self.p_brec[index] = self.cb_brec.current()
            self.p_icons[index] = self.cb_icons.current()
            self.save_defaults()
            self.b_save_pset['state']='disabled'

    # Save current settings as a new parameter set

    def saveas_params(self):
        new_name = tkSimpleDialog.askstring(self.lang.name, self.lang.name_pset)

        # Handle cancel / empty string

        if new_name is not None:
            new_name = new_name.strip()
            if (len(new_name) == 0):
                new_name = None

        # Handle duplicate name

        if new_name is not None:
            try:
                self.paramsets.index(new_name)
                tkMessageBox.showerror(self.lang.error, self.lang.dup_pset)
                new_name = None
            except:
                pass

        # Ok, save and select.
        if new_name is not None:
            self.p_exposure.append(self.cb_exposure.get())
            self.p_rpower.append(self.cb_rpower.get())
            self.p_poimin.append(self.cb_poimin.get())
            self.p_poimax.append(self.cb_poimax.get())
            self.p_rtype.append(self.cb_rtype.current())
            self.p_r0.append(self.sv_r0.get())
            self.p_btrans.append(self.cb_btrans.current())
            self.p_brec.append(self.cb_brec.current())
            self.p_icons.append(self.cb_icons.current())
            self.paramsets.append(new_name)
            self.save_defaults()
            self.cb_paramset['values'] = self.paramsets
            self.cb_paramset.current(len(self.cb_paramset['values']) - 1)
            self.select_parameterset()
            self.b_save_pset['state'] = 'disabled'

    # Events where parameters are changed.

    def set_params_unsaved(self, event):
        self.b_save_pset['state'] = 'active'

    def change_poimin(self, event):
        maxv = int(self.cb_poimax.current())
        minv = int(self.cb_poimin.current())
        if (minv>maxv):
            self.cb_poimax.current(minv)

    def change_poimax(self, event):
        maxv = int(self.cb_poimax.current())
        minv = int(self.cb_poimin.current())
        if (maxv<minv):
            self.cb_poimin.current(maxv)

    # Exit confirmation dialogue

    def ask_quit(self):
        if tkMessageBox.askokcancel(self.lang.exit, self.lang.really_exit):
            self.window.destroy()


    def click_set_master(self):
        proceed = False
        if (self.sv_software.get() != self.REQ_MASTER_VERSION):
            tkMessageBox.showerror(self.lang.error, self.lang.mb_master_err)
        else:
            self.set_task_text(self.lang.instructions_2)
            proceed = True

        if (proceed):
            self.b_setMaster['state']='disabled'
            self.b_sendParams['state']='active'
            self.grid_forget_all([self.cb_masters, self.b_rescan, self.l_port,
            self.l_software, self.l_software2,
            self.l_serialno, self.l_serialno2,
            self.l_mbitver, self.l_mbitver2])
            self.l_epidno.grid(column = self.LEFT, row = self.TOP, sticky = "E")
            self.e_epidno.grid(column = 1 + self.LEFT, row = self.TOP, sticky = "W")
            self.l_paramset.grid(column = self.LEFT, row = 1 + self.TOP, sticky = "E")
            self.cb_paramset.grid(column = 1 + self.LEFT, row = 1 + self.TOP, sticky = "W")
            self.b_save_pset.grid(column = 2 + self.LEFT, row = 1 + self.TOP, sticky = "W")
            self.b_del_pset.grid(column = 3 + self.LEFT, row = 1 + self.TOP, sticky = "W")
            self.b_saveas_pset.grid(column = 4 + self.LEFT, row = 1 + self.TOP, sticky = "W")

            self.l_r0.grid(column = self.LEFT, row = 2 + self.TOP, sticky = "E")
            self.e_r0.grid(column = 1 + self.LEFT, row = 2 + self.TOP, sticky = "W")
            self.l_rtype.grid(column = self.LEFT, row = 3 + self.TOP, sticky = "E")
            self.cb_rtype.grid(column = 1 + self.LEFT, row = 3 + self.TOP, sticky = "W")
            self.l_poimin.grid(column = self.LEFT, row = 4 + self.TOP, sticky = "W")
            self.cb_poimin.grid(column = 1 + self.LEFT, row = 4 + self.TOP, sticky = "E")
            self.l_poimax.grid(column = self.LEFT, row = 5 + self.TOP, sticky = "W")
            self.cb_poimax.grid(column = 1 + self.LEFT, row = 5 + self.TOP, sticky = "E")
            self.l_rpower.grid(column = self.LEFT, row = 6 + self.TOP, sticky = "E")
            self.cb_rpower.grid(column = 1 + self.LEFT, row = 6 + self.TOP, sticky = "W")
            self.l_exposure.grid(column = self.LEFT, row = 7 + self.TOP, sticky = "E")
            self.cb_exposure.grid(column = 1 + self.LEFT, row = 7 + self.TOP, sticky = "E")
            self.l_btrans.grid(column = self.LEFT, row = 8 + self.TOP, sticky = "E")
            self.cb_btrans.grid(column = 1 + self.LEFT, row = 8 + self.TOP, sticky = "E")
            self.l_brec.grid(column = self.LEFT, row = 9 + self.TOP, sticky = "E")
            self.cb_brec.grid(column = 1 + self.LEFT, row = 9 + self.TOP, sticky = "E")
            self.l_icons.grid(column = self.LEFT, row = 10 + self.TOP, sticky = "E")
            self.cb_icons.grid(column = 1 + self.LEFT, row = 10 + self.TOP, sticky = "E")


    def update_seed_epi_button(self):
        self.b_seedEpidemic['state'] = 'disabled'
        sid = self.sv_seedid.get()
        if (len(sid)>0):
            sid = int(sid)
            if (self.minions[sid % 10][sid / 10]['bg'] == self.STATUS_SUSCEPTIBLE):
                self.b_seedEpidemic['state'] = 'active'


    def click_send_params(self):
        self.save_defaults()
        self.sv_susc.set('0')
        self.sv_inf.set('0')
        self.sv_recov.set('0')
        self.b_setMaster.grid_forget()
        self.b_sendParams.grid_forget()
        self.b_seedEpidemic.grid(column = 0, row = 18, columnspan = 5)
        self.b_resetEpidemic.grid(column = 5, row = 18, columnspan = 5)
        self.serial_link.send_params()
        self.set_task_text(self.lang.instructions_3)
        self.grid_forget_all([self.l_epidno, self.e_epidno, self.l_paramset, self.cb_paramset,
                self.b_save_pset, self.b_del_pset, self.b_saveas_pset, self.l_r0,
                self.e_r0, self.l_rtype, self.cb_rtype, self.l_poimin, self.cb_poimin,
                self.l_poimax, self.cb_poimax, self.l_rpower, self.cb_rpower,
                self.l_exposure, self.cb_exposure, self.l_brec, self.cb_brec,
                self.l_btrans, self.cb_btrans, self.l_icons, self.cb_icons])

        self.l_epidno.grid(column = self.LEFT, row = 0, sticky = "E")
        self.l_epidconst.grid(column = self.LEFT + 1, row = 0, sticky = "W")
        self.b_screen_off.grid(column = self.LEFT, row=17 + self.TOP)
        self.b_screen_on.grid(column = self.LEFT+1, row=17 + self.TOP)
        
        self.l_seedid.grid(column = self.LEFT, row = self.TOP, sticky = "E")
        self.l_seedid2.grid(column = 1 + self.LEFT, row = self.TOP, sticky = "W")
        self.b_rndseed.grid(column = 2 + self.LEFT, row = self.TOP, sticky = "W")
        self.l_forcer.grid(column = self.LEFT, row = 1 + self.TOP, sticky = "E")
        self.tb_forcer.grid(column = 1 + self.LEFT, row = 1 + self.TOP, sticky = "W")
        self.l_ncons.grid(column = self.LEFT, row = 2 + self.TOP, sticky = "E")
        self.cb_forcer.grid(column = 1 + self.LEFT, row = 2 + self.TOP, sticky = "W")
        self.b_sendParams['state']='disabled'
        self.b_seedEpidemic['state']='disabled'

        self.l_susc.grid(column = self.LEFT, row = 6 + self.TOP, sticky = "E")
        self.l_susc2.grid(column = 1 + self.LEFT, row = 6 + self.TOP, sticky = "E")
        self.l_inf.grid(column = self.LEFT, row = 7 + self.TOP, sticky = "E")
        self.l_inf2.grid(column = 1 + self.LEFT, row = 7 + self.TOP, sticky = "E")
        self.l_recov.grid(column = self.LEFT, row = 8 + self.TOP, sticky = "E")
        self.l_recov2.grid(column = 1 + self.LEFT, row = 8 + self.TOP, sticky = "E")

    def click_seed_epi(self):
        m_id = int(self.sv_seedid.get())
        if (self.minions[m_id % 10][m_id / 10]['bg']==self.STATUS_SUSCEPTIBLE):
            self.serial_link.seed_epidemic()
            self.sv_seedid.set("")
        else:
            tkMessageBox.showerror(self.lang.too_slow, self.lang.no_longer_susc)


    def click_reset_epi(self):
        confirm = tkSimpleDialog.askstring(self.lang.end_epi, self.lang.reset_or_power_off)

        if (confirm == 'RESET') or (confirm == 'POWEROFF'):

            self.grid_forget_all([self.l_seedid, self.l_seedid2, self.b_rndseed, self.l_forcer, self.tb_forcer,
                self.l_ncons, self.cb_forcer, self.b_seedEpidemic, self.b_resetEpidemic, self.l_epidconst, self.l_epidno, 
                self.l_susc, self.l_susc2, self.l_inf, self.l_inf2, self.l_recov, self.l_recov2, self.b_screen_off,
                self.b_screen_on])

            if (confirm == 'RESET'):
                self.serial_link.reset_epidemic()
                self.CURRENT_EPI_ID = 1 + self.CURRENT_EPI_ID
                self.sv_epidno.set(self.CURRENT_EPI_ID)
                self.show_first_interface()

            elif (confirm == 'POWEROFF'):
                self.serial_link.poweroff_minions()

    def click_minion(self, m_id):
        m_id = int(m_id)
        if (self.serial_link.serial_port != 0):
            if (self.minions[m_id % 10][m_id / 10]['bg']==self.STATUS_SUSCEPTIBLE):
                self.sv_seedid.set(m_id)
            else:
                self.sv_seedid.set('')
        self.update_seed_epi_button()

    def click_random_minion(self):
        candidates = 0
        for m_id in range(0, 99):
            if (self.minions[m_id % 10][m_id / 10]['bg']==self.STATUS_SUSCEPTIBLE):
                candidates = candidates + 1

        if (candidates>0):
            r = random.randint(1,candidates)
            for m_id in range(0, 99):
                if (self.minions[m_id % 10][m_id / 10]['bg']==self.STATUS_SUSCEPTIBLE):
                    r = r - 1
                    if (r == 0):
                        self.sv_seedid.set(m_id)
                        self.update_seed_epi_button()
                        break

    def set_minion_status(self, minion_id, status):
        m_id = int(minion_id)
        if (self.minions[m_id % 10][m_id / 10]['bg'] != status):
            self.minions[m_id % 10][m_id / 10]['bg'] = status
            if (status == self.STATUS_SUSCEPTIBLE):
                self.sv_susc.set(str(int(self.sv_susc.get())+1))
            elif (status == self.STATUS_INFECTED):
                self.sv_susc.set(str(int(self.sv_susc.get())-1))
                self.sv_inf.set(str(int(self.sv_inf.get())+1))
            elif (status == self.STATUS_RECOVERED):
                self.sv_inf.set(str(int(self.sv_inf.get())-1))
                self.sv_recov.set(str(int(self.sv_recov.get())+1))

        self.update_seed_epi_button()

    # Update the instructions box for what to do in this stage of the epidemic.

    def set_task_text(self, t):
        self.st_instruct['state'] = 'normal'
        self.st_instruct.delete('1.0', END)
        self.st_instruct.insert('insert', t)
        self.st_instruct['state'] = 'disabled'

    # Remove all the give components from the grid layout.

    def grid_forget_all(self, widgets):
        for widget in widgets:
            widget.grid_forget()

    def click_forcer(self):
        if (self.iv_forcer.get()==0):
            self.cb_forcer['state'] = 'disabled'
        else:
            self.cb_forcer['state'] = 'active'

    def show_first_interface(self):
        self.l_port.grid(column = self.LEFT, row = self.TOP)
        self.cb_masters.grid(column = 1 + self.LEFT, row = self.TOP)
        self.b_rescan.grid(column = 2 + self.LEFT, row = self.TOP)
        self.l_software.grid(column = self.LEFT, row = 1 + self.TOP, sticky = "E")
        self.l_software2.grid(column = 1 + self.LEFT, row = 1 + self.TOP, sticky = "W")
        self.l_serialno.grid(column = self.LEFT, row = 2 + self.TOP, sticky = "E")
        self.l_serialno2.grid(column = 1 + self.LEFT, row = 2 + self.TOP, sticky = "W")
        self.l_mbitver.grid(column = self.LEFT, row = 3 + self.TOP, sticky = "E")
        self.l_mbitver2.grid(column = 1 + self.LEFT, row = 3 + self.TOP, sticky = "W")
        self.set_task_text(self.lang.instructions_1)
        self.b_sendParams['state'] = 'disabled'
        self.b_setMaster['state'] = 'active'

        self.b_setMaster.grid(column = 0, row = 18, columnspan = 5)
        self.b_sendParams.grid(column = 5, row = 18, columnspan = 5)
        for i in range(100):
            self.set_minion_status(i, '#f0f0f0')
            self.inf_reported[i] = 0
            self.rec_reported[i] = 0
                        
        self.serial_link.refresh_microbit_comports()

    def click_screens_off(self):
        self.serial_link.screens_off()
        
    def click_screens_on(self):
        self.serial_link.screens_on()
    # Create the GUI.

    def __init__(self, serial_link):

        # Basic definitions for the GUI components.

        self.window = Tk()
        self.lang = EpiLang()
        self.serial_link = serial_link
        self.serial_link.set_gui_link(self)

        # GUI elements present on all pages.

        self.minions =  [[0 for x in xrange(10)] for y in xrange(10)]
        
        for x in range(10):
            for y in range(10):
                n=((y * 10) + x)
                if (n < 10): n = "0" + str(n)
                self.minions[x][y] = Button(self.window, text = n,
                    command = lambda n1 = n: self.click_minion(n1))
                self.minions[x][y].grid(column = x, row = y)
                
        self.inf_reported = [0 for x in range(100)]
        self.rec_reported = [0 for x in range(100)]

        self.b_setMaster = Button(self.window, text = self.lang.set_master_mb, command = self.click_set_master)
        self.b_sendParams = Button(self.window, text = self.lang.send_params, command = self.click_send_params)
        self.b_seedEpidemic = Button(self.window, text = self.lang.seed_epi, command = self.click_seed_epi)
        self.b_resetEpidemic = Button(self.window, text = self.lang.reset_epi, command = self.click_reset_epi)

        self.l_task = Label(self.window, text = self.lang.current_task)
        self.st_font = tkFont.Font(family = "Calibri", size = 10)
        self.st_instruct = tkst.ScrolledText(self.window, width = 30, height = 5, font = self.st_font,
                                        wrap = 'word', state = 'disabled')


        self.l_task.grid(column = 0, row = 13, columnspan = 10)
        self.st_instruct.grid(column=0, row = 14, columnspan = 10)


        # GUI elements for the Micro:Bit master selection page

        self.l_port = Label(self.window, text = self.lang.using_port)
        self.cb_masters = Combobox(self.window, state = 'readonly')
        self.cb_masters.bind("<<ComboboxSelected>>", self.serial_link.get_master_info)
        self.cb_masters_double_click = 0
        self.b_rescan = Button(self.window, text = self.lang.rescan,
            command = self.serial_link.refresh_microbit_comports)
        self.l_software = Label(self.window, text = self.lang.software)
        self.sv_software = StringVar()
        self.sv_software.set("")
        self.l_software2 = Label(self.window, textvariable = self.sv_software)

        self.l_serialno = Label(self.window, text = self.lang.serial_no)
        self.sv_serialno = StringVar()
        self.l_serialno2 = Label(self.window, textvariable = self.sv_serialno)
        self.l_mbitver = Label(self.window, text = self.lang.mb_version)
        self.sv_mbitver = StringVar()
        self.l_mbitver2 = Label(self.window, textvariable = self.sv_mbitver)

        # GUI elements for the parameter settings page

        self.l_epidno = Label(self.window, text = self.lang.epi_id)
        self.sv_epidno = StringVar()
        self.e_epidno = Entry(self.window, textvariable = self.sv_epidno)
        self.l_epidconst = Label(self.window, textvariable = self.sv_epidno, font=('Arial', 12, 'bold'))

        self.l_paramset = Label(self.window, text = self.lang.saved_params)
        self.cb_paramset = Combobox(self.window, state = 'readonly')
        self.b_save_pset = Button(self.window, text = self.lang.save, command = self.save_params)
        self.b_del_pset = Button(self.window, text = self.lang.delete, command = self.del_params)
        self.b_saveas_pset = Button(self.window, text = self.lang.save_as, command = self.saveas_params)

        self.l_r0 = Label(self.window, text = self.lang.R0)
        self.sv_r0 = StringVar()
        self.e_r0 = Entry(self.window, textvariable = self.sv_r0)
        self.l_rtype = Label(self.window, text = self.lang.R_type)
        self.cb_rtype = Combobox(self.window, state = 'readonly')
        self.l_poimin = Label(self.window, text = self.lang.poi_min);
        self.cb_poimin = Combobox(self.window, state = 'readonly')
        self.l_poimax = Label(self.window, text = self.lang.poi_max);
        self.cb_poimax = Combobox(self.window, state = 'readonly')

        self.l_rpower = Label(self.window, text = self.lang.transmit_range)
        self.cb_rpower = Combobox(self.window, state = 'readonly')
        self.l_exposure = Label(self.window, text = self.lang.exposure)
        self.cb_exposure = Combobox(self.window, state = 'readonly')
        self.l_btrans = Label(self.window, text = self.lang.transmit_button)
        self.cb_btrans = Combobox(self.window, state = 'readonly')
        self.l_brec = Label(self.window, text = self.lang.receive_button)
        self.cb_brec = Combobox(self.window, state = 'readonly')
        self.l_icons = Label(self.window, text = self.lang.icon_set)
        self.cb_icons = Combobox(self.window, state = 'readonly')

        self.cb_rtype['values'] = [self.lang.constant, self.lang.poisson]
        self.cb_rpower['values'] = range(0, 8)
        self.cb_exposure['values'] = [1, 5, 10, 20, 30, 40, 50, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360, 420, 480, 540, 600]
        self.cb_poimin['values'] = range(0, 99)
        self.cb_poimax['values'] = range(1, 100)
        self.cb_btrans['values'] = ['Auto','A','B','A+B']
        self.cb_brec['values'] = ['Auto','A','B','A+B']
        self.cb_icons['values'] = ['SIR', 'I+R', '-I-']

        self.cb_poimin.bind("<<ComboboxSelected>>", self.change_poimin)
        self.cb_poimax.bind("<<ComboboxSelected>>", self.change_poimax)
        self.cb_paramset.bind("<<ComboboxSelected>>", self.change_paramset)
        self.remember_paramset = -1
        self.cb_rtype.bind("<<ComboboxSelected>>", self.set_params_unsaved)
        self.cb_rpower.bind("<<ComboboxSelected>>", self.set_params_unsaved)
        self.cb_exposure.bind("<<ComboboxSelected>>", self.set_params_unsaved)
        self.cb_btrans.bind("<<ComboboxSelected>>", self.set_params_unsaved)
        self.cb_brec.bind("<<ComboboxSelected>>", self.set_params_unsaved)
        self.cb_icons.bind("<<ComboboxSelected>>", self.set_params_unsaved)
        self.e_r0.bind("<Key>", self.set_params_unsaved)

        # Gui Elements for the Seeding / Progress Page

        self.l_seedid = Label(self.window, text = "Victim:")
        self.sv_seedid = StringVar()
        self.l_seedid2 = Label(self.window, textvariable = self.sv_seedid)
        self.b_rndseed = Button(self.window, text = 'Random', command = self.click_random_minion)
        self.l_forcer = Label(self.window, text = "Force contacts")
        self.iv_forcer = IntVar()
        self.iv_forcer.set(1)
        self.tb_forcer = Checkbutton(self.window, text="", variable = self.iv_forcer, command=self.click_forcer)
        self.l_ncons = Label(self.window, text = "No. contacts")
        self.cb_forcer = Combobox(self.window, state = 'readonly')

        self.l_susc = Label(self.window, text = "Susceptible:")
        self.sv_susc = StringVar()
        self.l_susc2 = Label(self.window, textvariable = self.sv_susc)
        self.l_inf = Label(self.window, text="Infected:")
        self.sv_inf = StringVar()
        self.l_inf2 = Label(self.window, textvariable = self.sv_inf)
        self.l_recov = Label(self.window, text = "Recovered:")
        self.sv_recov = StringVar()
        self.l_recov2 = Label(self.window, textvariable = self.sv_recov)

        self.cb_forcer['values'] = range(1,100)
        self.cb_forcer.current(3)
        
        self.b_screen_off = Button(self.window, text = "Screens OFF", command = self.click_screens_off)
        self.b_screen_on = Button(self.window, text = "Screens ON", command = self.click_screens_on)
        

        # Load the previously-saved configurations

        self.paramsets = []
        self.p_r0 = []
        self.p_rtype = []
        self.p_poimin = []
        self.p_poimax = []
        self.p_rpower = []
        self.p_exposure = []
        self.p_btrans = []
        self.p_brec = []
        self.p_icons = []

        self.load_defaults()
        self.sv_epidno.set(self.CURRENT_EPI_ID)

        # Window specific stuff. Set what happens on exit
        # Set the size, title, and application icon for the window.

        self.window.protocol("WM_DELETE_WINDOW", self.ask_quit)
        self.window.title(self.lang.title)
        self.window.geometry("640x480")
        imgicon = PhotoImage(file = os.path.join('microepi.gif'))
        self.window.tk.call('wm', 'iconphoto', self.window._w, imgicon)

        # Show first interface

        self.show_first_interface()

        self.window.mainloop()
Exemple #40
0
class DATAin:
    def __init__(self, maestro):
        # Atributo de conteo'''
        self.botonClics = 0
        self.bandDATA = 3
        self.operacion=""
        self.cliente = ''
        self.Producto = ''
        self.alturaDATA = 0
        self.anchoDATA = 0
        self.largoDATA = 0
        self.Datos = []
        for i in range (7):
            self.Datos.append('')
            
        self.consoleSQL = PSQLmerma1()
        #gg = Tkk.Notebook(maestro)
        self.top = Toplevel(maestro)
        self.top.title('Introduce medidas de la caja')
        self.top.update_idletasks()
#        w = self.top.winfo_screenwidth()
#        h = self.top.winfo_screenheight()
#        size = tuple(int(_) for _ in self.top.geometry().split('+')[0].split('x'))
#        x = w/2 - size[0]/2
#        y = h/2 - size[1]/2
#        print size + (x, y)
#        
        self.top.geometry("+150+60")
        #self.top.iconbitmap('/home/pi/Desktop/ProgGUI/GUI/resources/ICO/IconoBCT.ico')
        
        #MARCO3 ESEL LINEZO DONDE SE DIBUJAN LAS PESTAÑAS
        self.marco3 = TTK.Notebook(self.top)

        # CREAMOS EL MARCO PARA CADA UNA DE LAS PESTAÑAS
        self.page1 = TTK.Frame(self.marco3)
        self.page2 = TTK.Frame(self.marco3)
        self.page3 = TTK.Frame(self.marco3)
        self.page4 = TTK.Frame(self.marco3)
        self.page5 = TTK.Frame(self.marco3)
       
        # AGREGAMOS EL MARCO A LAS PESTAÑAS Y SU NOMBRE
        self.marco3.add(self.page1, text='Dimensiones de la caja')
        self.marco3.add(self.page2, text='Descripción de la caja')
        self.marco3.add(self.page3, text='Descripción de la prueba')
        self.marco3.add(self.page4, text='Datos del cliente')
        self.marco3.add(self.page5, text='Resumen de datos')
        self.marco3.grid()
        
        # AGREGAGOS CONTENIDO A PESTAÑA 1
        self.IMGcaja = PhotoImage(file = '/home/pi/Desktop/InterfazG-BCT/resources/img/cajaDATA/caja.png')
        self.IMGancho= PhotoImage(file = '/home/pi/Desktop/InterfazG-BCT/resources/img/cajaDATA/anchoSelect.png')
        self.IMGlargo= PhotoImage(file = '/home/pi/Desktop/InterfazG-BCT/resources/img/cajaDATA/largoSelect.png')
        self.IMGalto = PhotoImage(file = '/home/pi/Desktop/InterfazG-BCT/resources/img/cajaDATA/altoSelect.png')
        
        self.cajaLB = Label(self.page1, image = self.IMGcaja)
        self.cajaLB.grid(row = 0, column = 4, rowspan = 5, columnspan = 3)
        
        self.txtLB = 'Seleccione un botón e ingrese \n las medidas en cm'
        self.LB = Label(self.page1, font =('Helvetica', 15), text = self.txtLB)
        self.LB.grid(row = 0, column = 0, columnspan = 4)
        
        self.CBdata = Text(self.page1, state="disabled", width=40, height=2, font=("Helvetica",15))
        self.CBdata.grid(row = 1, column = 0, columnspan = 4)
        
        self.anchoL = Label(self.page1, 
                            font =('Helvetica', 15), 
                            text = "")
        self.anchoL.grid(row =4, column = 4, sticky = 's')
        self.BTNancho = Button(self.page1, width=5, height=1, font=("Helvetica",15), text = 'Ancho', command =lambda: self.selectCB('an'))
        self.BTNancho.grid(row = 5, column = 4)
        self.largoL = Label(self.page1, 
                            font =('Helvetica', 15), 
                            text = "")
        self.largoL.grid(row =4, column = 5, sticky = 's')
        self.BTNlargo = Button(self.page1, width=5, height=1, font=("Helvetica",15), text = 'Largo', command =lambda: self.selectCB('la'))
        self.BTNlargo.grid(row = 5, column = 5)
        self.altoL  = Label(self.page1, 
                            font =('Helvetica', 15), 
                            text = "")
        self.altoL.grid(row =4, column = 6, sticky = 's')
        self.BTNalto = Button(self.page1, width=5, height=1, font=("Helvetica",15), text = 'Alto', command =lambda: self.selectCB('al'))
        self.BTNalto.grid(row = 5, column = 6)
        
        boton1 = self.crearBoton(1)
        boton2 = self.crearBoton(2)
        boton3 = self.crearBoton(3)
        boton4 = self.crearBoton(4)
        boton5 = self.crearBoton(5)
        boton6 = self.crearBoton(6)
        boton7 = self.crearBoton(7)
        boton8 = self.crearBoton(8)
        boton9 = self.crearBoton(9)
        boton0 = self.crearBoton(0,ancho=7)
        botonErase = self.crearBoton(u"\u232B",escribir=False)
        botonErase['background'] = "red"
        botonErase.grid(row = 2, column = 3)
        botonEnter = self.crearBoton(u"\u21B5",escribir=False)
        botonEnter['background'] = "green"
        botonEnter.grid(row = 3, column = 3)
        botondot = self.crearBoton('.')
        
        #Ubicación de los botones
        botones=[boton7, boton8, boton9,
                 boton4, boton5, boton6,
                 boton1, boton2, boton3,
                 boton0]
        contador=0
        for fila in range(2,5):
            for columna in range(3):
                botones[contador].grid(row=fila,column=columna)
                contador+=1
        #Ubicar el último botón al final
        botones[contador].grid(row=5,column=0,columnspan=2)
        botondot.grid(row = 5, column = 2)
        
        # AGREGAGOS CONTENIDO A PESTAÑA 2
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = 'Seleccione:')\
              .grid(row = 0, column = 0,columnspan = 5)
              
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = 'Estilo de caja')\
              .grid(row = 1, column = 0)
              
        self.listCaja = Combobox(self.page2,
                                 state="readonly",
                                 values = ["Caja troquelada", "Caja est" + u"\xe1" + "ndar"],
                                 font =('Helvetica', 15))
        self.listCaja.grid(row = 2, column = 0)
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = '             ')\
              .grid(row = 2, column = 1)
        
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = 'Tipo de flauta')\
              .grid(row = 1, column = 2)
        self.listFlauta = Combobox(self.page2,
                                   state="readonly",
                                   values = ["Corrugado sencillo B", "Corrugado sencillo C", "Corrugado sencillo E", "Doble corrugado BC", "Doble corrugado EB"],
                                   font =('Helvetica', 15))
        self.listFlauta.grid(row = 2, column = 2)
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = '             ')\
              .grid(row = 2, column = 3)
              
              
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = 'Dirección de la flauta')\
              .grid(row = 1, column = 4)
        self.listFlautaD= Combobox(self.page2,
                                   state="readonly",
                                   values = ["Horizontal", "Vertical"],
                                   font =('Helvetica', 15))
        self.listFlautaD.grid(row = 2, column = 4)
                                   
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = '             ')\
              .grid(row = 3, column = 0, columnspan = 3)
        
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = 'Grado del material')\
              .grid(row = 4, column = 0)
        self.listGradoM= Combobox(self.page2,
                                   state="readonly",
                                   values = ["No aplica", "20 ECT", "21 ECT", "23 ECT", "26 ECT", "29 ECT", "32 ECT", "44 ECT", "48 ECT", "50 ECT", "61 ECT", "71 ECT"],
                                   font =('Helvetica', 15))
        self.listGradoM.grid(row = 5, column = 0)
                                   
        Label(self.page2, 
              font =('Helvetica', 15), 
              text = 'Tipo de unión')\
              .grid(row = 4, column = 2)
        self.listUnion= Combobox(self.page2,
                                   state="readonly",
                                   values = ["Pegado", "Grapado", "Armado automático"],
                                   font =('Helvetica', 15))
        self.listUnion.grid(row = 5, column = 2)
        
        # AGREGAMOS CONTEIDO A PAGE3
        Label(self.page3, 
              font =('Helvetica', 15), 
              text = 'Método de cierre')\
              .grid(row = 0, column = 0)
        self.listCierre= Combobox(self.page3,
                                   state="readonly",
                                   values = ["Conforme a la TAPPI T 804", "Otro", "No aplica"],
                                   font =('Helvetica', 15))
        self.listCierre.grid(row = 1, column = 0)
                                   
        Label(self.page3, 
              font =('Helvetica', 15), 
              text = '             ')\
              .grid(row = 0, column = 1)
              
        Label(self.page3, 
              font =('Helvetica', 15), 
              text = 'Orientación de la prueba')\
              .grid(row = 0, column = 2)
        self.listOrientaC= Combobox(self.page3,
                                   state="readonly",
                                   values = ["Arriba a abajo", "Extremo a extremo", "Lado a lado"],
                                   font =('Helvetica', 15))
        self.listOrientaC.grid(row = 1, column = 2)
        
        self.IMGbct = Image.open(file = '/home/pi/Desktop/InterfazG-BCT/resources/img/cajaDATA/CajaBIedit.png')
        
        self.cajaBCT = Label(self.page3, image = self.IMGbct)
        self.cajaBCT.grid(row = 2, column = 0, columnspan = 3)
        
        # AGREGAMOS CONTENIDO A PAGE 4
        self.txtLB = 'Ingresar datos o buscar por número de pedido'
        self.state = TTK.Label(self.page4, font =('Helvetica', 15), text = self.txtLB)
        self.state.grid(row = 0, column = 0, columnspan = 12)
        
        boton1 = self.crearBotonP4(1)
        boton2 = self.crearBotonP4(2)
        boton3 = self.crearBotonP4(3)
        boton4 = self.crearBotonP4(4)
        boton5 = self.crearBotonP4(5)
        boton6 = self.crearBotonP4(6)
        boton7 = self.crearBotonP4(7)
        boton8 = self.crearBotonP4(8)
        boton9 = self.crearBotonP4(9)
        boton0 = self.crearBotonP4(0)
        
        botonQ = self.crearBotonP4('Q')
        botonW = self.crearBotonP4('W')
        botonE = self.crearBotonP4('E')
        botonR = self.crearBotonP4('R')
        botonT = self.crearBotonP4('T')
        botonY = self.crearBotonP4('Y')
        botonU = self.crearBotonP4('U')
        botonI = self.crearBotonP4('I')
        botonO = self.crearBotonP4('O')
        botonP = self.crearBotonP4('P')
        botonA = self.crearBotonP4('A')
        botonS = self.crearBotonP4('S')
        botonD = self.crearBotonP4('D')
        botonF = self.crearBotonP4('F')
        botonG = self.crearBotonP4('G')
        botonH = self.crearBotonP4('H')
        botonJ = self.crearBotonP4('J')
        botonK = self.crearBotonP4('K')
        botonL = self.crearBotonP4('L')
        botonNN= self.crearBotonP4('Ñ')
        botonZ = self.crearBotonP4('Z')
        botonX = self.crearBotonP4('X')
        botonC = self.crearBotonP4('C')
        botonV = self.crearBotonP4('V')
        botonB = self.crearBotonP4('B')
        botonN = self.crearBotonP4('N')
        botonM = self.crearBotonP4('M')
        botondot = self.crearBotonP4('.')
        botonguion = self.crearBotonP4('-')
        botonguionb = self.crearBotonP4(',')
        botonErase = self.crearBotonP4(u"\u232B",escribir=False)
        botonErase['background'] = "red"
        botonErase.grid(row = 3, column = 11)
        botonEnter = self.crearBotonP4(u"\u21B5",escribir=False,alto=2)
        botonEnter['background'] = "green"
        botonEnter.grid(row = 1, column = 11, rowspan = 2, sticky = 's')
        botonSpace = Button(self.page4, text=u"\u2423", width=5, height=1, font=("Helvetica",15), command=lambda:self.clickP4(' ',True))
        botonSpace.grid(row = 4, column = 11)
        
        #Ubicación de los botones
        botones= [boton1, boton2, boton3, boton4, boton5, boton6, boton7, boton8, boton9, boton0,
                  botonQ, botonW, botonE, botonR, botonT, botonY, botonU, botonI, botonO, botonP, 
                  botonA, botonS, botonD, botonF, botonG, botonH, botonJ, botonK, botonL, botonNN, 
                  botonZ, botonX, botonC, botonV, botonB, botonN, botonM, botondot, botonguion, botonguionb]
        contador=0
        for fila in range(1,5):
            for columna in range(10):
                botones[contador].grid(row=fila,column=columna)
                contador+=1
        
        self.ChkSe = IntVar()
        self.RBCliente = Radiobutton(self.page4, text = 'Cliente',font =('Helvetica', 15), variable = self.ChkSe, value = 1)
        self.RBCliente.grid(row = 5, column = 2, columnspan = 2, sticky = 'w')
        
        self.RBProducto = Radiobutton(self.page4, text = 'Producto',font =('Helvetica', 15), variable = self.ChkSe, value = 2)
        self.RBProducto.grid(row = 5, column = 4, columnspan = 2, sticky = 'w')
        
        self.RBBuscar = Radiobutton(self.page4, text = 'Buscar por pedido',font =('Helvetica', 15), variable = self.ChkSe, value = 3)
        self.RBBuscar.grid(row = 5, column = 6, columnspan = 3, sticky = 'w')
        
        self.CBdata2 = Text(self.page4, state="disabled", width=40, height=1, font=("Helvetica",15))
        self.CBdata2.grid(row = 6, column = 0, columnspan = 12)
                
        self.clienteL = TTK.Label(self.page4, font =('Helvetica', 15), text = 'Cliente:')
        self.clienteL.grid(row = 7, column = 0, columnspan = 11, sticky = 'w')
        
        self.ProductoL = TTK.Label(self.page4, font =('Helvetica', 15), text = 'Producto:')
        self.ProductoL.grid(row = 8, column = 0, columnspan = 11, sticky = 'w')
        
        # AGREGAMOS CONTENIDO A PAGE 5
        Label(self.page5, 
              font =('Helvetica', 15), 
              text = '*                                                                                                                                                *').grid(row = 0,
#              text = '123456789_123456789_123456789_123465789_123456789_123456789_123456789_123456789_12',
              #text = '____________________________').grid(row = 0,
                                                                     column = 0,
                                                                     columnspan = 3)
        Label(self.page5, 
              font =('Helvetica', 15),
              text = '_________________________________________').grid(row = 0,
                                                                     column = 0,)
        
        Label(self.page5, 
              font =('Helvetica', 15),
              text = '_________________________________________').grid(row = 0,
                                                                     column = 1)
#        Label(self.page5, 
#              font =('Helvetica', 15),
#              text = '___________________________').grid(row = 0,
#                                                                     column = 2)
        Label(self.page5, 
              font =('Helvetica', 15), 
              text = 'Verifique los datos ingresado:').grid(row = 0,
                                                                     column = 0,
                                                                     columnspan = 2)
        self.StxtCliente = StringVar(value = '*')
        self.txtCliente = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Cliente:')
        self.txtCliente.grid(row = 1, column = 0, sticky = 'w')
        self.txtClienteL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtCliente)
        self.txtClienteL.place(x = 79, y = 28)
        
        self.StxtProducto = StringVar(value = '*')
        self.txtProducto = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Producto: ')
        self.txtProducto.grid(row = 2, column = 0, columnspan = 2, sticky = "w")
        self.txtProductoL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtProducto)
        self.txtProductoL.place(x = 99, y = 56)
        
        self.StxtLargo = StringVar(value = '*')
        self.txtLargo = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Largo:')
        self.txtLargo.grid(row = 3, column = 0, sticky = "w")
        self.txtLargoL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtLargo)
        self.txtLargoL.place(x= 69, y = 84)
        
        self.StxtAlto = StringVar(value = '*')
        self.txtAlto = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Alto:')
        self.txtAlto.place(x = 310, y = 84)
        self.txtAltoL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtAlto)
        self.txtAltoL.place(x = 363, y = 84)
        
        self.StxtAncho = StringVar(value = '*')
        self.txtAncho = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Ancho: ')
        self.txtAncho.place(x= 590, y = 84)
        self.txtAnchoL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtAncho)
        self.txtAnchoL.place(x= 666, y = 84)
        
        self.StxtStlCj = StringVar(value = '*')
        self.txtStlCj = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Estilo caja:')
        self.txtStlCj.grid(row = 4, column = 0, sticky = "w")
        self.txtStlCjL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtStlCj)
        self.txtStlCjL.place(x= 110, y = 112)
        
        self.StxtTpFlt = StringVar(value = '*')
        self.txtTpFlt = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Tipo de flauta:')
        self.txtTpFlt.grid(row = 4, column = 1, sticky = "w")
        self.txtTpFltL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtTpFlt)
        self.txtTpFltL.place(x= 594, y = 112)
        
        self.StxtDrccnFlt = StringVar(value = '*')
        self.txtDrccnFlt = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Dirección de la flauta: ')
        self.txtDrccnFlt.grid(row = 5, column = 0, sticky = "w")
        self.txtDrccnFltL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtDrccnFlt)
        self.txtDrccnFltL.place(x= 216, y = 140)
        
        self.StxtGrdMtrl = StringVar(value = '*')
        self.txtGrdMtrl = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Grado del material: ')
        self.txtGrdMtrl.grid(row = 5, column = 1, sticky = "w")
        self.txtGrdMtrlL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtGrdMtrl)
        self.txtGrdMtrlL.place(x= 640, y = 140)
        
        
        self.StxtTpUnn = StringVar(value = '*')
        self.txtTpUnn = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Tipo de unión: ')
        self.txtTpUnn.grid(row = 6, column = 0, sticky = "w")
        self.txtTpUnnL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtTpUnn)
        self.txtTpUnnL.place(x= 138, y = 168)
        
        self.StxtMtdCrr = StringVar(value = '*')
        self.txtMtdCrr = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Método de cierre: ')
        self.txtMtdCrr.grid(row = 6, column = 1, sticky = "w")
        self.txtMtdCrrL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtMtdCrr)
        self.txtMtdCrrL.place(x= 623, y = 168)
        
        self.StxtOrntcn = StringVar(value = '*')
        self.txtOrntcn = Label(self.page5, font = ('Helvetica', 15, 'italic'), text = '*Orientación de la prueba: ')
        self.txtOrntcn.grid(row = 7, column = 0, sticky = "w")
        self.txtOrntcnL = Label(self.page5, font = ('Helvetica', 15), textvariable = self.StxtOrntcn)
        self.txtOrntcnL.place(x= 243, y = 197)
        
        cc = Button(self.page5, font = ('Helvetica', 15, "bold"), text = 'Cerrar', bg = "red", command = self.cerrarB)#.place(x = 20, y = 20)
        cc.grid(row = 8, column = 0, columnspan = 2)
        
        # OBTENER LO QUE CONTIENEN CADA LISTA
        self.listCaja.bind("<<ComboboxSelected>>", self.getList)
        self.listCierre.bind("<<ComboboxSelected>>", self.getList)
        self.listFlauta.bind("<<ComboboxSelected>>", self.getList)
        self.listFlautaD.bind("<<ComboboxSelected>>", self.getList)
        self.listGradoM.bind("<<ComboboxSelected>>", self.getList)
        self.listOrientaC.bind("<<ComboboxSelected>>", self.getList)
        self.listUnion.bind("<<ComboboxSelected>>", self.getList)
        
        self.top.protocol("WM_DELETE_WINDOW", self.cerrar)
        
    def motion(self, event):
        self.posy.set(event.y)
        self.posx.set(event.x)
        
    def selectCB(self,selecc):
        if selecc == 'al':
            self.LB['text'] = 'Usted selecciono alto'
            self.cajaLB['image'] = self.IMGalto
            self.bandDATA = 0
        elif selecc == 'an':
            self.LB['text'] = 'Usted selecciono ancho'
            self.cajaLB['image'] = self.IMGancho
            self.bandDATA = 1
        elif selecc == 'la':
            self.LB['text'] = 'Usted selecciono largo'
            self.cajaLB['image'] = self.IMGlargo
            self.bandDATA = 2
        
    def crearBoton(self, valor, escribir=True, ancho=5, alto=1):
        return Button(self.page1, text=valor, width=ancho, height=alto, font=("Helvetica",15), command=lambda:self.click(valor,escribir))
        
    def crearBotonP4(self, valor, escribir=True, ancho=5, alto=1):
        return Button(self.page4, text=valor, width=ancho, height=alto, font=("Helvetica",15), command=lambda:self.clickP4(valor,escribir))
        
    def conteo(self):
        self.botonClics += 1
        self.btnCLK['text'] = 'Clics totales = ' + str(self.botonClics)
        
        
    def click(self, texto, escribir):
        if not escribir:
            if texto==u"\u21B5" and self.operacion!="" and self.bandDATA != 3:
                if self.bandDATA == 0:
                    try:
                        self.alturaDATA = float(self.operacion)
                        self.LB['text'] = 'Usted ingreso ' + str(self.alturaDATA) + 'cm en altura'
                        self.altoL['text'] = str(self.alturaDATA) + 'cm'
                        self.StxtAlto.set(str(self.alturaDATA) + 'cm')
                        self.changeTXT(self.StxtAlto, str(self.alturaDATA) + 'cm', self.txtAlto, 'Alto:')
                    except ValueError:
                        self.LB['text'] = 'Atención \n El dato ingresado no es un número válido,\n favor de verificar'
                        
                elif self.bandDATA == 1:
                    try:
                        self.anchoDATA = float(self.operacion)
                        self.LB['text'] = 'Usted ingreso ' + str(self.anchoDATA) + 'cm en ancho'
                        self.changeTXT(self.StxtAncho, str(self.anchoDATA) + 'cm', self.txtAncho, 'Ancho:')
                        self.anchoL['text'] = str(self.anchoDATA) + 'cm'
                    except ValueError:
                        self.LB['text'] = 'Atención \n El dato ingresado no es un número válido,\n favor de verificar'
                elif self.bandDATA == 2:
                    try:
                        self.largoDATA = float(self.operacion)
                        self.LB['text'] = 'Usted ingreso ' + str(self.largoDATA ) + 'cm en largo'
                        self.changeTXT(self.StxtLargo, str(self.largoDATA ) + 'cm', self.txtLargo, 'Largo:')
                        self.largoL['text'] = str(self.largoDATA ) + 'cm'
                    except ValueError:
                        self.LB['text'] = 'Atención \n El dato ingresado no es un número válido,\n favor de verificar'
                print 'Hola desde borrar'
                self.operacion = ''
                self.limpiarPantalla()
            elif texto==u"\u232B":
                self.operacion=""
                self.limpiarPantalla()
        #Mostrar texto
        else:
            self.operacion+=str(texto)
            self.mostrarEnPantalla(texto)
        return
    
    def clickP4(self, texto, escribir):
        self.ChkSel = int(self.ChkSe.get())
        print self.ChkSel
        if not escribir:
            if texto==u"\u21B5" and self.operacion!="" and self.ChkSel != 0:
                print 'gg'
                if self.ChkSel == 1:
                    self.cliente = self.operacion
                    self.clienteL['text'] = 'Cliente: ' + str(self.cliente)
                    self.changeTXT(self.StxtCliente, str(self.cliente), self.txtCliente, 'Cliente:')
                elif self.ChkSel == 2:
                    self.Producto = self.operacion
                    self.ProductoL['text'] = 'Producto: ' + str(self.Producto)
                    self.changeTXT(self.StxtProducto, str(self.Producto), self.txtProducto, 'Producto:')
                elif self.ChkSel == 3:
                    self.top.iconify()
                    self.consoleSQL.consulta('pedido', str(self.operacion))
                    try:
                        self.cliente = self.consoleSQL.cliente
                        self.clienteL['text'] = 'Cliente: ' + str(self.cliente)
                        self.changeTXT(self.StxtCliente, str(self.cliente), self.txtCliente, 'Cliente:')
                        self.Producto = self.consoleSQL.producto
                        self.ProductoL['text'] = 'Producto: ' + str(self.Producto)
                        self.changeTXT(self.StxtProducto, str(self.Producto), self.txtProducto, 'Producto:')
                    except:
                        tkMessageBox.showerror('Atención','No se encontró el pedido favor de verificar')
                self.operacion = ''
                self.limpiarPantalla(2)
            elif texto==u"\u232B":
                self.operacion=""
                self.limpiarPantalla(2)
            elif self.ChkSel == 0:
                self.top.iconify()
                tkMessageBox.showerror("Atención", 'Debe seleccionar una opción')
        #Mostrar texto
        else:
            self.operacion+=str(texto)
            self.mostrarEnPantalla(texto, 2)
        self.top.deiconify()
        return
    
    def changeTXT(self, StringVarTXT, setStr, LabelTXT, txtLabel):
        StringVarTXT.set(setStr)
        LabelTXT['text'] = txtLabel
        LabelTXT['font'] = ('Helvetica', 15, "bold")
        
    def limpiarPantalla(self, cb = 1):
        if cb ==2:
            self.CBdata2.configure(state="normal")
            self.CBdata2.delete("1.0", END)
            self.CBdata2.configure(state="disabled")
        else:
            self.CBdata.configure(state="normal")
            self.CBdata.delete("1.0", END)
            self.CBdata.configure(state="disabled")
        return
    

    def mostrarEnPantalla(self, valor, cb = 1):
        if cb == 2:
            self.CBdata2.configure(state="normal")
            self.CBdata2.insert(END, valor)
            self.CBdata2.configure(state="disabled")
        else:
            self.CBdata.configure(state="normal")
            self.CBdata.insert(END, valor)
            self.CBdata.configure(state="disabled")
        return
    
    def getList(self, event):
        self.CheckList(self.listCaja, 0, self.StxtStlCj, 'Estilo caja: ', self.txtStlCj)
        self.CheckList(self.listFlauta, 1, self.StxtTpFlt, 'Tipo de flauta: ', self.txtTpFlt)
        self.CheckList(self.listFlautaD, 2, self.StxtDrccnFlt, 'Dirección de  la flauta: ', self.txtDrccnFlt)
        self.CheckList(self.listGradoM, 3, self.StxtGrdMtrl, 'Grado del material: ', self.txtGrdMtrl)
        self.CheckList(self.listUnion, 4, self.StxtTpUnn, 'Tipo de unión: ', self.txtTpUnn)
        self.CheckList(self.listCierre, 5, self.StxtMtdCrr, 'Método de cierre: ', self.txtMtdCrr)
        self.CheckList(self.listOrientaC, 6, self.StxtOrntcn, 'Orientación de la prueba: ', self.txtOrntcn)
        #hola
        
    def CheckList(self, lista, num_list, StrVarL, txt, labelTXT,):
        gg = lista.get()
        print gg
        if gg != '':
            self.Datos[num_list] = lista.get()
            if num_list == 0:
                if self.Datos[0] == (u'Caja est\xe1ndar'):
                    self.Datos[0] = str('Caja estándar')
            elif num_list == 4:
                if self.Datos[4] == (u'Armado autom\xe1tico'):
                    self.Datos[4] = ('Armado automático')
            StrVarL.set(self.Datos[num_list])
            labelTXT['text'] = txt
            labelTXT['font'] = ('Helvetica', 15, "bold")
            
        
    def cerrar(self):
        self.top.iconify()
        tkMessageBox.showinfo("Atención", "Si desea salir, debe hacerlo desde el botón ubicado en la pestaña de Resumen de datos.")
        self.top.deiconify()
        
    def cerrarB(self):
        self.top.iconify()
        respuesta=tkMessageBox.askyesno("Atención", "Usted esta a punto de salir, ¿Los datos ingresados son los correctos?")
        if respuesta==True:
            self.top.destroy()
        try:
            self.top.deiconify()
        except:
            print "Ventana cerrada"
            
#ventana = Tk()
#final = DATAin(ventana)
#ventana.mainloop()
Exemple #41
0
    def __init__(self, parent, parenttab, name, section, paramprefix):
        EditInput.__init__(self, parent, parenttab, name)
        self._section = section
        self._paramprefix = paramprefix

        fontlist = list(tkFont.families())
        fontlist.sort()
        self._bvb = tki.BooleanVar()
        self._bvi = tki.BooleanVar()
        self._bvs = tki.BooleanVar()
        self._bvu = tki.BooleanVar()

        l = tki.Label(self, text=lang[lng.txtFontsize])
        l.grid(row=0, column=0, padx=5, pady=2, sticky=tki.W)

        tcmd = (self.register(self._ehOnValidateEntry), '%d', '%P')
        e = tki.Entry(self,
                      validate='key',
                      validatecommand=tcmd,
                      width=_sizechars)
        self._esize = e
        e.grid(row=1, column=0, padx=5, pady=2, sticky=tki.W)

        l = tki.Label(self, text=lang[lng.txtFontName])
        l.grid(row=2, column=0, padx=5, pady=2, sticky=tki.W)

        cb = Combobox(self, values=fontlist)
        self._cbfontname = cb
        cb.grid(row=3, column=0, padx=5, pady=2, sticky=tki.W)
        cb.bind('<<ComboboxSelected>>', self._setDirty)
        cb.current(0)

        cb = tki.Checkbutton(self,
                             text=lang[lng.txtBold],
                             onvalue=True,
                             offvalue=False,
                             variable=self._bvb,
                             command=self._setDirty)
        self._cbb = cb
        cb.grid(row=0, column=1, padx=5, pady=2, sticky=tki.W)

        cb = tki.Checkbutton(self,
                             text=lang[lng.txtItalics],
                             onvalue=True,
                             offvalue=False,
                             variable=self._bvi,
                             command=self._setDirty)
        self._cbi = cb
        cb.grid(row=1, column=1, padx=5, pady=2, sticky=tki.W)

        cb = tki.Checkbutton(self,
                             text=lang[lng.txtStrikethrough],
                             onvalue=True,
                             offvalue=False,
                             variable=self._bvs,
                             command=self._setDirty)
        self._cbs = cb
        cb.grid(row=2, column=1, padx=5, pady=2, sticky=tki.W)

        cb = tki.Checkbutton(self,
                             text=lang[lng.txtUnderline],
                             onvalue=True,
                             offvalue=False,
                             variable=self._bvu,
                             command=self._setDirty)
        self._cbu = cb
        cb.grid(row=3, column=1, padx=5, pady=2, sticky=tki.W)