Esempio n. 1
0
    def draw(self):
        """
        Canvas is drawn called by pan(), zoom()
        :return:
        """
        NavigationToolbar2.draw(self)

        self._myParent.evt_view_updated()

        return
Esempio n. 2
0
    def draw(self):
        """
        Canvas is drawn called by pan(), zoom()
        :return:
        """
        NavigationToolbar2.draw(self)

        self._myParent.evt_view_updated()

        return
Esempio n. 3
0
class Ui_Form(QtGui.QWidget):

    def __init__(self):
        # Declaración de elementos
        QtGui.QWidget.__init__(self)
        self.vinosDB = VinosDBL()
        self.figure = Figure()
        # ==============
        # Activación Elementos
        self.setupUi(self)
        self.databaseConnect()
        # ==============
        # Inicializando Modelos
        self.model_read = ListModel([])
        self.model_save = ListModel([])
        self.initModels()
        self.setAction()

# ===========================================
#              Ui_Form QtDesigner
# ===========================================

    def setupUi(self, ReadSaveData):
        ReadSaveData.setObjectName(_fromUtf8("ReadSaveData"))
        ReadSaveData.resize(692, 378)
        ReadSaveData.setMinimumSize(QtCore.QSize(550, 350))
        self.horizontalLayout_2 = QtGui.QHBoxLayout(ReadSaveData)
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.Tabs = QtGui.QTabWidget(ReadSaveData)
        self.Tabs.setMinimumSize(QtCore.QSize(450, 300))
        self.Tabs.setObjectName(_fromUtf8("Tabs"))
        self.Adquirir = QtGui.QWidget()
        self.Adquirir.setMinimumSize(QtCore.QSize(400, 300))
        self.Adquirir.setObjectName(_fromUtf8("Adquirir"))
        self.verticalLayout_5 = QtGui.QVBoxLayout(self.Adquirir)
        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
        self.verticalLayout_2 = QtGui.QVBoxLayout()
        self.verticalLayout_2.setSpacing(8)
        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setSpacing(8)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.verticalLayout_4 = QtGui.QVBoxLayout()
        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
        self.horizontalLayout_4 = QtGui.QHBoxLayout()
        self.horizontalLayout_4.setSpacing(8)
        self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
        self.label_estanque = QtGui.QLabel(self.Adquirir)
        self.label_estanque.setMinimumSize(QtCore.QSize(90, 30))
        self.label_estanque.setMaximumSize(QtCore.QSize(90, 30))
        self.label_estanque.setAlignment(QtCore.Qt.AlignCenter)
        self.label_estanque.setObjectName(_fromUtf8("label_estanque"))
        self.horizontalLayout_4.addWidget(self.label_estanque)
        self.linedit_estanquein = QtGui.QLineEdit(self.Adquirir)
        self.linedit_estanquein.setMinimumSize(QtCore.QSize(150, 30))
        self.linedit_estanquein.setMaximumSize(QtCore.QSize(350, 30))
        self.linedit_estanquein.setObjectName(_fromUtf8("linedit_estanquein"))
        self.horizontalLayout_4.addWidget(self.linedit_estanquein)
        self.verticalLayout_4.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_6 = QtGui.QHBoxLayout()
        self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6"))
        self.label = QtGui.QLabel(self.Adquirir)
        self.label.setMinimumSize(QtCore.QSize(90, 30))
        self.label.setMaximumSize(QtCore.QSize(90, 30))
        self.label.setText(_fromUtf8(""))
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout_6.addWidget(self.label)
        self.boton_estado = QtGui.QPushButton(self.Adquirir)
        self.boton_estado.setMinimumSize(QtCore.QSize(150, 30))
        self.boton_estado.setMaximumSize(QtCore.QSize(350, 30))
        self.boton_estado.setObjectName(_fromUtf8("boton_estado"))
        self.horizontalLayout_6.addWidget(self.boton_estado)
        self.verticalLayout_4.addLayout(self.horizontalLayout_6)
        self.horizontalLayout.addLayout(self.verticalLayout_4)
        self.verticalLayout_3 = QtGui.QVBoxLayout()
        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
        self.display_estanques = QtGui.QTextBrowser(self.Adquirir)
        self.display_estanques.setMinimumSize(QtCore.QSize(195, 90))
        self.display_estanques.setMaximumSize(QtCore.QSize(250, 150))
        self.display_estanques.setObjectName(_fromUtf8("display_estanques"))
        self.verticalLayout_3.addWidget(self.display_estanques)
        self.horizontalLayout.addLayout(self.verticalLayout_3)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        self.verticalLayout_5.addLayout(self.verticalLayout_2)
        self.verticalLayout_8 = QtGui.QVBoxLayout()
        self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8"))
        self.horizontalLayout_8 = QtGui.QHBoxLayout()
        self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8"))
        self.groupBox = QtGui.QGroupBox(self.Adquirir)
        self.groupBox.setMinimumSize(QtCore.QSize(100, 200))
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.verticalLayout_13 = QtGui.QVBoxLayout(self.groupBox)
        self.verticalLayout_13.setObjectName(_fromUtf8("verticalLayout_13"))
        self.verticalLayout_7 = QtGui.QVBoxLayout()
        self.verticalLayout_7.setSpacing(8)
        self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7"))
        self.verticalLayout_9 = QtGui.QVBoxLayout()
        self.verticalLayout_9.setSpacing(8)
        self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9"))
        self.listview_read = QtGui.QListView(self.groupBox)
        self.listview_read.setMinimumSize(QtCore.QSize(220, 70))
        self.listview_read.setMaximumSize(QtCore.QSize(1500, 150))
        self.listview_read.setObjectName(_fromUtf8("listview_read"))
        self.verticalLayout_9.addWidget(self.listview_read, QtCore.Qt.AlignHCenter)
        self.verticalLayout_7.addLayout(self.verticalLayout_9)
        self.horizontalLayout_7 = QtGui.QHBoxLayout()
        self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7"))
        self.verticalLayout_14 = QtGui.QVBoxLayout()
        self.verticalLayout_14.setObjectName(_fromUtf8("verticalLayout_14"))
        self.boton_load = QtGui.QPushButton(self.groupBox)
        self.boton_load.setMinimumSize(QtCore.QSize(95, 60))
        self.boton_load.setMaximumSize(QtCore.QSize(95, 70))
        self.boton_load.setObjectName(_fromUtf8("boton_load"))
        self.verticalLayout_14.addWidget(self.boton_load, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.horizontalLayout_7.addLayout(self.verticalLayout_14)
        self.verticalLayout_12 = QtGui.QVBoxLayout()
        self.verticalLayout_12.setObjectName(_fromUtf8("verticalLayout_12"))
        self.boton_clearall = QtGui.QPushButton(self.groupBox)
        self.boton_clearall.setMinimumSize(QtCore.QSize(95, 25))
        self.boton_clearall.setMaximumSize(QtCore.QSize(140, 30))
        self.boton_clearall.setObjectName(_fromUtf8("boton_clearall"))
        self.verticalLayout_12.addWidget(self.boton_clearall, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.boton_clearselect = QtGui.QPushButton(self.groupBox)
        self.boton_clearselect.setMinimumSize(QtCore.QSize(95, 25))
        self.boton_clearselect.setMaximumSize(QtCore.QSize(140, 30))
        self.boton_clearselect.setObjectName(_fromUtf8("boton_clearselect"))
        self.verticalLayout_12.addWidget(self.boton_clearselect, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.horizontalLayout_7.addLayout(self.verticalLayout_12)
        self.verticalLayout_7.addLayout(self.horizontalLayout_7)
        self.verticalLayout_13.addLayout(self.verticalLayout_7)
        self.horizontalLayout_8.addWidget(self.groupBox, QtCore.Qt.AlignHCenter)
        self.groupBox_2 = QtGui.QGroupBox(self.Adquirir)
        self.groupBox_2.setMinimumSize(QtCore.QSize(100, 200))
        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
        self.verticalLayout_17 = QtGui.QVBoxLayout(self.groupBox_2)
        self.verticalLayout_17.setObjectName(_fromUtf8("verticalLayout_17"))
        self.verticalLayout_10 = QtGui.QVBoxLayout()
        self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10"))
        self.verticalLayout_15 = QtGui.QVBoxLayout()
        self.verticalLayout_15.setObjectName(_fromUtf8("verticalLayout_15"))
        self.listview_save = QtGui.QListView(self.groupBox_2)
        self.listview_save.setMinimumSize(QtCore.QSize(220, 70))
        self.listview_save.setMaximumSize(QtCore.QSize(1500, 150))
        self.listview_save.setObjectName(_fromUtf8("listview_save"))
        self.verticalLayout_15.addWidget(self.listview_save)
        self.verticalLayout_10.addLayout(self.verticalLayout_15)
        self.horizontalLayout_9 = QtGui.QHBoxLayout()
        self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9"))
        self.verticalLayout_20 = QtGui.QVBoxLayout()
        self.verticalLayout_20.setObjectName(_fromUtf8("verticalLayout_20"))
        self.boton_selecttosave = QtGui.QPushButton(self.groupBox_2)
        self.boton_selecttosave.setMinimumSize(QtCore.QSize(95, 25))
        self.boton_selecttosave.setMaximumSize(QtCore.QSize(140, 30))
        self.boton_selecttosave.setObjectName(_fromUtf8("boton_selecttosave"))
        self.verticalLayout_20.addWidget(self.boton_selecttosave, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.boton_clearsave = QtGui.QPushButton(self.groupBox_2)
        self.boton_clearsave.setMinimumSize(QtCore.QSize(95, 25))
        self.boton_clearsave.setMaximumSize(QtCore.QSize(140, 30))
        self.boton_clearsave.setObjectName(_fromUtf8("boton_clearsave"))
        self.verticalLayout_20.addWidget(self.boton_clearsave, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
        self.horizontalLayout_9.addLayout(self.verticalLayout_20)
        self.verticalLayout_16 = QtGui.QVBoxLayout()
        self.verticalLayout_16.setObjectName(_fromUtf8("verticalLayout_16"))
        self.boton_save = QtGui.QPushButton(self.groupBox_2)
        self.boton_save.setMinimumSize(QtCore.QSize(95, 60))
        self.boton_save.setMaximumSize(QtCore.QSize(95, 70))
        self.boton_save.setObjectName(_fromUtf8("boton_save"))
        self.verticalLayout_16.addWidget(self.boton_save, QtCore.Qt.AlignHCenter)
        self.horizontalLayout_9.addLayout(self.verticalLayout_16)
        self.verticalLayout_10.addLayout(self.horizontalLayout_9)
        self.verticalLayout_17.addLayout(self.verticalLayout_10)
        self.horizontalLayout_8.addWidget(self.groupBox_2, QtCore.Qt.AlignHCenter)
        self.verticalLayout_8.addLayout(self.horizontalLayout_8)
        self.verticalLayout_5.addLayout(self.verticalLayout_8)
        self.Tabs.addTab(self.Adquirir, _fromUtf8(""))
        self.Visualizar = QtGui.QWidget()
        self.Visualizar.setMinimumSize(QtCore.QSize(400, 300))
        self.Visualizar.setObjectName(_fromUtf8("Visualizar"))
        self.verticalLayout = QtGui.QVBoxLayout(self.Visualizar)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.verticalLayout_6 = QtGui.QVBoxLayout()
        self.verticalLayout_6.setSpacing(8)
        self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6"))
        self.horizontalLayout_5 = QtGui.QHBoxLayout()
        self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
        self.label_comboboxplot = QtGui.QLabel(self.Visualizar)
        self.label_comboboxplot.setMinimumSize(QtCore.QSize(120, 25))
        self.label_comboboxplot.setMaximumSize(QtCore.QSize(100, 25))
        self.label_comboboxplot.setObjectName(_fromUtf8("label_comboboxplot"))
        self.horizontalLayout_5.addWidget(self.label_comboboxplot)
        self.combobox_plot = QtGui.QComboBox(self.Visualizar)
        self.combobox_plot.setMinimumSize(QtCore.QSize(340, 25))
        self.combobox_plot.setMaximumSize(QtCore.QSize(1000, 25))
        self.combobox_plot.setObjectName(_fromUtf8("combobox_plot"))
        self.horizontalLayout_5.addWidget(self.combobox_plot)
        self.verticalLayout_6.addLayout(self.horizontalLayout_5)
        self.verticalLayout.addLayout(self.verticalLayout_6)
        self.verticalLayout_18 = QtGui.QVBoxLayout()
        self.verticalLayout_18.setObjectName(_fromUtf8("verticalLayout_18"))
        self.verticalLayout_19 = QtGui.QVBoxLayout()
        self.verticalLayout_19.setObjectName(_fromUtf8("verticalLayout_19"))
        self.label_3 = QtGui.QLabel(self.Visualizar)
        self.label_3.setMinimumSize(QtCore.QSize(250, 25))
        self.label_3.setMaximumSize(QtCore.QSize(400, 25))
        self.label_3.setObjectName(_fromUtf8("label_3"))

        # ======================================================
        #  Se modifica el archivo diseñado en QtDesigner para
        #  incluir clase figure para graficar espectros
        # ======================================================

        self.verticalLayout_19.addWidget(self.label_3)
        self.graphic = FigureCanvas(self.figure)
        self.graphics_view = NavigationToolbar(self.graphic, self)
        self.graphics_view.setMinimumSize(QtCore.QSize(450, 24))
        self.graphics_view.setObjectName(_fromUtf8("graphics_view"))
        self.verticalLayout_19.addWidget(self.graphics_view)
        self.verticalLayout_19.addWidget(self.graphic)

        # ======================================================

        self.verticalLayout_18.addLayout(self.verticalLayout_19)
        self.verticalLayout.addLayout(self.verticalLayout_18)
        self.Tabs.addTab(self.Visualizar, _fromUtf8(""))
        self.horizontalLayout_2.addWidget(self.Tabs)

        self.retranslateUi(ReadSaveData)
        self.Tabs.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(ReadSaveData)

    def retranslateUi(self, ReadSaveData):
        ReadSaveData.setWindowTitle(_translate("ReadSaveData", "Adquisición y Visualización Espectros", None))
        self.label_estanque.setText(_translate("ReadSaveData", "  N° Estanque \n"
                                                               " a Analizar", None))
        self.boton_estado.setText(_translate("ReadSaveData", "Verificar", None))
        self.groupBox.setTitle(_translate("ReadSaveData", "Espectrómetro", None))
        self.boton_load.setText(_translate("ReadSaveData", "Adquirir", None))
        self.boton_clearall.setText(_translate("ReadSaveData", "Clear All", None))
        self.boton_clearselect.setText(_translate("ReadSaveData", "Clear Select", None))
        self.groupBox_2.setTitle(_translate("ReadSaveData", "Base de Datos", None))
        self.boton_selecttosave.setText(_translate("ReadSaveData", "Seleccionar", None))
        self.boton_clearsave.setText(_translate("ReadSaveData", "Clear Select", None))
        self.boton_save.setText(_translate("ReadSaveData", "Guardar a\n"
                                                           " Base de Datos", None))
        self.Tabs.setTabText(self.Tabs.indexOf(self.Adquirir), _translate("ReadSaveData", "Adquirir", None))
        self.label_comboboxplot.setText(_translate("ReadSaveData", "Espectros Adquiridos", None))
        self.label_3.setText(_translate("ReadSaveData", "TextLabel", None))
        self.Tabs.setTabText(self.Tabs.indexOf(self.Visualizar), _translate("ReadSaveData", "Visualizar", None))

    # ===========================================
    #          Metodos para clase Ui_Form
    # ===========================================

    def initModels(self):
        """
        Función que inicializa los modelos utilizados para  la lectura,
        escritura y visualización de espectros.
        """
        self.listview_read.setModel(self.model_read)
        self.combobox_plot.setModel(self.model_read)
        self.listview_save.setModel(self.model_save)

    def databaseConnect(self):
        """
        Función que realiza las configuraciones necesarias para la conexión
        a la base de datos de forma local o al servidor habilitado mediante
        túnel SSH.
        """
        # ssh hace el túnel hacia el servidor donde
        # esta instalada la base de datos
        sshConf = {
            u'sshHost': u'200.1.17.223',
            u'sshPort': 22,
            u'sshUser': u'spartan',
            u'sshPass': u'1Q2w3e4r5t6y7u8i9o0p',
            u'localHost': u'127.0.0.1',
            u'localPort': 3037
        }
        # el servidor corre una base de datos local
        # con al siguiente configuración
        dbConf = {
            u'dbHost': u'127.0.0.1',
            u'dbPort': 3306,
            u'dbUser': u'root',
            u'dbPass': u'1Q2w3e4r5t6y7u8i9o0p',
            u'dbName': u'vinosdb'
        }
        self.vinosDB.connect(dbConf=dbConf, sshConf=sshConf)
        print u'Conectado a Base de Datos:', self.vinosDB.conn.is_connected()

    def setAction(self):
        """
        Función que asocia cada evento en la interfaz con una acción
        determinada.
        """
        self.boton_estado.clicked.connect(lambda: self.boton_estadoHandler(tankName=self.linedit_estanquein.text()))
        self.boton_load.clicked.connect(lambda: self.boton_loadHandler())
        self.boton_clearall.clicked.connect(lambda: self.boton_clearallHandler())
        self.boton_clearselect.clicked.connect(lambda: self.boton_clearselectHandler())
        self.listview_read.selectionModel().selectionChanged.connect(lambda: self.listread2comboboxplot())
        self.combobox_plot.activated.connect(lambda: self.combobox_plotHandler())
        self.combobox_plot.activated.connect(lambda: self.plotEspectro())
        self.Tabs.currentChanged.connect(lambda: self.plotEspectro())
        self.boton_selecttosave.clicked.connect(lambda: self.boton_selecttosaveHandler())
        self.boton_clearsave.clicked.connect(lambda: self.boton_clearsaveHandler())
        self.boton_save.clicked.connect(lambda: self.boton_saveHandler())

    def resizeEvent(self, event):
        """
        Funcion que reajusta el tamaño del gráfico al cambiar el
        tamalo de la interfaz
        :param event:
        """
        if self.figure.get_axes():
            self.figure.tight_layout()

    def boton_estadoHandler(self, tankName):
        """
        Función que asocia una acción al oprimir el botón "boton_estado" (en GUI
        botón "Verificar", Pestaña Adquirir). La acción es verificar si el número
        de estanque ingresado existe en la tabla "estanques" de la base de datos.
        :param tankName: Str.
        """
        if not tankName:
            data = u'*** ERROR: No ha ingresado número de estanque ***'
            flag = 1
            self.display_row1(data, tankName, flag)
        else:
            flag = 0
            tankName = int(tankName)
            data = self.vinosDB.read_estanque(tankName)
            self.display_row1(data, tankName, flag)

    def display_row1(self, data, tankName, flag):
        """
        Función que despliega información asociada al número de estanque del
        parámetro "tankName", en objeto "display_estanques" (Pestaña Adquirir).
        Específicamente la información contenida en la tabla "estanques" de la
        base de datos (nombre, tipo vino, año y descripción).
        :param data: Tuple
        :param tankName: Str
        :param flag: Bool
        """
        self.display_estanques.clear()
        if flag == False:
            if not data:
                error = u'*** ERROR: Estanque N° %d No Existe***' % tankName
                self.display_estanques.append(u' %s' % error)
            else:
                num = data[0][0]
                desc = data[0][1].split(u', ')
                self.display_estanques.append(u' Estanque número: %s \t ' % num)
                for i in range(len(desc)):
                    self.display_estanques.append(u' %s' % desc[i])
        else:
            self.display_estanques.append(u' %s' % data)

    def boton_loadHandler(self):
        """
        Función que asocia una acción al oprimir el botón "boton_load" (en GUI
        botón "Adquirir", Pestaña Adquirir). La acción es cargar un espectro del
        directorio especificado y lo almacena en directorio temporal creado, en
        espera de visualización en gráfico o escritura a base de datos. También
        incluye el nombre del archivo cargado al modelo "model_read" para administrar
        los archivos a guardar o visualizar.
        """
        ts = unicode(datetime.datetime.now().strftime("- %Y-%m-%d %H-%M-%S"))
        path_read = "../data/Espectros_vino_21-03-2018/*.txt"
        # path_read = "../data/Espectros Vinos/*.txt"
        path_temp = "../data/Temporal_Load"
        if not os.path.isdir(path_temp):
            os.mkdir(path_temp)
        files = glob.glob(path_read)
        temp = files[randint(1, len(files) - 1)]
        name = unicode(os.path.splitext(os.path.basename(temp))[0])
        shutil.copy2(temp, path_temp)
        dst_name = 'Espectro'+' '+name+' '+ts+'.txt'
        os.rename(path_temp+'/'+name+'.txt', path_temp+'/'+dst_name)
        self.model_read.addNewValue(dst_name)
        self.model_read.reset()
        self.listview_read.setCurrentIndex(self.model_read.index(0))

    def boton_clearselectHandler(self):
        """
        Función que asocia una acción al oprimir el botón "boton_clearselect" (en GUI
        botón "Clear Select", Pestaña Adquirir). Elimina el archivo seleccionado en
        la lista "listview_read" del directorio temporal y del modelo "model_read".
        Luego de eliminar el archivo se actualiza el modelo "model_read" y la lista
        "listview_read".
        """
        path_temp = "../data/Temporal_Load/"
        itemIndex = self.listview_read.currentIndex().row()
        itemTotal = self.model_read.rowCount(None)
        if itemTotal is not 0 and itemIndex is not -1:
            item = self.model_read.consultData(itemIndex)
            if item not in self.model_save.model_list:
                name = self.model_read.consultData(itemIndex)
                os.remove(path_temp + name)
                self.model_read.removeRows(self.listview_read.currentIndex().row(), 1, QtCore.QModelIndex())
                self.model_read.reset()
                if itemIndex > 0:
                    self.listview_read.setCurrentIndex(self.model_read.index(itemIndex-1))
                else:
                    self.listview_read.setCurrentIndex(self.model_read.index(0))
            else:
                print u'El item a eliminar ha sido seleccionado para guardar'
        else:
            print u'No item selected/available!'

    def boton_clearallHandler(self):
        """
        Función que asocia una acción al oprimir el botón "boton_clearall" (en GUI
        botón "Clear All", Pestaña Adquirir). Elimina todos los archivos del directorio
        temporal, de la lista "listview_read" y del modelo "model_read". Luego de eliminar
        los archivos se actualiza el modelo "model_read" y la lista "listview_read".
        """
        path_temp = "../data/Temporal_Load/"
        aux_list = []
        for item in self.model_read.model_list:
            if item not in self.model_save.model_list:
                itemIndex = self.model_read.model_list.index(item)
                name = self.model_read.consultData(itemIndex)
                os.remove(path_temp + name)
            else:
                aux_list.append(item)
        self.model_read.model_list = aux_list
        self.model_read.model_list.sort()
        self.model_save.model_list.sort()
        self.model_read.reset()
        self.model_save.reset()

    def combobox_plotHandler(self):
        """
        Función que actualiza los índices correspondientes al modelo para ser
        visualizados en el gráfico (Pestaña Visualizar), según lo que se encuentra
        seleccionado en el combobox "combobox_plot" (Pestaña Visualizar).
        """
        itemIndex = self.combobox_plot.currentIndex()
        itemTotal = self.model_read.rowCount(None)
        if itemTotal is not 0 and itemIndex is not -1:
            if itemIndex > 0:
                self.listview_read.setCurrentIndex(self.model_read.index(itemIndex))
            else:
                self.listview_read.setCurrentIndex(self.model_read.index(0))
        else:
            print u'No item selected/available!'

    def listread2comboboxplot(self):
        """
        Asigna la seleccion en la lista "listview_read" a la seleccion
        en el combobox "combobox_plot" (Pestaña Visualizar), para visualizar el espectro
        seleccionado en la lista "listview_read" al cambiar de pestaña
        en la aplicación.
        """
        itemIndex = self.listview_read.currentIndex().row()
        self.combobox_plot.setCurrentIndex(itemIndex)

    def plotEspectro(self):
        """
        Funcion que grafica el espectro seleccionado en el combobox
        "combobox_plot" (Pestaña Visualizar). Al cambiar la selección en el combobox, se
        actualiza también el gráfico al espectro seleccionado.
        """
        path_temp = "../data/Temporal_Load/"
        itemTotal = self.model_read.rowCount(self)
        itemIndex = self.combobox_plot.currentIndex()
        if itemTotal is not 0 and itemIndex is not -1:
            name = self.model_read.consultData(itemIndex)
            file = open(path_temp + name, "r")
            datos = list(csv.reader(file, delimiter=','))
            n = len(datos[:])
            y = np.zeros((n-3, 1))
            for i in range(0, n-3):
                y[i] = float(datos[i+3][1])
            ax = self.figure.add_subplot(111)
            ax.clear()
            ax.spines["top"].set_visible(False)
            ax.spines["right"].set_visible(False)
            ax.get_xaxis().tick_bottom()
            ax.get_yaxis().tick_left()
            ax.set_xlabel("Frecuencia [Hz]", fontsize=12)
            ax.set_ylabel("Amplitud", fontsize=12)
            ax.plot(np.flipud(y), color='g')
            ax.axis('tight')
            self.figure.set_facecolor('white')
            self.graphics_view.draw()
            self.figure.tight_layout()

    def boton_selecttosaveHandler(self):
        """
        Función que asocia una acción al oprimir el botón "boton_selecttosave" (en GUI
        botón "Seleccionar", Pestaña Adquirir). Selecciona archivos de la lista "listview_read"
        relacionada al modelo "model_read", para visualizar en lista "listview_save" y guardar
        en modelo "model_save".
        """
        itemTotal = self.model_read.rowCount(self)
        itemIndex = self.listview_read.currentIndex().row()
        if itemTotal is not 0 and itemIndex is not -1:
            name = self.model_read.consultData(itemIndex)
            if not self.model_save.consultItem(name):
                self.model_save.addNewValue(name)
                self.model_save.reset()
                self.listview_save.setCurrentIndex(self.model_save.index(0))
            else:
                print u'Espectro ya fue seleccionado'
        else:
            print u'Item no seleccionado/disponible!'

    def boton_clearsaveHandler(self):
        """
        Función que asocia una acción al oprimir el botón "boton_clearsave" (en GUI
        botón "Clear Select", Pestaña Adquirir). Elimina el archivo seleccionado en
        la lista "listview_save" y del modelo "model_save". Luego de eliminar el archivo
        de la lista se actualiza el modelo "model_save" y la lista "listview_save".
        """
        itemIndex = self.listview_save.currentIndex().row()
        itemTotal = self.model_save.rowCount(None)
        if itemTotal is not 0 and itemIndex is not -1:
            self.model_save.removeRows(self.listview_save.currentIndex().row(), 1, QtCore.QModelIndex())
            self.model_save.reset()
            if itemIndex > 0:
                self.listview_save.setCurrentIndex(self.model_save.index(itemIndex - 1))
            else:
                self.listview_save.setCurrentIndex(self.model_save.index(0))
        else:
            print u'No item selected/available!'

    def boton_saveHandler(self):
        """
        Función que asocia una acción al oprimir el botón "boton_save" (en GUI
        botón "Guardar a Base de Datos", Pestaña Adquirir). La acción es guardar
        el espectro seleccionado en la lista "listview_save" a la base de datos
        y actualizar el modelo "model save" luego de realizada la carga del archivo.
        """
        tankName = self.linedit_estanquein.text()
        if not tankName:
            data = u'*** ERROR: No ha ingresado número de estanque *** \n ' \
                   u'Debe ingresar estanque para almacenar espectro en base de datos!'
            flag = 1
            self.display_row1(data, tankName, flag)
        else:
            tankName = int(tankName)
            path_temp = "../data/Temporal_Load/"
            itemIndex = self.listview_save.currentIndex().row()
            itemTotal = self.model_save.rowCount(None)
            if itemTotal is not 0 and itemIndex is not -1:
                if tankName is not None:
                    data_estanque = self.vinosDB.read_estanque(tankName)
                    id_estanque = data_estanque[0][2]
                    data_vinos = self.vinosDB.read_fechavino(id_estanque)
                    id_vino = data_vinos[0][1]
                    item = self.model_save.model_list[itemIndex]
                    filename = path_temp + item
                    self.vinosDB.new_espectro(filename, id_vino, id_estanque)
                    itemIndexRead = self.model_read.model_list.index(item)
                    self.model_save.removeRows(itemIndex, 1)
                    self.model_read.removeRows(itemIndexRead, 1)
                    os.remove(filename)
            else:
                print u'No ha seleccionado/adquirido espectro para guardar!'

    def closeEvent(self, event):
        """
        Función que asocia una acción al evento de cierre de la aplicación.
        Limpia los archivos almacenados en el directorio temporal, limpia los
        nombres contenidos en los modelos, cierra la conexión a la base de
        datos y cierra la aplicación.
        """
        path_temp = "../data/Temporal_Load/*.txt"
        files = glob.glob(path_temp)
        for file in files:
            os.remove(file)
        self.model_read.removeAllRows()
        self.model_save.removeAllRows()
        self.model_read.reset()
        self.model_save.reset()
        self.vinosDB.close()
        self.close()