Example #1
0
class Window_CadasterItems(QWidget):
    def __init__(self):
        super().__init__()

        self.Layout = QGridLayout(self)

        self.NameItem = QLineEdit(self)  #Linha para Digitar nome do produto
        self.Layout.addWidget(self.NameItem, 1, 0, 1, 2)
        self.NameItem.setPlaceholderText('Nome Item')
        self.NameItem.returnPressed.connect(lambda: self.CodBarra.setFocus())

        self.CodBarra = QLineEdit(self)
        self.Layout.addWidget(self.CodBarra, 2, 0, 1, 2)
        self.CodBarra.setPlaceholderText("Codigo Barra")
        self.CodBarra.returnPressed.connect(
            lambda: self.DateVencimento.setFocus())

        self.DateVencimento = QLabel('Vencimento:',
                                     self)  #Dia que o produto vence
        self.Layout.addWidget(self.DateVencimento, 3, 0, 1, 1)
        self.DateVencimento.setFixedWidth(100)

        self.Date = QDateEdit()
        datetimetext = QDateTime(date.today().year,
                                 date.today().month,
                                 date.today().day, 0, 0)
        self.Date.setDateTime(datetimetext)
        self.Layout.addWidget(self.Date, 3, 1, 1, 1)

        self.CadasterButton = QPushButton('Cadastrar Produto',
                                          self)  #Botao que Cadastra o Produto
        self.Layout.addWidget(self.CadasterButton, 4, 0, 1, 2)
        self.CadasterButton.clicked.connect(self.CadButton_Func)

    def CadButton_Func(
        self
    ):  #Funcao efetuada apos clicar botao de cadastro, faz verificacao depois cadastra Item
        Data = str(self.Date.date().toPyDate())
        if self.NameItem.text() != '' and self.NameItem.text() != ' ':
            Data = f'{Data[8:10]}.{Data[5:7]}.{Data[0:4]}'
            SQDB().InsertItem(self.CodBarra.text(),
                              self.NameItem.text().upper(), Data)
            self.CodBarra.setText('')
            self.NameItem.setText("")
            #Atualizando Tabela!
            Janela.WidgetPrincipal.Lista_ItemsTot.ResetTable()
            Janela.WidgetPrincipal.Lista_Vencidos.ResetTable()
            Janela.WidgetPrincipal.Lista_PertoVencimento.ResetTable()
            Janela.WidgetPrincipal.Informacoes.Atualizar()
        else:
            MSG = QMessageBox()
            MSG.setIcon(QMessageBox.Information)
            MSG.setWindowTitle("Problema!")
            MSG.setText("Preencha todos os campos!")
            MSG.exec_()
Example #2
0
class dateWidget(QWidget):
    def __init__(self, parent):
        super(dateWidget, self).__init__(parent=parent)
        self.start = 0
        self.end = 0
        # --------------------------------------------------------------------
        # Date picker
        self.label_from = QLabel('From', parent)
        self.label_from.setAlignment(Qt.AlignCenter)
        self.label_from.setFont(QFont("Open Sans Bold", 12))
        self.label_from.setStyleSheet("background-color: rgb(134,194,50);"
                                      "color: rgb(255,255,255);")
        self.label_from.resize(100, 20)
        self.label_from.move(20, 60)

        self.d1 = QDateEdit(parent, calendarPopup=True)
        self.d1.setDateTime(QDateTime.currentDateTime())
        self.d1.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.d1.setGeometry(20, 80, 100, 25)
        #self.d1.dateChanged.connect(self.date_change)

        label_to = QLabel('To', parent)
        label_to.setAlignment(Qt.AlignCenter)
        label_to.setFont(QFont("Open Sans Bold", 12))
        label_to.setStyleSheet("background-color: rgb(134,194,50);"
                               "color: rgb(255,255,255);")
        label_to.resize(100, 20)
        label_to.move(140, 60)

        self.d2 = QDateEdit(parent, calendarPopup=True)
        self.d2.setDateTime(QDateTime.currentDateTime())
        self.d2.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.d2.setGeometry(140, 80, 100, 25)

    def date_change(self):

        self.start = self.d1.dateTime().toString('yyyy-MM-dd')
        self.end = self.d2.dateTime().toString('yyyy-MM-dd')
Example #3
0
class EgimDownloaderFrame(QFrame):
    """Frame to download data from EMSODEV servers"""

    # Signals
    msg2Statusbar = pyqtSignal(str)
    wf2plotSplitter = pyqtSignal(WaterFrame)

    class DownloadParameterThread(QThread):
        """
        The process to download data from the API is very slow.
        We are going to use this thread to download data without block the app.
        """
        def __init__(self, downloader):
            QThread.__init__(self)

            self.downloader = downloader

        def __del__(self):
            self.wait()

        def run(self):
            if self.downloader.instrumentList.currentItem().text() \
               == "icListen-1636":
                date = datetime.datetime.strptime(
                    self.downloader.dateList.currentItem().text(),
                    "%Y-%m-%d").strftime("%d/%m/%Y")
                self.downloader.downloadAcoustic(
                    date, self.downloader.hourMinuteList.currentItem().text())
            else:
                parameters = [item.text() for item in
                              self.downloader.parameterList.selectedItems()]
                for parameter in parameters:
                    self.downloader.downloadParameter(parameter)

    def __init__(self):
        super().__init__()

        # Instance variables
        self.downloader = EGIM()
        self.wf = WaterFrame()
        self.metadata = dict()
        self.dates = []
        self.myThread = None
        # Save the login of the EMSODEV API
        self.downloader.login = "******"
        self.downloader.password = ""

        self.initUI()

    def initUI(self):

        # Buttons
        downloadButton = QPushButton("Download", self)
        downloadButton.clicked.connect(self.downloadClick)
        downloadButton.setEnabled(False)
        closeButton = QPushButton("Close", self)
        closeButton.clicked.connect(self.hide)

        # Lists
        self.egimList = QListWidget(self)
        self.egimList.itemClicked.connect(self.loadInstruments)
        self.egimList.setMaximumWidth(200)

        self.instrumentList = QListWidget(self)
        self.instrumentList.itemClicked.connect(self.loadParameters)
        self.instrumentList.setMaximumWidth(290)

        self.metadataList = QListWidget(self)

        self.parameterList = QListWidget(self)
        self.parameterList.setSelectionMode(
            QAbstractItemView.ExtendedSelection)
        self.parameterList.itemClicked.connect(
            lambda: downloadButton.setEnabled(True))

        self.dateList = QListWidget(self)
        self.dateList.itemClicked.connect(self.loadTimes)
        self.dateList.setMaximumWidth(150)
        self.hourMinuteList = QListWidget(self)
        self.hourMinuteList.itemClicked.connect(
            lambda: downloadButton.setEnabled(True))
        self.hourMinuteList.setMaximumWidth(150)

        # Labels
        egimLabel = QLabel("EGIM", self)
        instrumentLabel = QLabel("Instrument", self)
        metadataLabel = QLabel("Metadata", self)
        parameterLabel = QLabel("Parameter", self)
        startDateLabel = QLabel("Start date", self)
        endDateLabel = QLabel("End date", self)
        limitLabel = QLabel("Get last X values", self)
        hourLabel = QLabel("Hour and minute (HHMM)", self)
        dateLabel = QLabel("Available dates", self)

        # Date edit
        self.startDateEdit = QDateEdit(self)
        self.startDateEdit.setCalendarPopup(True)
        self.startDateEdit.setDateTime(QDateTime(QDate(2017, 1, 27),
                                                 QTime(0, 0, 0)))
        self.startDateEdit.setMinimumDateTime(QDateTime(QDate(2017, 1, 27),
                                                        QTime(0, 0, 0)))
        self.endDateEdit = QDateEdit(self)
        self.endDateEdit.setCalendarPopup(True)
        self.endDateEdit.setDateTime(QDateTime(QDate(2017, 1, 27),
                                               QTime(0, 0, 0)))
        self.endDateEdit.setMinimumDateTime(QDateTime(QDate(2017, 1, 27),
                                                      QTime(0, 0, 0)))

        # Spin box
        self.limitSpinBox = QSpinBox(self)
        self.limitSpinBox.setMinimum(0)
        self.limitSpinBox.setMaximum(9999999999)
        self.limitSpinBox.setSingleStep(100)
        self.limitSpinBox.valueChanged.connect(self.enableDate)

        # Custom Widgets

        # Widget for dates of the acoustic data
        self.acousticDateWidget = QWidget(self)
        # - Layout
        vAcousticDate = QVBoxLayout()
        vAcousticDate.addWidget(dateLabel)
        vAcousticDate.addWidget(self.dateList)
        vAcousticDate.addWidget(hourLabel)
        vAcousticDate.addWidget(self.hourMinuteList)
        self.acousticDateWidget.setLayout(vAcousticDate)
        self.acousticDateWidget.setMaximumWidth(175)
        self.acousticDateWidget.setEnabled(False)

        # Widget for dates of parameters
        self.parameterDateWidget = QWidget(self)
        # - Layout
        vparameterDate = QVBoxLayout()
        vparameterDate.addWidget(startDateLabel)
        vparameterDate.addWidget(self.startDateEdit)
        vparameterDate.addWidget(endDateLabel)
        vparameterDate.addWidget(self.endDateEdit)
        vparameterDate.addWidget(limitLabel)
        vparameterDate.addWidget(self.limitSpinBox)
        vparameterDate.addStretch()
        self.parameterDateWidget.setLayout(vparameterDate)
        self.parameterDateWidget.setEnabled(False)

        # Layout
        # - Vertical layout for EGIM --
        vEgim = QVBoxLayout()
        vEgim.addWidget(egimLabel)
        vEgim.addWidget(self.egimList)
        # -- Vertical layout for instruments -
        vInstrument = QVBoxLayout()
        vInstrument.addWidget(instrumentLabel)
        vInstrument.addWidget(self.instrumentList)
        # - Vertical layout for parameters -
        vParameter = QVBoxLayout()
        vParameter.addWidget(metadataLabel)
        vParameter.addWidget(self.metadataList)
        vParameter.addWidget(parameterLabel)
        vParameter.addWidget(self.parameterList)
        # - Vertical layout for dates and buttons
        vButton = QVBoxLayout()
        vButton.addWidget(downloadButton)
        vButton.addWidget(closeButton)
        vButton.addStretch()
        # - Layout of the frame -
        hFrame = QHBoxLayout()
        hFrame.addLayout(vEgim)
        hFrame.addLayout(vInstrument)
        hFrame.addLayout(vParameter)
        hFrame.addWidget(self.parameterDateWidget)
        hFrame.addWidget(self.acousticDateWidget)
        hFrame.addLayout(vButton)

        self.setLayout(hFrame)

    def loadObservatories(self):
        """
        It asks for the available EGIM observatories and write its names into
        self.egimList
        """

        # Send a message for the statusbar
        self.msg2Statusbar.emit("Loading observatories")
        # Clear self.egimList
        self.egimList.clear()
        # Ask for the observatories
        code, observatoryList = self.downloader.observatories()
        if code:
            if code == 200:
                # It means that you are going good
                self.egimList.addItems(observatoryList)
                # Send a message for the statusbar
                self.msg2Statusbar.emit("Ready")
            elif code == 401:
                self.msg2Statusbar.emit(
                    "Unauthorized to use the EMSODEV DMP API")
                self.downloader.password = None
                self.reload()
            elif code == 404:
                self.msg2Statusbar.emit("Not Found")
            elif code == 403:
                self.msg2Statusbar.emit("Forbidden")
            elif code == 500:
                self.msg2Statusbar.emit("EMSODEV API internal error")
            else:
                self.msg2Statusbar.emit("Unknown EMSODEV DMP API error")
        else:
            self.msg2Statusbar.emit(
                "Impossible to connect to the EMSODEV DMP API")

    def loadInstruments(self, observatory):
        """
        It asks for the available instruments and write its names into
        self.instrumentList

        Parameters
        ----------
            observatory: item
                item from self.observatoryList
        """
        # Send a message for the statusbar
        self.msg2Statusbar.emit("Loading instruments")
        # Clear self.instrumentList
        self.instrumentList.clear()
        # Ask for instruments
        code, instrumentList_ = self.downloader.instruments(observatory.text())
        if code:
            if code == 200:
                # It means that you are going good
                # Obtain all sensor names of instrumentList_
                sensorType = [
                    instrument['name'] for instrument in instrumentList_]
                self.instrumentList.addItems(sensorType)
                # Add tooltip
                for i in range(self.instrumentList.count()):
                    self.instrumentList.item(i).setToolTip(
                        '<p><b>Sensor Type</b><br>' +
                        '{}</p><p>'.format(instrumentList_[i]['sensorType']) +
                        '<b>Long Name</b><br>' +
                        '{}</p>'.format(instrumentList_[i]['sensorLongName']) +
                        '<p></p><p><b>S/N</b><br>' +
                        '{}</p>'.format(instrumentList_[i]['sn']))
                # Send a message for the statusbar
                self.msg2Statusbar.emit("Ready")
            elif code == 401:
                self.msg2Statusbar.emit(
                    "Unauthorized to use the EMSODEV DMP API")
                self.downloader.password = None
                self.reload()
            elif code == 404:
                self.msg2Statusbar.emit("Not Found")
            elif code == 403:
                self.msg2Statusbar.emit("Forbidden")
            elif code == 500:
                self.msg2Statusbar.emit("EMSODEV API internal error")
            else:
                self.msg2Statusbar.emit("Unknown EMSODEV DMP API error")
        else:
            self.msg2Statusbar.emit(
                "Impossible to connect to the EMSODEV DMP API")

    def loadParameters(self, instrument):
        """
        It asks for the available parameters and metadata and write them into
        self.parameterList and self.metadataList
        """
        # Send a message for the statusbar
        self.msg2Statusbar.emit("Loading parameters")
        # Clear self.parameterList and self.metadataList
        self.parameterList.clear()
        self.metadataList.clear()
        self.parameterDateWidget.setEnabled(False)
        self.acousticDateWidget.setEnabled(False)

        # If instrument is an icListener, check times
        if instrument.text() == "icListen-1636":
            self.acousticDateWidget.setEnabled(True)
            # Ask for dates
            code, self.dates = self.downloader.acoustic_date(
                self.egimList.currentItem().text(), instrument.text())
            if code == 200:
                dateList = [
                    date['acousticObservationDate'] for date in self.dates]
                self.dateList.addItems(dateList)

            else:
                self.msg2Statusbar.emit(
                    "Impossible to connect to the EMSODEV DMP API")
                return
            return

        self.parameterDateWidget.setEnabled(True)

        # Ask for metadata
        code, self.metadata = self.downloader.metadata(
            self.egimList.currentItem().text(), instrument.text())
        if code == 200:
            items = []
            for key, value in self.metadata.items():
                items.append("{}: {}".format(key, value))
            self.metadataList.addItems(items)
        else:
            self.msg2Statusbar.emit(
                "Impossible to connect to the EMSODEV DMP API")
            return

        # Ask for parameters
        code, parameterList_ = self.downloader.parameters(
            self.egimList.currentItem().text(), instrument.text())
        if code:
            if code == 200:
                # It means that you are going good
                # Obtain all parameter names of parameterList_
                names = [parameter['name'] for parameter in parameterList_]
                self.parameterList.addItems(names)
                self.parameterList.sortItems()
                # Add tooltip
                for i in range(self.parameterList.count()):
                    self.parameterList.item(i).setToolTip(
                        '<b>Units:</b> {}'.format(parameterList_[i]['uom']))
                # Send a message for the statusbar
                self.msg2Statusbar.emit("Ready")
            elif code == 401:
                self.msg2Statusbar.emit(
                    "Unauthorized to use the EMSODEV DMP API")
                self.downloader.password = None
                self.reload()
            elif code == 404:
                self.msg2Statusbar.emit("Not Found")
            elif code == 403:
                self.msg2Statusbar.emit("Forbidden")
            elif code == 500:
                self.msg2Statusbar.emit("EMSODEV API internal error")
            else:
                self.msg2Statusbar.emit("Unknown EMSODEV DMP API error")
        else:
            self.msg2Statusbar.emit(
                "Impossible to connect to the EMSODEV DMP API")

    def loadTimes(self, date_item):
        """
        Write items into self.hourMinuteList QListWidget
        """
        for date in self.dates:
            if date['acousticObservationDate'] == date_item.text():
                timeList = []
                for time in date['observationsHourMinuteList']:
                    timeList.append(time['acousticObservationHourMinute'])
                self.hourMinuteList.addItems(timeList)

    def reload(self):
        """It clear all lists and load again the observatories."""
        # Check the password of the API
        if self.downloader.password is None:
            self.msg2Statusbar.emit(
                "Password is required to download data from EMSODEV")
            text, ok = QInputDialog.getText(self, "Attention", "Password",
                                            QLineEdit.Password)
            if ok:
                self.downloader.password = text
            else:
                return
        self.loadObservatories()

    def downloadClick(self):
        """Function when user click download"""

        self.myThread = self.DownloadParameterThread(self)
        self.myThread.start()

    def downloadParameter(self, parameter):
        """It download data with the observation function of EGIM"""

        # Send a message for the statusbar
        self.msg2Statusbar.emit("Downloading {}".format(parameter))

        code, df = self.downloader.observation(
            observatory=self.egimList.currentItem().text(),
            instrument=self.instrumentList.currentItem().text(),
            parameter=parameter,
            startDate=self.startDateEdit.text(),
            endDate=self.endDateEdit.text(),
            limit=self.limitSpinBox.text())
        if code:
            if code == 200:
                self.msg2Statusbar.emit("Waterframe creation")
                # It means that you are going good
                wf = self.downloader.to_waterframe(data=df,
                                                   metadata=self.metadata)
                # print(wf.data.head())
                # Send a signal with the new WaterFrame
                self.wf2plotSplitter.emit(wf)
                self.msg2Statusbar.emit("Ready")
            elif code == 401:
                self.msg2Statusbar.emit(
                    "Unauthorized to use the EMSODEV DMP API")
                self.downloader.password = None
                self.reload()
            elif code == 404:
                self.msg2Statusbar.emit("Not Found")
            elif code == 403:
                self.msg2Statusbar.emit("Forbidden")
            elif code == 500:
                self.msg2Statusbar.emit("EMSODEV API internal error")
            else:
                self.msg2Statusbar.emit("Unknown EMSODEV DMP API error")
        else:
            self.msg2Statusbar.emit(
                "Impossible to connect to the EMSODEV DMP API")

    def downloadAcoustic(self, date, time):
        # Send a message for the statusbar
        self.msg2Statusbar.emit(
            "Downloading acoustic file from {}, {}".format(date, time))

        code, df, metadata = self.downloader.acoustic_observation(
            observatory=self.egimList.currentItem().text(),
            instrument=self.instrumentList.currentItem().text(),
            date=date,
            hour_minute=time)
        if code:
            if code == 200:
                self.msg2Statusbar.emit("Waterframe creation")
                # It means that you are going good
                wf = self.downloader.to_waterframe(data=df, metadata=metadata)
                # Send a signal with the new WaterFrame
                self.wf2plotSplitter.emit(wf)
                self.msg2Statusbar.emit("Ready")
            elif code == 401:
                self.msg2Statusbar.emit(
                    "Unauthorized to use the EMSODEV DMP API")
                self.downloader.password = None
                self.reload()
            elif code == 404:
                self.msg2Statusbar.emit("Not Found")
            elif code == 403:
                self.msg2Statusbar.emit("Forbidden")
            elif code == 500:
                self.msg2Statusbar.emit("EMSODEV API internal error")
            else:
                self.msg2Statusbar.emit("Unknown EMSODEV DMP API error")
        else:
            self.msg2Statusbar.emit(
                "Impossible to connect to the EMSODEV DMP API")

    def enableDate(self):
        """Enable or disable date elements"""
        if int(self.limitSpinBox.text()) > 0:
            self.startDateEdit.setEnabled(False)
            self.endDateEdit.setEnabled(False)
        else:
            self.startDateEdit.setEnabled(True)
            self.endDateEdit.setEnabled(True)
Example #4
0
class MainWindow(QDialog):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.createCategorySelectionGroupBox()
        self.createTextEditLayout()
        self.createButtonLayout()

        mainLayout = QGridLayout()
        mainLayout.addLayout(self.categorySelectionLayout, 0, 0)
        mainLayout.addLayout(self.textEditLayout, 1, 0)
        mainLayout.addLayout(self.buttonLayout, 2, 0)
        self.setLayout(mainLayout)

        QApplication.setStyle(QStyleFactory.create("cleanlooks"))
        self.setWindowTitle("FK-tiedotin")
        self.setWindowIcon(QtGui.QIcon('templates/fi.png'))

        # Always-on-top mode. Currently does not work on Windows.
        #alwaysOnTopShortcut = QShortcut(QtGui.QKeySequence("Ctrl+O"), self)
        #alwaysOnTopShortcut.activated.connect(lambda:
        #    super(MainWindow, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint))

    def createCategorySelectionGroupBox(self):
        self.languageCheckBox = QCheckBox("Text in English", self)
        self.languageCheckBox.stateChanged.connect(
            self.languageCheckBoxClicked)

        self.toBothBulletinsCheckBox = QCheckBox("Add to both versions", self)

        categorySelectionGroupBox = QGroupBox("Category")
        self.categorySelectionButtonGroup = QButtonGroup()

        self.radioButton1 = QRadioButton("Killan tapahtumat")
        self.radioButton2 = QRadioButton("Muut tapahtumat")
        self.radioButton3 = QRadioButton("Yleistä")
        self.radioButton4 = QRadioButton("Opinnot")
        self.radioButton1.setChecked(True)

        self.categorySelectionButtonGroup.addButton(self.radioButton1)
        self.categorySelectionButtonGroup.addButton(self.radioButton2)
        self.categorySelectionButtonGroup.addButton(self.radioButton3)
        self.categorySelectionButtonGroup.addButton(self.radioButton4)

        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(self.radioButton1)
        buttonLayout.addWidget(self.radioButton2)
        buttonLayout.addWidget(self.radioButton3)
        buttonLayout.addWidget(self.radioButton4)
        categorySelectionGroupBox.setLayout(buttonLayout)

        self.dateEdit = QDateEdit()
        self.dateEdit.setDateTime(QDateTime.currentDateTime())
        self.dateEdit.setCalendarPopup(True)

        dateLabel = QLabel("Date")
        dateLabel.setBuddy(self.dateEdit)

        self.categorySelectionLayout = QVBoxLayout()
        self.categorySelectionLayout.addWidget(self.languageCheckBox)
        self.categorySelectionLayout.addWidget(self.toBothBulletinsCheckBox)
        self.categorySelectionLayout.addWidget(categorySelectionGroupBox)
        self.categorySelectionLayout.addWidget(dateLabel)
        self.categorySelectionLayout.addWidget(self.dateEdit)

    def otherLanguageText(self, text):  # convert to dictionary

        if (text == "Guild's events"):
            return "Killan tapahtumat"
        elif (text == "Killan tapahtumat"):
            return "Guild's events"
        elif (text == "Other events"):
            return "Muut tapahtumat"
        elif (text == "Muut tapahtumat"):
            return "Other events"
        elif (text == "General"):
            return "Yleistä"
        elif (text == "Yleistä"):
            return "General"
        elif (text == "Studies"):
            return "Opinnot"
        elif (text == "Opinnot"):
            return "Studies"
        else:
            raise Exception("Wrong value for otherLanguageText")
        """
        categoriesDict_en = {
            "Guild's events":"Killan tapahtumat",
            "Other events":"Muut tapahtumat",
            "General":"Yleistä",
            "Studies":"Opinnot"
        }

        categoriesDict_fi = dict(reversed(item) for item in categoriesDict_en.items())
        categoriesDict = dict(categoriesDict_en, categoriesDict_fi)

        try:
            return categoriesDict(text)
        except ValueError:
            raise Exception("Wrong value for otherLanguageText")
        """

    def languageCheckBoxClicked(self, state):
        if state == QtCore.Qt.Checked:
            self.radioButton1.setText("Guild's events")
            self.radioButton2.setText("Other events")
            self.radioButton3.setText("General")
            self.radioButton4.setText("Studies")
        else:
            self.radioButton1.setText("Killan tapahtumat")
            self.radioButton2.setText("Muut tapahtumat")
            self.radioButton3.setText("Yleistä")
            self.radioButton4.setText("Opinnot")

    #def hide(self):
    #    self.headerLineEdit.hide()
    #    self.textBrowser = QTextBrowser()
    #    self.textBrowser.setGeometry(QtCore.QRect(390, 10, 531, 681))
    #    self.textBrowser.setObjectName("textBrowser")
    #    self.textBrowser.show()

    def createTextEditLayout(self):
        self.textEditLayout = QVBoxLayout()

        self.additionalWeeksEdit = QLineEdit()
        self.additionalWeeksEdit.setText("0")  # default
        self.headerLineEdit = QLineEdit()
        self.imageUrl = QLineEdit()
        self.contentTextEdit = QTextEdit()

        addWeeksLabel = QLabel("Additional weeks")
        addWeeksLabel.setBuddy(self.additionalWeeksEdit)
        headerLabel = QLabel("Header")
        headerLabel.setBuddy(self.headerLineEdit)
        imageUrlLabel = QLabel("Image URL")
        imageUrlLabel.setBuddy(self.imageUrl)
        contentLabel = QLabel("Content")
        contentLabel.setBuddy(self.contentTextEdit)

        self.textEditLayout.addWidget(addWeeksLabel)
        self.textEditLayout.addWidget(self.additionalWeeksEdit)
        self.textEditLayout.addWidget(headerLabel)
        self.textEditLayout.addWidget(self.headerLineEdit)
        self.textEditLayout.addWidget(imageUrlLabel)
        self.textEditLayout.addWidget(self.imageUrl)
        self.textEditLayout.addWidget(contentLabel)
        self.textEditLayout.addWidget(self.contentTextEdit)

    def createButtonLayout(self):
        self.buttonLayout = QHBoxLayout()

        savePushButton = QPushButton("Save")
        savePushButton.clicked.connect(self.save)

        clearPushButton = QPushButton("Clear")
        clearPushButton.clicked.connect(self.clear)

        self.buttonLayout.addWidget(clearPushButton)
        self.buttonLayout.addStretch(1)
        self.buttonLayout.addWidget(savePushButton)

    def save(self):
        category = self.categorySelectionButtonGroup.checkedButton().text()
        date = [
            self.dateEdit.date().day(),
            self.dateEdit.date().month(),
            self.dateEdit.date().year()
        ]
        weeks = int(self.additionalWeeksEdit.text())
        header = self.headerLineEdit.text().strip()
        image = self.imageUrl.text()
        content = self.contentTextEdit.toPlainText()

        save_entry(
            {
                'category': category,
                'date': date,
                'header': header,
                'image': image,
                'content': content
            }, self.languageCheckBox.isChecked(), weeks)

        if self.toBothBulletinsCheckBox.isChecked():
            save_entry(
                {
                    'category': self.otherLanguageText(
                        category),  # both languages fix here
                    'date': date,
                    'header': header,
                    'image': image,
                    'content': content
                },
                not self.languageCheckBox.isChecked(),
                weeks)

        self.clear()

    def clear(self):
        self.headerLineEdit.clear()
        self.imageUrl.clear()
        self.contentTextEdit.clear()
        self.languageCheckBox.setCheckState(0)
        self.toBothBulletinsCheckBox.setCheckState(0)
        self.dateEdit.setDateTime(QDateTime.currentDateTime())
Example #5
0
class AddWindow(QMainWindow):
    def __init__(self, table="expense"):
        super(AddWindow, self).__init__()
        self.setWindowTitle("Add " + table)
        self.setGeometry(200, 200, 400, 500)
        self.widget = QWidget()
        self.layout = QVBoxLayout()

        intrestrict = QDoubleValidator()

        if table == "expense":
            self.name = QLineEdit(placeholderText="Item")
            self.name.setMaximumWidth(500)
            self.brand = QLineEdit(placeholderText="Brand")
            self.brand.setMaximumWidth(500)
            self.category = QLineEdit(placeholderText="ingredient/equipment")
            self.category.setMaximumWidth(500)
            self.quantity = QLineEdit(placeholderText="Quantity")
            self.quantity.setMaximumWidth(500)
            self.unit = QLineEdit(placeholderText="unit (g,ml,unit...)")
            self.unit.setMaximumWidth(500)
            self.quantity.setMaximumWidth(500)
            self.supplier = QLineEdit(placeholderText="supplier")
            self.supplier.setMaximumWidth(500)
            self.note = QLineEdit(placeholderText="Note")
            self.note.setMaximumHeight(500)
            self.note.setMaximumWidth(500)

            self.date = QDateEdit()
            self.date.setDateTime(QDateTime.currentDateTime())
            self.date.setMaximumWidth(500)

            self.price = QLineEdit(placeholderText='Cost ($)')
            self.price.setMaximumWidth(500)
            self.price.setValidator(intrestrict)
            self.button = QPushButton("Add Expense")
            #self.button.clicked.connect(lambda: database.add_expense(self.name.text(), \
            #    self.supplier.text(), float(self.quantity.text()), self.category.text(), \
            #    self.unit.text(), self.brand.text(), float(self.price.text()), self.note.text(), self.date.text()))
            self.button.clicked.connect(self.click_expense)
            self.expenses_layout()

        elif table == "sale":
            self.date = QDateEdit()
            self.date.setDateTime(QDateTime.currentDateTime())
            self.date.setMaximumWidth(400)

            self.customer = QLineEdit(placeholderText="Customer")
            self.customer.setMaximumWidth(500)
            self.product = QLineEdit(placeholderText="Product")
            self.product.setMaximumWidth(500)
            self.quantity = QLineEdit(placeholderText="Quantity")
            self.total = QLineEdit(placeholderText="Total")
            self.total.setValidator(intrestrict)
            self.discount = QCheckBox("Discounted")

            self.button = QPushButton("Add Sale")
            self.button.clicked.connect(self.click_sale)
            self.sales_layout()

        elif table == "product":
            self.type = QLineEdit(
                placeholderText="Category (Bread, Pastry...)")
            self.type.setMaximumWidth(500)
            self.name = QLineEdit(placeholderText="Product Name")
            self.name.setMaximumWidth(500)
            self.price = QLineEdit(placeholderText="Price")
            self.price.setMaximumWidth(500)
            self.price.setValidator(intrestrict)
            # Recipe must be inputted as comma separated values
            # Each new ingredient must be on a new line
            self.recipe = QTextEdit(
                placeholderText="Recipe (Ingredient, Quantity)")
            self.recipe.setMaximumWidth(700)
            self.recipe.setMaximumHeight(1000)
            self.batch_yield = QLineEdit(
                placeholderText="Batch Yield (in g or unit)")
            self.batch_yield.setMaximumWidth(500)
            self.batch_yield.setValidator(intrestrict)
            self.note = QLineEdit(placeholderText="Note")
            self.note.setMaximumWidth(700)
            self.note.setMaximumHeight(500)
            self.button = QPushButton("Add Product")
            #self.button.clicked.connect(lambda: database.add_product(self.type.text(),\
            #    self.name.text(), float(str(self.price.text())), self.read_recipe(self.recipe.toPlainText()), \
            #        float(str(self.batch_yield.text())), self.note.text()))
            self.button.clicked.connect(self.click_product)
            self.products_layout()

        self.widget.setLayout(self.layout)
        self.setCentralWidget(self.widget)

    def click_expense(self):
        database.add_expense(self.name.text(), \
                self.supplier.text(), float(self.quantity.text()), self.category.text(), \
                self.unit.text(), self.brand.text(), float(self.price.text()), self.note.text(), self.date.text())
        self.close()

    def click_sale(self):
        database.add_sale(self.customer.text(), \
                self.product.text(), float(self.quantity.text()), float(self.total.text()),\
                self.discount.isChecked(), self.date.text())
        self.close()

    def click_product(self):
        database.add_product(self.type.text(),\
                self.name.text(), float(str(self.price.text())), self.read_recipe(self.recipe.toPlainText()), \
                float(str(self.batch_yield.text())), self.note.text())
        self.close()

    def expenses_layout(self):
        self.layout.addWidget(self.name)
        self.layout.addWidget(self.brand)
        self.layout.addWidget(self.category)
        self.layout.addWidget(self.quantity)
        self.layout.addWidget(self.unit)
        self.layout.addWidget(self.supplier)
        self.layout.addWidget(self.price)
        self.layout.addWidget(self.date)
        self.layout.addWidget(self.note)
        self.layout.addWidget(self.button)

    def sales_layout(self):
        self.layout.addWidget(self.date)
        self.layout.addWidget(self.customer)
        self.layout.addWidget(self.product)
        self.layout.addWidget(self.quantity)
        self.layout.addWidget(self.total)
        self.layout.addWidget(self.discount)
        self.layout.addWidget(self.button)

    def read_recipe(self, text):
        text_by_line = text.split("\n")
        print(text_by_line)
        ret = []
        for s in text_by_line:
            if "," in s:
                line = s.split(",")
                ing = line[0].strip()
                quantity = float(line[1].strip())
                add = (ing, quantity)
                ret.append(add)
        return ret

    def products_layout(self):
        self.layout.addWidget(self.type)
        self.layout.addWidget(self.name)
        self.layout.addWidget(self.price)
        self.layout.addWidget(self.recipe)
        self.layout.addWidget(self.batch_yield)
        self.layout.addWidget(self.note)
        self.layout.addWidget(self.button)
Example #6
0
class WidgetGallery(QDialog):
    def __init__(self, parent=None):
        super(WidgetGallery, self).__init__(parent)

        self.localization = de
        self.srcFileString = ""
        self.targetFileString = ""
        self.truePath = None
        self.firstRun = True

        styleComboBox = QComboBox()
        styleComboBox.addItems(QStyleFactory.keys())

        self.createStartSection()
        self.createFileSelection()
        self.createDateSelection()
        self.createCheckboxArea()
        self.createInfoOutputSection()

        mainLayout = QGridLayout()
        mainLayout.addWidget(self.fileSelectionGroup, 1, 0)
        mainLayout.addWidget(self.dateSelectionGroupBox, 2, 0)
        mainLayout.addWidget(self.checkboxGroup, 3, 0)
        mainLayout.addWidget(self.startSection, 4, 0)
        mainLayout.addWidget(self.infoOutputSection, 5, 0)

        self.setLayout(mainLayout)

        self.setWindowTitle(self.localization.window_title)

    def createStartSection(self):
        '''Generate Aread containing the start button'''

        self.startSection = QGroupBox(self.localization.start_section)
        self.buttonGo = QPushButton(self.localization.button_go)
        self.buttonGo.setDisabled(True)
        self.buttonGo.clicked.connect(self.run)

        layout = QVBoxLayout()
        layout.addWidget(self.buttonGo)

        self.startSection.setLayout(layout)

    def createInfoOutputSection(self):
        '''Generate Aread containing progress, error and warning outputs'''

        self.infoOutputSection = QGroupBox(self.localization.infoOutput)
        self.infoTextBox = QTextBrowser()

        layout = QVBoxLayout()
        layout.addWidget(self.infoTextBox)

        self.infoOutputSection.setLayout(layout)

    def createFileSelection(self):
        '''Generate the area containing the file selectors and go button'''

        self.fileSelectionGroup = QGroupBox(self.localization.file_selection)

        # basic object #
        self.buttonSrcFile = QPushButton(self.localization.button_set_src_file)
        self.srcFileName = QLabel(self.localization.output_file)

        self.buttonTargetFile = QPushButton(
            self.localization.output_file_placeholder)
        self.boxUseSrcDir = QCheckBox(self.localization.button_use_src_dir)

        # connectors #
        self.buttonSrcFile.clicked.connect(self.selectSrcFile)
        self.buttonTargetFile.clicked.connect(self.selectTargetFile)
        self.boxUseSrcDir.stateChanged.connect(self.useSrcDir)
        self.boxUseSrcDir.setChecked(True)

        # layout #
        layout = QVBoxLayout()

        layout.addWidget(self.buttonSrcFile)
        layout.addWidget(self.srcFileName)

        layout.addWidget(self.buttonTargetFile)
        layout.addWidget(self.boxUseSrcDir)

        layout.addStretch(1)
        self.fileSelectionGroup.setLayout(layout)

    def createDateSelection(self):
        '''Generate the area containing the date selectors'''

        self.dateSelectionGroupBox = QGroupBox(
            self.localization.date_selection)

        layout = QGridLayout()

        self.startDateEdit = QDateEdit(calendarPopup=True)
        self.startDateEdit.setDisplayFormat("dd.MM.yyyy")
        self.startDateEdit.setReadOnly(True)
        self.startDateEdit.lineEdit().setDisabled(True)

        self.endDateEdit = QDateEdit(calendarPopup=True)
        self.endDateEdit.setDisplayFormat("dd.MM.yyyy")
        self.endDateEdit.setReadOnly(True)
        self.endDateEdit.lineEdit().setDisabled(True)

        self.startTimeEdit = QLineEdit("00:00")
        self.endTimeEdit = QLineEdit("23:59")
        self.startTimeEdit.setDisabled(True)
        self.endTimeEdit.setDisabled(True)

        layout.addWidget(self.startDateEdit, 0, 0)
        layout.addWidget(self.startTimeEdit, 0, 1)

        layout.addWidget(self.endDateEdit, 1, 0)
        layout.addWidget(self.endTimeEdit, 1, 1)

        layout.setColumnStretch(0, 1)
        layout.setColumnStretch(1, 1)

        self.dateSelectionGroupBox.setLayout(layout)

    def createCheckboxArea(self):
        '''Generate area  with configuration options'''

        self.checkboxGroup = QGroupBox(self.localization.options)

        self.boxOTemp = QCheckBox(self.localization.button_otemp)
        self.boxOHumidity = QCheckBox(self.localization.button_ohumidity)

        layout = QVBoxLayout()
        layout.addWidget(self.boxOTemp)
        layout.addWidget(self.boxOHumidity)
        layout.addStretch(1)
        self.checkboxGroup.setLayout(layout)

    def run(self):
        '''Run generation with selected file and options'''

        # set save target if nessesary #
        self.infoTextBox.clear()
        self.buttonGo.setText(self.localization.button_go_wait)
        self.buttonGo.setDisabled(True)
        self.repaint()

        if self.boxUseSrcDir.isChecked():
            target = self.srcFileString
            forcePath = False
        else:
            target = self.targetFileString
            forcePath = True

        # workaround for checkboxes changed #
        outsideDataNeeded = self.boxOTemp.isChecked(
        ) or self.boxOHumidity.isChecked()
        self.datapoints = input_backend.read_in_file(
            self.srcFileString,
            outsideData=outsideDataNeeded,
            plotOutsideTemp=self.boxOTemp.isChecked(),
            plotOutsideHum=self.boxOHumidity.isChecked(),
            qtTextBrowser=self.infoTextBox)

        # build dates #
        try:
            startTimeHelper = dt.datetime.strptime(self.startTimeEdit.text(),
                                                   "%H:%M")
            endTimeHelper = dt.datetime.strptime(self.endTimeEdit.text(),
                                                 "%H:%M")
        except ValueError as e:
            errorBox = QMessageBox(self)
            errorBox.setAttribute(PyQt5.QtCore.Qt.WA_DeleteOnClose)
            errorBox.setText(self.localization.bad_time)
            errorBox.setDetailedText(str(e))
            errorBox.show()
            self.buttonGo.setText(self.localization.button_go)
            self.buttonGo.setDisabled(False)
            return

        startTimeOffset = dt.timedelta(hours=startTimeHelper.hour,
                                       minutes=startTimeHelper.minute)
        endTimeOffset = dt.timedelta(hours=endTimeHelper.hour,
                                     minutes=endTimeHelper.minute)

        zeroTime = dt.time(0, 0)
        startDateTime = dt.datetime.combine(
            self.startDateEdit.date().toPyDate(), zeroTime)
        startDateTime += startTimeOffset
        endDateTime = dt.datetime.combine(self.endDateEdit.date().toPyDate(),
                                          zeroTime)
        endDateTime += endTimeOffset

        try:
            self.truePath = plot.plot(self.datapoints,
                                      path=target,
                                      date1=startDateTime,
                                      date2=endDateTime,
                                      forcePath=forcePath,
                                      qtTextBrowser=self.infoTextBox)
        except ValueError as e:
            self.infoTextBox.append("ERROR: " + str(e))
            self.buttonGo.setText(self.localization.button_go)
            return

        self.buttonGo.setText(self.localization.button_go)
        self.buttonGo.setDisabled(False)

        self.infoTextBox.append(self.localization.success)

        doneDialog = QMessageBox(self)
        doneDialog.setAttribute(PyQt5.QtCore.Qt.WA_DeleteOnClose)
        doneDialog.setText(self.localization.done_text)
        doneDialog.addButton(self.localization.open_pic, QMessageBox.YesRole)
        doneDialog.addButton(self.localization.close, QMessageBox.NoRole)
        doneDialog.buttonClicked.connect(self.openFile)
        doneDialog.show()

    def selectSrcFile(self):
        '''Function to select a src-file'''

        if not self.firstRun:
            targetDir = ""  # meaning the last one opened
        else:
            targetDir = cp.CFG("default_source_dir")

        self.srcFileString = QFileDialog.getOpenFileName(
            self, self.localization.src_file_dialog, targetDir,
            "Data-Files (*.txt *.csv *.dbf *.xls)")[0]
        self.srcFileName.setText(self.srcFileString)

        if not self.srcFileString:
            return

        self.infoTextBox.append(self.localization.testing_input)
        self.firstRun = False

        try:
            self.datapoints = input_backend.read_in_file(
                self.srcFileString,
                outsideData=False,
                plotOutsideTemp=False,
                plotOutsideHum=False,
                qtTextBrowser=self.infoTextBox)
        except Exception as e:
            errorBox = QMessageBox(self)
            errorBox.setStyleSheet("QLabel{min-width: 700px;}")
            errorBox.setAttribute(PyQt5.QtCore.Qt.WA_DeleteOnClose)
            errorBox.setText(self.localization.error_read_in)
            errorBox.setDetailedText(traceback.format_exc())
            errorBox.show()
            return

        start = self.datapoints[cp.CFG("plot_temperatur_key")].getFirstTime()
        self.startDateEdit.setDateTime(start)

        end = self.datapoints[cp.CFG("plot_temperatur_key")].getLastTime()
        self.endDateEdit.setDateTime(end)

        self.buttonGo.setDisabled(False)
        self.endDateEdit.setReadOnly(False)
        self.startDateEdit.setReadOnly(False)
        self.startDateEdit.lineEdit().setDisabled(False)
        self.endDateEdit.lineEdit().setDisabled(False)
        self.startTimeEdit.setDisabled(False)
        self.endTimeEdit.setDisabled(False)
        self.buttonGo.setFocus(PyQt5.QtCore.Qt.OtherFocusReason)

        self.infoTextBox.append(self.localization.testing_input_suc)

    def selectTargetFile(self):
        '''Function to select a target-file'''
        self.targetFileString = QFileDialog.getSaveFileName(
            self, self.localization.save_file_dialog)[0]
        if not self.targetFileString:
            return

        self.buttonTargetFile.setText(self.targetFileString)
        self.buttonGo.setDisabled(False)
        self.buttonGo.setFocus(PyQt5.QtCore.Qt.OtherFocusReason)

    def useSrcDir(self):
        '''Function to handle use src dir checkbox'''
        if self.boxUseSrcDir.isChecked():
            self.buttonTargetFile.setDisabled(True)
            if self.srcFileString:
                self.buttonGo.setDisabled(False)
                self.srcFileName.setText(self.srcFileString)
        else:
            self.buttonTargetFile.setDisabled(False)
            if self.targetFileString:
                self.buttonTargetFile.setText(self.targetFileString)
            else:
                self.buttonGo.setDisabled(True)

    def openFile(self, button):
        if button.text() == self.localization.open_pic and self.truePath:
            PyQt5.QtGui.QDesktopServices.openUrl(
                QUrl.fromLocalFile(self.truePath))
        else:
            pass
Example #7
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.textSuffix = QTextEdit(self.centralwidget)
        self.textSuffix.setGeometry(QRect(20, 230, 261, 31))
        self.textSuffix.setObjectName("textSuffix")
        self.textRiskf = QTextEdit(self.centralwidget)
        self.textRiskf.setGeometry(QRect(20, 360, 261, 31))
        self.textRiskf.setObjectName("textRiskf")
        self.label = QLabel(self.centralwidget)
        self.label.setGeometry(QRect(20, 330, 261, 20))
        self.label.setObjectName("label")
        self.label_2 = QLabel(self.centralwidget)
        self.label_2.setGeometry(QRect(20, 270, 281, 21))
        self.label_2.setObjectName("label_2")
        self.label_3 = QLabel(self.centralwidget)
        self.label_3.setGeometry(QRect(20, 200, 261, 16))
        self.label_3.setObjectName("label_3")
        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setGeometry(QRect(20, 130, 261, 21))
        self.label_4.setObjectName("label_4")
        self.label_5 = QLabel(self.centralwidget)
        self.label_5.setGeometry(QRect(20, 60, 261, 21))
        self.label_5.setObjectName("label_5")
        self.startButton = QPushButton(self.centralwidget)
        self.startButton.setGeometry(QRect(20, 510, 111, 31))
        self.startButton.setObjectName("startButton")
        self.label_6 = QLabel(self.centralwidget)
        self.label_6.setGeometry(QRect(20, 10, 261, 41))
        font = QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        font.setBold(True)
        font.setUnderline(True)
        font.setWeight(75)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.resultBrowser = QTextBrowser(self.centralwidget)
        self.resultBrowser.setGeometry(QRect(310, 30, 461, 501))
        self.resultBrowser.setObjectName("resultBrowser")
        self.DateStart = QDateEdit(self.centralwidget)
        self.DateStart.setGeometry(QRect(20, 90, 121, 31))
        self.DateStart.setMaximumDate(QDate(2050, 12, 31))
        self.DateStart.setMinimumDate(QDate(1990, 12, 31))
        self.DateStart.setDate(QDate(2018, 1, 1))
        self.DateStart.setObjectName("DateStart")
        self.DateEnd = QDateEdit(self.centralwidget)
        self.DateEnd.setGeometry(QRect(19, 163, 121, 31))
        self.DateEnd.setDateTime(QDateTime(QDate(2018, 1, 1), QTime(0, 0, 0)))
        self.DateEnd.setMaximumDateTime(QDateTime(QDate(2050, 12, 31), QTime(23, 59, 59)))
        self.DateEnd.setMinimumDate(QDate(1990, 12, 31))
        self.DateEnd.setObjectName("DateEnd")
        self.spinBoxMode = QSpinBox(self.centralwidget)
        self.spinBoxMode.setGeometry(QRect(20, 290, 71, 31))
        self.spinBoxMode.setMinimum(1)
        self.spinBoxMode.setMaximum(3)
        self.spinBoxMode.setObjectName("spinBoxMode")
        self.label_7 = QLabel(self.centralwidget)
        self.label_7.setGeometry(QRect(170, 300, 101, 21))
        self.label_7.setObjectName("label_7")
        self.endButton = QPushButton(self.centralwidget)
        self.endButton.setGeometry(QRect(160, 510, 121, 31))
        self.endButton.setObjectName("endButton")
        self.fileButton = QPushButton(self.centralwidget)
        self.fileButton.setGeometry(QRect(20, 410, 261, 31))
        self.fileButton.setObjectName("fileButton")
        self.pathBrowser = QTextBrowser(self.centralwidget)
        self.pathBrowser.setGeometry(QRect(20, 450, 261, 41))
        self.pathBrowser.setObjectName("pathBrowser")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        self.menuAnalysis = QMenu(self.menubar)
        self.menuAnalysis.setObjectName("menuAnalysis")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menuAnalysis.menuAction())

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)
        ####################################################

        self.mythread = MyThread()
        self.mainthread = MyMainThread()

        self.fileButton.clicked.connect(lambda : self.file_path())
        self.mythread.trigger.connect(self.update_text)
        self.mainthread.result.connect(self.update_result)

        self.startButton.clicked.connect(lambda : self.input_Parameters())
        self.startButton.clicked.connect(lambda : self.mainthread.start())
        self.startButton.clicked.connect(lambda : self.mythread.start())
        self.endButton.clicked.connect(lambda : self.end_calculation())

        
    def input_Parameters(self):
        self.aa = str(self.DateStart.date().toString("yyyyMMdd"))
        self.bb = str(self.DateEnd.date().toString("yyyyMMdd"))
        self.cc = str(self.textSuffix.toPlainText())
        self.dd = int(self.spinBoxMode.value())
        self.ee = float(self.textRiskf.toPlainText())

        if self.dd==1:
            self.dx='p1f1'
        elif self.dd==2:
            self.dx='p0f1'
        elif self.dd==3:
            self.dx='p1f0'
        else:
            raise Exception('Running Mode is wrong')

        self.mainthread.parameters_in = [self.aa ,self.bb, self.cc, self.dx, self.ee, self.directory1]


    def file_path(self):  
        self.directory1 = QFileDialog.getExistingDirectory(self.centralwidget,"Please choose folder","/")+'/'
        self.pathBrowser.append(str(self.directory1))

    def update_text(self, message):
        self.resultBrowser.append(str(message))
    
    def update_result(self,message):
        self.mythread.stop_()
        sleep(1)
        self.resultBrowser.append(str(message))
        print(self.mainthread.str_result)
        for i in self.mainthread.str_result:
            print(i)
            self.resultBrowser.append(i)

    def end_calculation(self):
        self.mythread.stop_()
        self.mainthread.stop_()
        sleep(1)
        self.resultBrowser.append('\nCalculation terminated by user...')


    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Please input risk free rate(0.035)"))
        self.label_2.setText(_translate("MainWindow", "Choose a running mode(e.g (1)p1f1/(2)p0f1"))
        self.label_3.setText(_translate("MainWindow", "Please input the suffix for result file"))
        self.label_4.setText(_translate("MainWindow", "Please input earliest date(e.g 2018-01-01)"))
        self.label_5.setText(_translate("MainWindow", "Please input latest date(e.g 2018-12-30)"))
        self.startButton.setText(_translate("MainWindow", "Start Analysis"))
        self.label_6.setText(_translate("MainWindow", "Barra Contribution Analysis(v_test)"))
        self.label_7.setText(_translate("MainWindow", " (3)p1f0"))
        self.endButton.setText(_translate("MainWindow", "End Process"))
        self.fileButton.setText(_translate("MainWindow", "Choose a folder"))
        self.menuAnalysis.setTitle(_translate("MainWindow", "Analysis"))
class MyTableWidget(QWidget):

    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()

        # Add tabs
        self.tabs.addTab(self.tab1, "Add Customer")
        self.tabs.addTab(self.tab2, "Advertisement")
        self.tabs.addTab(self.tab3, "Delete Previous Records")

        # Creating First tab
        self.tab1.layout = QFormLayout(self)
        self.name_edit = QLineEdit()
        self.name_edit.setPlaceholderText("Type Customer Name")
        self.email_edit = QLineEdit()
        self.email_edit.setPlaceholderText("Type Customer E-mail Id")
        self.mobile_edit = QLineEdit()
        self.mobile_edit.setPlaceholderText("Type Customer Mobile Number")
        self.v_date = QDateEdit()
        self.v_date.setDateTime(QDateTime.currentDateTime())
        self.add_btn = QPushButton("Add Customer To System")
        self.del_year_btn = QPushButton("Delete Previous year Record")
        self.del_month_btn = QPushButton("Delete Previous month Record")
        self.del_all = QPushButton("Delete All Record")
        self.email_del_edit = QLineEdit()
        self.email_del_edit.setPlaceholderText("Type Customer E-mail Id to delete")
        self.tab1.layout.addRow("Enter Name : ", self.name_edit)
        self.tab1.layout.addRow("Enter E-mail Id : ", self.email_edit)
        self.tab1.layout.addRow("Enter Mobile Number : ", self.mobile_edit)
        self.tab1.layout.addRow("Select Visiting Date : ", self.v_date)
        self.tab1.layout.addWidget(self.add_btn)
        self.tab1.layout.addWidget(self.del_year_btn)
        self.tab1.layout.addWidget(self.del_month_btn)
        self.tab1.layout.addWidget(self.del_all)
        self.tab1.layout.addRow("Delete this email", self.email_del_edit)
        self.tab1.setLayout(self.tab1.layout)
        self.add_btn.clicked.connect(self.addtodb)
        self.del_year_btn.clicked.connect(self.delthis)
        self.del_month_btn.clicked.connect(self.delthis)
        self.del_all.clicked.connect(self.delthis)

        # Creating Second Tab
        self.layout.addWidget(self.tabs)
        self.tab2.layout = QFormLayout()
        self.all_chbox = QCheckBox("Send To All")
        self.send_btn = QPushButton("Send")
        self.tab2.layout.addWidget(self.all_chbox)
        self.tab2.layout.addWidget(self.send_btn)
        self.tab2.setLayout(self.tab2.layout)
        self.send_btn.clicked.connect(self.sendmail)

    def addtodb(self):
        print("in DB")
        if not Validator.checkemail(self.email_edit.text()):
            msg_box = QMessageBox()
            msg_box.setIcon(QMessageBox.Warning)
            msg_box.setText("Enter Valid Email Address")
            msg_box.setWindowIcon(QIcon('crm.png'))
            msg_box.setWindowTitle("Incorrect Email-id")
            msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            retval = msg_box.exec_()
            return
        elif not Validator.checkmob(self.mobile_edit.text()):
            msg_box = QMessageBox()
            msg_box.setIcon(QMessageBox.Warning)
            msg_box.setText("Enter Valid Mobile Number")
            msg_box.setWindowIcon(QIcon('crm.png'))
            msg_box.setWindowTitle("Incorrect Mobile No.")
            msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            retval = msg_box.exec_()
            return
        else:
            ch = DBCon.dbinitop(self)
            if ch == 1:
                msg_box = QMessageBox()
                msg_box.setIcon(QMessageBox.Information)
                msg_box.setText("Customer added to System successfully")
                msg_box.setWindowIcon(QIcon('crm.png'))
                msg_box.setWindowTitle("Added Customer")
                msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
                retval = msg_box.exec_()
                self.name_edit.setText("")
                self.email_edit.setText("")
                self.mobile_edit.setText("")
            else:
                msg_box = QMessageBox()
                msg_box.setIcon(QMessageBox.Warning)
                msg_box.setText("Problem With Database....Restart Database")
                msg_box.setWindowIcon(QIcon('crm.png'))
                msg_box.setWindowTitle("Restart Database")
                msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
                retval = msg_box.exec_()


    def sendmail(self):
        if self.all_chbox.isChecked():
            print("mailing")
            DBCon.dbpickup()
        self.all_chbox.setChecked(False)

    def delprevyear(self, btn):
        DBCon.delfromdb(1)

    def delprevmonth(self, btn):
        DBCon.delfromdb(2)

    def delall(self, btn):
        DBCon.delfromdb(4)

    @pyqtSlot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(),
                  currentQTableWidgetItem.text())
Example #9
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.lastyear = int(time.strftime('%Y', time.localtime(time.time()))) - 1
        self.in_parameters = {u'datetime': str(self.lastyear) + u'年',
                              u'target_area': u'绍兴市',
                              u'density_cell': u'10',
                              u'density_class': 10,
                              u'day_cell': u'15',
                              u'day_class': 10,
                              u'out_type': u'tiff'}
        self.setupUi()

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.setFixedSize(1040, 915)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
        self.setSizePolicy(sizePolicy)
        icon = QIcon()
        icon.addPixmap(QPixmap('./resource/weather-thunder.png'),QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)
        self.centralwidget = QWidget(self)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
        self.centralwidget.setSizePolicy(sizePolicy)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QRect(32, 10, 979, 851))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout_5 =QVBoxLayout(self.layoutWidget)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem = QSpacerItem(300, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.datetime_label = QLabel(self.layoutWidget)
        self.datetime_label.setObjectName("datetime_label")
        self.horizontalLayout.addWidget(self.datetime_label)
        self.datetime = QDateEdit(self.layoutWidget)
        self.datetime.setDateTime(QDateTime(QDate(self.lastyear, 1, 1), QTime(0, 0, 0)))
        self.datetime.setObjectName("datetime")
        self.horizontalLayout.addWidget(self.datetime)
        spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.target_area_label = QLabel(self.layoutWidget)
        self.target_area_label.setObjectName("target_area_label")
        self.horizontalLayout.addWidget(self.target_area_label)
        self.target_area = QComboBox(self.layoutWidget)
        self.target_area.setObjectName("target_area")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.horizontalLayout.addWidget(self.target_area)
        spacerItem2 = QSpacerItem(300, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem2)
        self.verticalLayout_5.addLayout(self.horizontalLayout)
        self.tabWidget = QTabWidget(self.layoutWidget)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
        self.tabWidget.setSizePolicy(sizePolicy)
        self.tabWidget.setObjectName("tabWidget")
        self.density_tab = QWidget()
        self.density_tab.setObjectName("density_tab")
        self.verticalLayout_3 =QVBoxLayout(self.density_tab)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.verticalLayout_2 =QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_2 = QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.density_cell_label = QLabel(self.density_tab)
        self.density_cell_label.setObjectName("density_cell_label")
        self.horizontalLayout_2.addWidget(self.density_cell_label)
        self.density_cell = QSpinBox(self.density_tab)
        self.density_cell.setProperty("value", 10)
        self.density_cell.setObjectName("density_cell")
        self.horizontalLayout_2.addWidget(self.density_cell)
        spacerItem3 = QSpacerItem(40, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.density_class_label = QLabel(self.density_tab)
        self.density_class_label.setObjectName("density_class_label")
        self.horizontalLayout_2.addWidget(self.density_class_label)
        self.density_class = QSpinBox(self.density_tab)
        self.density_class.setProperty("value", 10)
        self.density_class.setObjectName("density_class")
        self.horizontalLayout_2.addWidget(self.density_class)
        spacerItem4 = QSpacerItem(478, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem4)
        self.density_mxd = QPushButton(self.density_tab)
        self.density_mxd.setObjectName("density_mxd")
        self.horizontalLayout_2.addWidget(self.density_mxd)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        self.density_view = QGraphicsView(self.density_tab)
        self.density_view.setObjectName("density_view")
        self.verticalLayout_2.addWidget(self.density_view)
        self.verticalLayout_3.addLayout(self.verticalLayout_2)
        self.tabWidget.addTab(self.density_tab, "")
        self.day_tab = QWidget()
        self.day_tab.setObjectName("day_tab")
        self.verticalLayout_4 =QVBoxLayout(self.day_tab)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.verticalLayout =QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_3 =QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.day_cell_label = QLabel(self.day_tab)
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.day_cell_label.sizePolicy().hasHeightForWidth())
        self.day_cell_label.setSizePolicy(sizePolicy)
        self.day_cell_label.setObjectName("day_cell_label")
        self.horizontalLayout_3.addWidget(self.day_cell_label)
        self.day_cell = QSpinBox(self.day_tab)
        self.day_cell.setProperty("value", 15)
        self.day_cell.setObjectName("day_cell")
        self.horizontalLayout_3.addWidget(self.day_cell)
        spacerItem5 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem5)
        self.day_class_label = QLabel(self.day_tab)
        self.day_class_label.setObjectName("day_class_label")
        self.horizontalLayout_3.addWidget(self.day_class_label)
        self.day_class = QSpinBox(self.day_tab)
        self.day_class.setProperty("value", 10)
        self.day_class.setObjectName("day_class")
        self.horizontalLayout_3.addWidget(self.day_class)
        spacerItem6 = QSpacerItem(478, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem6)
        self.day_mxd = QPushButton(self.day_tab)
        self.day_mxd.setObjectName("day_mxd")
        self.horizontalLayout_3.addWidget(self.day_mxd)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.day_view = QGraphicsView(self.day_tab)
        self.day_view.setObjectName("day_view")
        self.verticalLayout.addWidget(self.day_view)
        self.verticalLayout_4.addLayout(self.verticalLayout)
        self.tabWidget.addTab(self.day_tab, "")
        self.verticalLayout_5.addWidget(self.tabWidget)
        self.horizontalLayout_4 =QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.progressBar = QProgressBar(self.layoutWidget)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth())
        self.progressBar.setSizePolicy(sizePolicy)
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.horizontalLayout_4.addWidget(self.progressBar)
        self.execute_button = QPushButton(self.layoutWidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.execute_button.sizePolicy().hasHeightForWidth())
        self.execute_button.setSizePolicy(sizePolicy)
        self.execute_button.setObjectName("execute_button")
        self.horizontalLayout_4.addWidget(self.execute_button)
        self.verticalLayout_5.addLayout(self.horizontalLayout_4)
        self.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 1040, 26))
        self.menubar.setObjectName("menubar")
        self.file_menu = QMenu(self.menubar)
        self.file_menu.setObjectName("file_menu")
        self.help_menu = QMenu(self.menubar)
        self.help_menu.setObjectName("help_menu")
        self.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)
        self.action_add_data = QAction(self)
        self.action_add_data.setObjectName("action_add_data")
        self.action_help = QAction(self)
        self.action_help.setObjectName("action_help")
        self.action_about = QAction(self)
        self.action_about.setObjectName("action_about")
        self.action_save_pic = QAction(self)
        self.action_save_pic.setObjectName("action_save_pic")
        self.file_menu.addAction(self.action_add_data)
        self.file_menu.addAction(self.action_save_pic)
        self.help_menu.addAction(self.action_help)
        self.help_menu.addAction(self.action_about)
        self.menubar.addAction(self.file_menu.menuAction())
        self.menubar.addAction(self.help_menu.menuAction())

        self.retranslateUi()
        self.tabWidget.setCurrentIndex(0)
        QMetaObject.connectSlotsByName(self)
        self.center()
        self.show()

        self.target_area.activated[str].connect(self.updateTargetArea)
        self.datetime.dateChanged.connect(self.updateDatetime)
        self.density_cell.valueChanged.connect(self.updateDensityCell)
        self.density_class.valueChanged.connect(self.updateDensityClass)
        self.day_cell.valueChanged.connect(self.updateDayCell)
        self.day_class.valueChanged.connect(self.updateDayClass)

        self.action_add_data.triggered.connect(self.addData)
        self.action_save_pic.triggered.connect(self.savePic)
        self.action_about.triggered.connect(self.showAbout)
        self.action_help.triggered.connect(self.showHelp)
        self.execute_button.clicked.connect(self.execute)
        self.density_mxd.clicked.connect(self.openMxdDensity)
        self.day_mxd.clicked.connect(self.openMxdDay)


        self.density_mxd.setDisabled(True)
        self.day_mxd.setDisabled(True)
        self.action_save_pic.setDisabled(True)

    def execute(self):
        dir = u"E:/Documents/工作/雷电公报/闪电定位原始文本数据/" + self.in_parameters[u'datetime']

        if os.path.exists(dir):
            datafiles = os.listdir(dir)
            datafiles = map(lambda x:os.path.join(dir,x),datafiles)
            self.in_parameters[u'origin_data_path'] = datafiles

        if not self.in_parameters.has_key(u'origin_data_path'):
            message = u"请加载%s的数据" % self.in_parameters[u'datetime']
            msgBox = QMessageBox()
            msgBox.setText(message)
            msgBox.setIcon(QMessageBox.Information)
            icon = QIcon()
            icon.addPixmap(QPixmap('./resource/weather-thunder.png'), QIcon.Normal, QIcon.Off)
            msgBox.setWindowIcon(icon)
            msgBox.setWindowTitle(" ")
            msgBox.exec_()
            return

        self.execute_button.setDisabled(True)
        self.execute_button.setText(u'正在制图中……')
        self.progressBar.setMaximum(0)
        self.progressBar.setMinimum(0)

        self.action_add_data.setDisabled(True)
        self.target_area.setDisabled(True)
        self.datetime.setDisabled(True)
        self.density_cell.setDisabled(True)
        self.density_class.setDisabled(True)
        self.day_cell.setDisabled(True)
        self.day_class.setDisabled(True)

        # for outfile in self.in_parameters[u'origin_data_path']:
        #     infile =
        #     try:
        #         with open(infile, 'w+') as in_f:
        #             for line in in_f:
        #                 line = line.replace(u":",":")
        #                 in_f.write(line)
        #     except Exception,inst:
        #         print infile

        self.process_thread = WorkThread()
        self.process_thread.trigger.connect(self.finished)
        self.process_thread.beginRun(self.in_parameters)

    def finished(self):

        #绘制闪电密度图
        ##清除上一次的QGraphicsView对象,防止其记录上一次图片结果,影响显示效果
        self.density_view.setAttribute(Qt.WA_DeleteOnClose)
        self.verticalLayout_2.removeWidget(self.density_view)
        size = self.density_view.size()
        self.density_view.close()

        self.density_view = QGraphicsView(self.density_tab)
        self.density_view.setObjectName("density_view")
        self.density_view.resize(size)
        self.verticalLayout_2.addWidget(self.density_view)

        densityPic = ''.join([cwd,u'/bulletinTemp/',
            self.in_parameters[u'datetime'],u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'闪电密度空间分布.tif'])

        scene = QGraphicsScene()
        pixmap_density = QPixmap(densityPic)
        scene.addPixmap(pixmap_density)
        self.density_view.setScene(scene)
        scale = float(self.density_view.width()) / pixmap_density.width()
        self.density_view.scale(scale, scale)

        #绘制雷暴日图
        self.day_view.setAttribute(Qt.WA_DeleteOnClose)
        self.verticalLayout.removeWidget(self.day_view)
        size = self.day_view.size()
        self.day_view.close()

        self.day_view = QGraphicsView(self.day_tab)
        self.day_view.setObjectName("day_view")
        self.day_view.resize(size)
        self.verticalLayout.addWidget(self.day_view)

        dayPic = ''.join([cwd,u'/bulletinTemp/',
            self.in_parameters[u'datetime'],u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'地闪雷暴日空间分布.tif'])

        pixmap_day = QPixmap(dayPic)
        scene = QGraphicsScene()
        scene.addPixmap(pixmap_day)
        self.day_view.resize(self.density_view.width(),self.density_view.height())
        self.day_view.setScene(scene)
        scale = float(self.day_view.width()) / pixmap_day.width()
        self.day_view.scale(scale, scale)

        #处理进度条和执行按钮状态
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(100)
        self.progressBar.setFormat(u'完成!')
        self.execute_button.setDisabled(False)
        self.execute_button.setText(u'执行')
        #改变一些控件的状态
        self.action_add_data.setDisabled(False)
        self.target_area.setDisabled(False)
        self.datetime.setDisabled(False)
        self.density_cell.setDisabled(False)
        self.density_class.setDisabled(False)
        self.day_cell.setDisabled(False)
        self.day_class.setDisabled(False)
        self.density_mxd.setDisabled(False)
        self.day_mxd.setDisabled(False)
        self.action_save_pic.setDisabled(False)

    def addData(self):
        fnames = QFileDialog.getOpenFileNames(self, u'请选择原始的电闪数据',
                                              u'E:/Documents/工作/雷电公报/闪电定位原始文本数据',
                                              'Text files (*.txt);;All(*.*)')

        self.in_parameters[u'origin_data_path'] = fnames[0]

    def savePic(self):
        densityPic = ''.join([cwd,u'/bulletinTemp/',self.in_parameters[u'datetime'],u'/',
            self.in_parameters[u'target_area'],'.gdb',u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'闪电密度空间分布.tif'])

        dayPic = ''.join([cwd,u'/bulletinTemp/',self.in_parameters[u'datetime'],u'/',
            self.in_parameters[u'target_area'],'.gdb',u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'地闪雷暴日空间分布.tif'])

        directory = QFileDialog.getExistingDirectory(self,u'请选择图片保存位置',
                                                     u'E:/Documents/工作/雷电公报',
                                    QFileDialog.ShowDirsOnly|QFileDialog.DontResolveSymlinks)

        dest_density = os.path.join(directory,os.path.basename(densityPic))
        dest_day = os.path.join(directory,os.path.basename(dayPic))

        if os.path.isfile(dest_day) or os.path.isfile(dest_density):
            message = u"文件已经存在!"
            msgBox = QMessageBox()
            msgBox.setText(message)
            msgBox.setIcon(QMessageBox.Information)
            icon = QIcon()
            icon.addPixmap(QPixmap("./resource/weather-thunder.png"), QIcon.Normal, QIcon.Off)
            msgBox.setWindowIcon(icon)
            msgBox.setWindowTitle(" ")
            msgBox.exec_()
            return

        move(dayPic,directory)
        move(densityPic,directory)

    def openMxdDay(self):
        program  = u'C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe'
        src_dir = ''.join([cwd,u'/data/LightningBulletin.gdb'])
        dest_dir = ''.join([cwd,u"/bulletinTemp/",self.in_parameters[u'datetime'], u"/" , self.in_parameters[u'target_area']])
        src_file = ''.join([self.in_parameters[u'target_area'] , u"地闪雷暴日空间分布模板.mxd"])

        copy(os.path.join(src_dir,src_file),dest_dir)

        arguments = [os.path.join(dest_dir,src_file)]
        self.process = QProcess(self)
        self.process.start(program,arguments)

    def openMxdDensity(self):
        program  = u'C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe'
        src_dir = ''.join([cwd,u'/data/LightningBulletin.gdb'])
        dest_dir = ''.join([cwd,u"/bulletinTemp/",self.in_parameters[u'datetime'], u"/" , self.in_parameters[u'target_area']])
        src_file = ''.join([self.in_parameters[u'target_area'] ,u"闪电密度空间分布模板.mxd"])


        copy(os.path.join(src_dir,src_file),dest_dir)

        arguments = [os.path.join(dest_dir,src_file)]
        self.process = QProcess(self)
        self.process.start(program,arguments)

    def showAbout(self):
        self.about = About_Dialog()

    def showHelp(self):
        program  = u'C:/Windows/hh.exe'
        arguments = [''.join([cwd,'/help/help.CHM'])]
        self.process = QProcess(self)
        self.process.start(program,arguments)

    def updateTargetArea(self, area):
        self.in_parameters[u'target_area'] = area

    def updateDatetime(self, date):
        self.in_parameters[u'datetime'] = str(date.year()) + u'年'
        if self.in_parameters.has_key(u'origin_data_path'):
            self.in_parameters.__delitem__(u'origin_data_path')

    def updateDensityCell(self, cell):
        self.in_parameters[u'density_cell'] = str(cell)

    def updateDensityClass(self, nclass):
        self.in_parameters[u'density_class'] = nclass

    def updateDayCell(self, cell):
        self.in_parameters[u'day_cell'] = str(cell)


    def updateDayClass(self, nclass):
        self.in_parameters[u'day_class'] = nclass

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def retranslateUi(self):
        _translate = QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "绍兴防雷中心 雷电公报制图"))
        self.datetime_label.setText(_translate("MainWindow", "年份"))
        self.datetime.setDisplayFormat(_translate("MainWindow", "yyyy"))
        self.target_area_label.setText(_translate("MainWindow", "地区"))
        self.target_area.setItemText(0, _translate("MainWindow", "绍兴市"))
        self.target_area.setItemText(1, _translate("MainWindow", "柯桥区"))
        self.target_area.setItemText(2, _translate("MainWindow", "上虞区"))
        self.target_area.setItemText(3, _translate("MainWindow", "诸暨市"))
        self.target_area.setItemText(4, _translate("MainWindow", "嵊州市"))
        self.target_area.setItemText(5, _translate("MainWindow", "新昌县"))
        self.density_cell_label.setText(_translate("MainWindow", "插值网格大小"))
        self.density_class_label.setText(_translate("MainWindow", "制图分类数目"))
        self.density_mxd.setText(_translate("MainWindow", "ArcGIS文档"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.density_tab), _translate("MainWindow", "电闪密度"))
        self.day_cell_label.setText(_translate("MainWindow", "插值网格大小"))
        self.day_class_label.setText(_translate("MainWindow", "制图分类数目"))
        self.day_mxd.setText(_translate("MainWindow", "ArcGIS文档"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.day_tab), _translate("MainWindow", "雷暴日"))
        self.execute_button.setText(_translate("MainWindow", "执行"))
        self.file_menu.setTitle(_translate("MainWindow", "文件"))
        self.help_menu.setTitle(_translate("MainWindow", "帮助"))
        self.action_add_data.setText(_translate("MainWindow", "加载数据"))
        self.action_help.setText(_translate("MainWindow", "使用说明"))
        self.action_about.setText(_translate("MainWindow", "关于"))
        self.action_save_pic.setText(_translate("MainWindow", "图片另存为"))
Example #10
0
class StatsWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self.canvas, self)

        self.date = datetime.today()
        self.date = self.date.strftime('%Y-%m-%d')

        self.l1 = QLabel('Please choose the period of time for which to diplay the data: ')
        self.buttonDaily = QPushButton('daily')
        self.buttonMonthly = QPushButton('monthly')
        self.buttonPeriod = QPushButton('set period')

        self.buttonDaily.clicked.connect(self.daily)
        self.buttonMonthly.clicked.connect(self.monthly)
        self.buttonPeriod.clicked.connect(self.period)

        sublayoutTime = QHBoxLayout()
        sublayoutTime.addWidget(self.l1)
        sublayoutTime.addWidget(self.buttonDaily)
        sublayoutTime.addWidget(self.buttonMonthly)
        sublayoutTime.addWidget(self.buttonPeriod)
        sublayoutTime.setAlignment(Qt.AlignRight);

        self.l2 = QLabel('Select the date: ')
        self.l3 = QLabel('   Select the end date: ')

        self.dateedit = QDateEdit(calendarPopup=True)
        self.dateedit.setDateTime(QDateTime.currentDateTime())
        self.startDate = QDateEdit(calendarPopup=True)
        self.startDate.setDateTime(QDateTime.currentDateTime())
        self.endDate = QDateEdit(calendarPopup=True)
        self.endDate.setDateTime(QDateTime.currentDateTime())

        self.l3.hide()
        self.startDate.hide()
        self.endDate.hide()

        self.monthList = QDateEdit()
        self.monthList.setDisplayFormat("MMM")
        self.monthList.setDateTime(QDateTime.currentDateTime())
        self.monthList.hide()

        self.yearList = QDateEdit()
        self.yearList.setDisplayFormat("yyyy")
        self.yearList.setDateTime(QDateTime.currentDateTime())
        self.yearList.hide()

        self.l4 = QLabel("'Start date' should be before 'end date'!")
        self.l4.setStyleSheet("QWidget {color : rgba(255,0,0,255);}")
        self.l4.hide()

        sublayoutSelectDate = QHBoxLayout()
        sublayoutSelectDate.addWidget(self.l2)
        sublayoutSelectDate.addWidget(self.dateedit)
        sublayoutSelectDate.addWidget(self.monthList)
        sublayoutSelectDate.addWidget(self.yearList)
        sublayoutSelectDate.addWidget(self.startDate)
        sublayoutSelectDate.addWidget(self.l3)
        sublayoutSelectDate.addWidget(self.endDate)
        sublayoutSelectDate.setAlignment(Qt.AlignRight);

        self.button_show_layout = QHBoxLayout()
        self.buttonShow = QPushButton('Show Analytics')
        self.buttonShow.clicked.connect(self.update)
        self.button_show_layout.addWidget(QLabel())
        self.button_show_layout.addWidget(QLabel())
        self.button_show_layout.addWidget(self.buttonShow)

        sublayoutTimeSelect = QVBoxLayout()
        sublayoutTimeSelect.addLayout(sublayoutTime)
        sublayoutTimeSelect.addLayout(sublayoutSelectDate)
        sublayoutTimeSelect.addWidget(self.l4, alignment=Qt.AlignRight)
        sublayoutTimeSelect.addLayout(self.button_show_layout)

        self.button1 = QPushButton('Hourly Call Summary')
        self.button2 = QPushButton('Initial Calling Outcome')
        self.button3 = QPushButton('Redirected Calls')
        self.button4 = QPushButton('IVR Call Drop Rate')

        self.outcomes, self.time, self.redirect = return_daily_data(self.date)
        self.graph = 1
        self.period = 'daily'
        self.day = datetime.today().strftime('%d %B %Y')
        self.month = datetime.today().strftime('%B')
        self.year = datetime.today().strftime('%Y')
        self.fromDate = datetime.today().strftime('%d %B %Y')
        self.toDate = datetime.today().strftime('%d %B %Y')
        self.plot1()

        self.button1.clicked.connect(self.plot1)
        self.button2.clicked.connect(self.plot2)
        self.button3.clicked.connect(self.plot3)
        self.button4.clicked.connect(self.plot4)

        sublayout1 = QHBoxLayout()
        sublayout1.addWidget(self.button1)
        sublayout1.addWidget(self.button2)

        sublayout2 = QHBoxLayout()
        sublayout2.addWidget(self.button3)
        sublayout2.addWidget(self.button4)

        sublayout = QVBoxLayout()
        sublayout.addLayout(sublayout1)
        sublayout.addLayout(sublayout2)

        back_button_creator = BackButton()
        self.back_button = back_button_creator.create_back_button()
        back_layout = back_button_creator.create_back_layout(self.back_button)

        main_layout = QVBoxLayout()
        main_layout.addWidget(self.toolbar)
        main_layout.addLayout(sublayoutTimeSelect)
        main_layout.addWidget(self.canvas)
        main_layout.addLayout(sublayout)
        main_layout.addLayout(back_layout)

        self.setLayout(main_layout)

    def update(self):
        self.l4.hide()
        if self.period == 'daily':
            date = self.dateedit.date().toPyDate().strftime('%Y-%m-%d')
            self.outcomes, self.time, self.redirect = return_daily_data(date)
            self.day = self.dateedit.date().toPyDate().strftime('%d %B %Y')
            print(self.day)
        elif self.period == 'monthly':
            month = self.monthList.date().toPyDate().strftime('%m')
            year = self.yearList.date().toPyDate().strftime('%Y')
            self.outcomes, self.time, self.redirect = return_monthly_data(year + '-' + month)
            self.month = self.monthList.date().toPyDate().strftime('%B')
            self.year = self.yearList.date().toPyDate().strftime('%Y')
        elif self.period == 'period':
            start = self.startDate.date().toPyDate()
            end = self.endDate.date().toPyDate()
            if start > end:
                self.l4.show()
            else:
                self.outcomes, self.time, self.redirect = return_period_data(start, end)
            self.fromDate = self.startDate.date().toPyDate().strftime('%d %B %Y')
            self.toDate = self.endDate.date().toPyDate().strftime('%d %B %Y')
        if self.graph == 1:
            self.plot1()
        elif self.graph == 2:
            self.plot2()
        elif self.graph == 3:
            self.plot3()
        else:
            self.plot4()

    def daily(self):
        self.period = 'daily'
        self.dateedit.show()
        self.monthList.hide()
        self.l2.setText('Select the date: ')
        self.l3.hide()
        self.startDate.hide()
        self.endDate.hide()
        self.update()
        self.monthList.hide()
        self.yearList.hide()

    def monthly(self):
        self.period = 'monthly'
        self.dateedit.hide()
        self.monthList.show();
        self.l2.setText('Select the month: ')
        self.l3.hide()
        self.startDate.hide()
        self.endDate.hide()
        self.update()
        self.monthList.show()
        self.yearList.show()

    def period(self):
        self.period = 'period'
        self.dateedit.hide()
        self.monthList.hide()
        self.l2.setText('Select the start date: ')
        self.l3.show()
        self.startDate.show()
        self.endDate.show()
        self.update()
        self.monthList.hide()
        self.yearList.hide()

    def plot1(self):

        COLOR = 'dimgrey'
        matplotlib.rcParams['text.color'] = COLOR
        matplotlib.rcParams['axes.labelcolor'] = COLOR
        matplotlib.rcParams['xtick.color'] = COLOR
        matplotlib.rcParams['ytick.color'] = COLOR
        matplotlib.rcParams['lines.color'] = COLOR

        self.graph = 1
        self.figure.clear()

        ax = self.figure.add_subplot()

        hours = ['Before 08:00', '08:00 - 10:00', '10:00 - 12:00', '12:00 - 14:00', '14:00 - 16:00',
                 '16:00 - 18:00', 'After 18:00']

        plt.plot(hours, self.time, marker='o')

        if self.period == 'daily':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                plt.title('There were no incoming calls on  ' + self.day, color='black')
            else:
                plt.title('Hourly call summary on  ' + self.day, color='black')
        elif self.period == 'monthly':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                plt.title('There were no incoming calls on  ' + self.month + ' ' + self.year, color='black')
            else:
                plt.title('Hourly call summary on  ' + self.month + ' ' + self.year, color='black')
        else:
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                plt.title('There were no incoming calls from  ' + self.fromDate + '  to  ' + self.toDate,
                          color='black')
            else:
                plt.title('Hourly call summary from  ' + self.fromDate + '  to  ' + self.toDate, color='black')

        plt.ylabel('Number of calls')

        self.figure.tight_layout()
        self.figure.autofmt_xdate()

        plt.grid(linestyle='--', linewidth=0.3)

        self.canvas.draw()

    def plot2(self):

        self.graph = 2
        self.figure.clear()

        ax = self.figure.add_subplot()

        possible_outcomes = ('Answered', 'No answer', 'Busy', 'Failed')
        y_pos = np.arange(len(possible_outcomes))

        ax.barh(possible_outcomes, self.outcomes[:4])

        if self.period == 'daily':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls on  ' + self.day, color='black')
            else:
                ax.set_title('Outcome of all incoming calls on  ' + self.day, color='black')
        elif self.period == 'monthly':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls on  ' + self.month + ' ' + self.year, color='black')
            else:
                ax.set_title('Outcome of all incoming calls on  ' + self.month + ' ' + self.year, color='black')
        else:
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls from  ' + self.fromDate + '  to  ' + self.toDate,
                             color='black')
            else:
                ax.set_title('Outcome of all incoming calls from  ' + self.fromDate + '  to  ' + self.toDate,
                             color='black')
        ax.set_yticks(y_pos)
        ax.set_yticklabels(possible_outcomes)
        ax.invert_yaxis()
        ax.set_xlabel('Number of calls')

        self.figure.tight_layout()

        plt.grid(linestyle='--', linewidth=0.3)

        self.canvas.draw()

    def plot3(self):

        self.graph = 3
        self.figure.clear()

        ax = self.figure.add_subplot()

        keys = list(self.redirect.keys())
        values = list(self.redirect.values())

        ax.bar(keys, values, width=0.4)
        ax.set_ylabel('Number of Calls')

        if self.period == 'daily':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls on  ' + self.day, color='black')
            else:
                ax.set_title('Redirected calls on  ' + self.day, color='black')
        elif self.period == 'monthly':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls on  ' + self.month + ' ' + self.year, color='black')
            else:
                ax.set_title('Redirected calls on  ' + self.month + ' ' + self.year, color='black')
        else:
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls from  ' + self.fromDate + '  to  ' + self.toDate,
                             color='black')
            else:
                ax.set_title('Redirected calls from  ' + self.fromDate + '  to  ' + self.toDate, color='black')

        self.figure.tight_layout()

        plt.grid(linestyle='--', linewidth=0.3)

        self.canvas.draw()

    def plot4(self):

        self.graph = 4
        self.figure.clear()

        ax = self.figure.add_subplot()

        total_calls = self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3]
        percentages = [0, 0]
        if total_calls != 0:
            dropped_percent = self.outcomes[4] * 100 / total_calls
            percentages = [100 - dropped_percent, dropped_percent]
        labels = ['Successful IVR Calls', 'Dropped IVR Calls']
        explode = (0, 0.1)

        ax.pie(percentages, explode=explode, labels=labels, autopct='%1.1f%%', textprops={'color': "k"},
                           shadow=True, startangle=-45)
        ax.axis('equal')

        if self.period == 'daily':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls on  ' + self.day, color='black')
            else:
                ax.set_title('Call setup success rate on  ' + self.day, color='black')
        elif self.period == 'monthly':
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls on  ' + self.month + ' ' + self.year, color='black')
            else:
                ax.set_title('IVR call drop rate on  ' + self.month + ' ' + self.year, color='black')
        else:
            if self.outcomes[0] + self.outcomes[1] + self.outcomes[2] + self.outcomes[3] == 0:
                ax.set_title('There were no incoming calls from  ' + self.fromDate + '  to  ' + self.toDate,
                             color='black')
            else:
                ax.set_title('Call setup success rate from  ' + self.fromDate + '  to  ' + self.toDate,
                             color='black')
        self.canvas.draw()