Files
ths-datenlogger/src/main/python/main.py
2022-03-05 23:57:53 +01:00

305 lines
11 KiB
Python
Executable File

#!/usr/bin/python3
from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtCore import QDateTime, Qt, QTimer, QUrl
import PyQt5.QtCore
import PyQt5.QtGui
from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
QDial, QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
QProgressBar, QPushButton, QRadioButton, QScrollBar, QSizePolicy,
QSlider, QSpinBox, QStyleFactory, QTableWidget, QTabWidget, QTextEdit,
QVBoxLayout, QWidget, QFileDialog, QDateEdit, QMessageBox, QTextBrowser)
import localization.de as de
import sys
import datetime as dt
import input_backend
import plot
import traceback
import config_parse as cp
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
self.truePath = plot.plot(self.datapoints, path=target,
date1=startDateTime,
date2=endDateTime,
forcePath=forcePath,
qtTextBrowser=self.infoTextBox)
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.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)
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
if __name__ == '__main__':
appctxt = ApplicationContext()
gallery = WidgetGallery()
gallery.show()
sys.exit(appctxt.app.exec_())