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_()
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')
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)
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())
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)
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
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())
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", "图片另存为"))
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()