<p>这里有一种稍微不同的方法,它不使用PyQt5,而是使用PySide2作为Python Qt5绑定:</p>
<pre><code>from PySide2 import QtWidgets, QtCore
from matplotlib.backends.backend_qt5agg import (
FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
import metpy.calc as mpcalc
from metpy.plots import SkewT
from metpy.units import pandas_dataframe_to_unit_arrays
from siphon.simplewebservice.wyoming import WyomingUpperAir
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)
mainLayout = QtWidgets.QHBoxLayout(self._main)
self.skew = SkewT()
self.skew.ax.set_ylim(1050, 100)
self.skew.ax.set_xlim(-50, 40)
self.skew.plot_dry_adiabats()
self.skew.plot_moist_adiabats()
self.skew.plot_mixing_lines()
self._temp_line, = self.skew.plot([], [], 'tab:red')
self._dewp_line, = self.skew.plot([], [], 'tab:blue')
self._prof_line, = self.skew.plot([], [], 'black')
self._canvas = FigureCanvas(self.skew.ax.figure)
mainLayout.addWidget(self._canvas, stretch=0)
configLayout = QtWidgets.QGridLayout()
updateButton = QtWidgets.QPushButton('Update')
updateButton.clicked.connect(self._update_data)
configLayout.addWidget(updateButton, 4, 1)
configLayout.setRowStretch(3, 1)
configLayout.addWidget(QtWidgets.QLabel('Site:'), 0, 0)
self._site_select = QtWidgets.QLineEdit('OUN')
configLayout.addWidget(self._site_select, 0, 1)
configLayout.addWidget(QtWidgets.QLabel('Date:'), 1, 0)
self._date_select = QtWidgets.QDateTimeEdit(QtCore.QDateTime(2019, 3, 20, 12, 0, 0))
configLayout.addWidget(self._date_select, 1, 1)
self._parcel_check = QtWidgets.QCheckBox('Surface Parcel')
self._parcel_check.toggled.connect(self._handle_prof)
configLayout.addWidget(self._parcel_check, 2, 0)
mainLayout.addLayout(configLayout, stretch=1)
self._update_data()
self._handle_prof()
@QtCore.Slot()
def _update_data(self):
try:
print(self._date_select.dateTime().toPython(), self._site_select.text())
self._data = WyomingUpperAir.request_data(self._date_select.dateTime().toPython(),
self._site_select.text())
self._data = pandas_dataframe_to_unit_arrays(self._data)
self._temp_line.set_data(self._data['temperature'].m, self._data['pressure'].m)
self._dewp_line.set_data(self._data['dewpoint'].m, self._data['pressure'].m)
self.flush()
except ValueError as e:
print(e)
def flush(self):
self._canvas.draw()
self._main.repaint()
@QtCore.Slot()
def _handle_prof(self):
if self._parcel_check.isChecked():
prof_press, _, _, prof_temp = mpcalc.parcel_profile_with_lcl(self._data['pressure'],
self._data['temperature'],
self._data['dewpoint'])
self._prof_line.set_data(prof_temp.to('degC').m, prof_press.to('hPa').m)
else:
self._prof_line.set_data([], [])
self.flush()
if __name__ == "__main__":
import sys
qapp = QtWidgets.QApplication(sys.argv)
app = ApplicationWindow()
app.show()
qapp.exec_()
</code></pre>