mirror of
https://github.com/FAUSheppy/ths-datenlogger
synced 2025-12-09 05:08:32 +01:00
305 lines
11 KiB
Python
Executable File
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_())
|