Pegelonline/poGraph2.py

118 lines
3.9 KiB
Python

import ctypes
from urllib.parse import quote
from PyQt5 import QtCore, QtGui
from PyQt5 import QtWidgets
from .pomodules import poBaseURL
from .pomodules.urlreader import UrlReader
class PoGraphDisplay(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setupUi(self)
# Layer
self.layer = None
def setupUi(self, poGraphDisplay):
"""Definition der Benutzeroberflaeche des Wasserstanddiagramms mit den dazugehoerigen Funktionen."""
# uebergeordnetes Layout
self.verticalLayout = QtWidgets.QVBoxLayout(poGraphDisplay)
# Erste Zeile ---
self.horizontalLayout = QtWidgets.QHBoxLayout()
# Label Station
self.lbStation = QtWidgets.QLabel()
self.lbStation.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.horizontalLayout.addWidget(self.lbStation)
self.lbStation.setText("Geben Sie hier eine Station ein:")
# ComboBox Stations
self.comboBox = QtWidgets.QComboBox()
self.comboBox.setEditable(True)
self.horizontalLayout.addWidget(self.comboBox)
# Label Tage
self.lbTage = QtWidgets.QLabel()
self.lbTage.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.lbTage.setText("Tage")
self.horizontalLayout.addWidget(self.lbTage)
# SpinBox Tage
self.sbTage = QtWidgets.QSpinBox()
self.sbTage.setMinimum(5)
self.sbTage.setMaximum(30)
self.sbTage.setProperty("value", 14)
self.horizontalLayout.addWidget(self.sbTage)
# PushButton Laden
self.pbLaden = QtWidgets.QPushButton()
self.pbLaden.setObjectName("pbLaden")
self.pbLaden.setText("Laden")
self.horizontalLayout.addWidget(self.pbLaden)
# Signal Slots
self.pbLaden.clicked.connect(self.doPbLaden)
self.verticalLayout.addLayout(self.horizontalLayout)
# Zweite Zeile ---
# Label fuer den Graphen
self.lbGraph = QtWidgets.QLabel()
self.lbGraph.setText("")
self.lbGraph.setObjectName("lbGraph")
self.verticalLayout.addWidget(self.lbGraph)
# Quellenhinweis
self.lbDatenquelle = QtWidgets.QLabel()
self.lbDatenquelle.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignLeading | QtCore.Qt.AlignVCenter)
self.lbDatenquelle.setText("Die Daten werden von 'pegelonline.wsv.de' zur Verfügung gestellt.")
self.verticalLayout.addWidget(self.lbDatenquelle)
# Dritte Zeile ---
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
def doLoadGraph(self):
"""Laedt die Stationsdaten anhand der vom Nutzer eingegebenen Daten."""
# Anzahl der Tage in der SpinBox
days = self.getCurrentDays()
# Stationsname aus der ComboBox
station = quote(self.getCurrentStation())
url = poBaseURL + "/stations/%s/W/measurements.png?start=P%dD" % (station, days)
ur = UrlReader(url)
self.img_data = ur.getDataResponse()
if ur.code > 299:
AlertBox = ctypes.windll.user32.MessageBoxW
AlertBox(None, "Beim Laden der Daten ist ein Fehler aufgetreten.", "Fehler", 0)
else:
# Grafik einsetzen
pixmap = QtGui.QPixmap()
pixmap.loadFromData(self.img_data)
self.lbGraph.clear()
self.lbGraph.setPixmap(pixmap)
self.lbGraph.resize(pixmap.width(), pixmap.height())
def doPbLaden(self):
"""Laedt den Graphen der ausgewaehlten Station."""
if self.layer is None:
self.doLoadGraph()
def getCurrentDays(self):
return self.sbTage.value()
def getCurrentStation(self):
return self.comboBox.currentText()