diff --git a/README.md b/README.md index da8b434..f945cc7 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ found [on my site](http://martinfitzpatrick.name/tag/pyqt). All code is **licensed under an MIT license**. This allows you to re-use the code freely, -remixed in both commercial and non-commercial projects. The only requirement is that you must -include the MIT license file when distributing. +remixed in both commercial and non-commercial projects. The only requirement is to +include the same license when distributing. ## Completed @@ -29,13 +29,13 @@ include the MIT license file when distributing. 1. Media Player - "Failamp" 1. Post-it Notes - "Brown Note" (QtDesigner) 1. Paint - "Piecasso" (QtDesigner) -1. Translator - "Babelvis" (QtDesigner) 1. Unzip - "7Pez" (QtDesigner) +1. Translator - "Translataar" (QtDesigner) +1. Weather - "Raindar" (QtDesigner) ## In progress 1. Currency converter (QtDesigner, PyQtGraph) -1. RSS Reader (QtDesigner) ## Up next @@ -52,7 +52,6 @@ include the MIT license file when distributing. 1. (Audio) Spectrum Analyzer 1. IM (Jabber) 1. FTP -1. Weather 1. Finance/Stocks 1. Process Explorer 1. Internet Radio diff --git a/translate/mainwindow.ui b/translate/mainwindow.ui index 9b45680..ad04383 100644 --- a/translate/mainwindow.ui +++ b/translate/mainwindow.ui @@ -11,7 +11,7 @@ - Babelvis + Translataaaar @@ -31,14 +31,14 @@ - 50 - 75 + 75 + 50 - 50 - 75 + 75 + 50 @@ -49,43 +49,20 @@ - images/locale.pngimages/locale.png + images/flag.pngimages/flag.png - - - - - + - 50 - 75 + 75 + 50 - - - 50 - 75 - - - - Reverse translate - - - - - - - images/arrow-return-180.pngimages/arrow-return-180.png - - - - diff --git a/weather/MainWindow.py b/weather/MainWindow.py new file mode 100644 index 0000000..d9ac50a --- /dev/null +++ b/weather/MainWindow.py @@ -0,0 +1,283 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'mainwindow.ui' +# +# Created by: PyQt5 UI code generator 5.10 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(330, 417) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) + self.lineEdit.setObjectName("lineEdit") + self.horizontalLayout_3.addWidget(self.lineEdit) + self.pushButton = QtWidgets.QPushButton(self.centralwidget) + self.pushButton.setText("") + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap("images/arrow-circle-225.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.pushButton.setIcon(icon) + self.pushButton.setObjectName("pushButton") + self.horizontalLayout_3.addWidget(self.pushButton) + self.verticalLayout.addLayout(self.horizontalLayout_3) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.weatherIcon = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.weatherIcon.sizePolicy().hasHeightForWidth()) + self.weatherIcon.setSizePolicy(sizePolicy) + self.weatherIcon.setMinimumSize(QtCore.QSize(16, 16)) + self.weatherIcon.setMaximumSize(QtCore.QSize(16, 16)) + self.weatherIcon.setText("") + self.weatherIcon.setObjectName("weatherIcon") + self.horizontalLayout_4.addWidget(self.weatherIcon) + self.weatherLabel = QtWidgets.QLabel(self.centralwidget) + self.weatherLabel.setText("") + self.weatherLabel.setObjectName("weatherLabel") + self.horizontalLayout_4.addWidget(self.weatherLabel) + self.verticalLayout.addLayout(self.horizontalLayout_4) + self.gridLayout_2 = QtWidgets.QGridLayout() + self.gridLayout_2.setObjectName("gridLayout_2") + self.forecastIcon4 = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.forecastIcon4.sizePolicy().hasHeightForWidth()) + self.forecastIcon4.setSizePolicy(sizePolicy) + self.forecastIcon4.setMinimumSize(QtCore.QSize(16, 16)) + self.forecastIcon4.setMaximumSize(QtCore.QSize(200, 16)) + self.forecastIcon4.setBaseSize(QtCore.QSize(0, 0)) + self.forecastIcon4.setText("") + self.forecastIcon4.setAlignment(QtCore.Qt.AlignCenter) + self.forecastIcon4.setObjectName("forecastIcon4") + self.gridLayout_2.addWidget(self.forecastIcon4, 1, 3, 1, 1) + self.forecastTemp2 = QtWidgets.QLabel(self.centralwidget) + self.forecastTemp2.setText("") + self.forecastTemp2.setObjectName("forecastTemp2") + self.gridLayout_2.addWidget(self.forecastTemp2, 2, 1, 1, 1) + self.forecastTemp5 = QtWidgets.QLabel(self.centralwidget) + self.forecastTemp5.setText("") + self.forecastTemp5.setObjectName("forecastTemp5") + self.gridLayout_2.addWidget(self.forecastTemp5, 2, 4, 1, 1) + self.forecastTemp4 = QtWidgets.QLabel(self.centralwidget) + self.forecastTemp4.setText("") + self.forecastTemp4.setObjectName("forecastTemp4") + self.gridLayout_2.addWidget(self.forecastTemp4, 2, 3, 1, 1) + self.forecastIcon2 = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.forecastIcon2.sizePolicy().hasHeightForWidth()) + self.forecastIcon2.setSizePolicy(sizePolicy) + self.forecastIcon2.setMinimumSize(QtCore.QSize(16, 16)) + self.forecastIcon2.setMaximumSize(QtCore.QSize(200, 16)) + self.forecastIcon2.setBaseSize(QtCore.QSize(0, 0)) + self.forecastIcon2.setText("") + self.forecastIcon2.setAlignment(QtCore.Qt.AlignCenter) + self.forecastIcon2.setObjectName("forecastIcon2") + self.gridLayout_2.addWidget(self.forecastIcon2, 1, 1, 1, 1) + self.forecastIcon5 = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.forecastIcon5.sizePolicy().hasHeightForWidth()) + self.forecastIcon5.setSizePolicy(sizePolicy) + self.forecastIcon5.setMinimumSize(QtCore.QSize(16, 16)) + self.forecastIcon5.setMaximumSize(QtCore.QSize(200, 16)) + self.forecastIcon5.setBaseSize(QtCore.QSize(0, 0)) + self.forecastIcon5.setText("") + self.forecastIcon5.setAlignment(QtCore.Qt.AlignCenter) + self.forecastIcon5.setObjectName("forecastIcon5") + self.gridLayout_2.addWidget(self.forecastIcon5, 1, 4, 1, 1) + self.forecastIcon1 = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.forecastIcon1.sizePolicy().hasHeightForWidth()) + self.forecastIcon1.setSizePolicy(sizePolicy) + self.forecastIcon1.setMinimumSize(QtCore.QSize(16, 16)) + self.forecastIcon1.setMaximumSize(QtCore.QSize(200, 16)) + self.forecastIcon1.setBaseSize(QtCore.QSize(0, 0)) + self.forecastIcon1.setText("") + self.forecastIcon1.setAlignment(QtCore.Qt.AlignCenter) + self.forecastIcon1.setObjectName("forecastIcon1") + self.gridLayout_2.addWidget(self.forecastIcon1, 1, 0, 1, 1) + self.forecastIcon3 = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.forecastIcon3.sizePolicy().hasHeightForWidth()) + self.forecastIcon3.setSizePolicy(sizePolicy) + self.forecastIcon3.setMinimumSize(QtCore.QSize(16, 16)) + self.forecastIcon3.setMaximumSize(QtCore.QSize(200, 16)) + self.forecastIcon3.setBaseSize(QtCore.QSize(0, 0)) + self.forecastIcon3.setText("") + self.forecastIcon3.setAlignment(QtCore.Qt.AlignCenter) + self.forecastIcon3.setObjectName("forecastIcon3") + self.gridLayout_2.addWidget(self.forecastIcon3, 1, 2, 1, 1) + self.forecastTemp3 = QtWidgets.QLabel(self.centralwidget) + self.forecastTemp3.setText("") + self.forecastTemp3.setObjectName("forecastTemp3") + self.gridLayout_2.addWidget(self.forecastTemp3, 2, 2, 1, 1) + self.forecastTemp1 = QtWidgets.QLabel(self.centralwidget) + self.forecastTemp1.setText("") + self.forecastTemp1.setObjectName("forecastTemp1") + self.gridLayout_2.addWidget(self.forecastTemp1, 2, 0, 1, 1) + self.forecastTime1 = QtWidgets.QLabel(self.centralwidget) + self.forecastTime1.setAlignment(QtCore.Qt.AlignCenter) + self.forecastTime1.setObjectName("forecastTime1") + self.gridLayout_2.addWidget(self.forecastTime1, 0, 0, 1, 1) + self.forecastTime2 = QtWidgets.QLabel(self.centralwidget) + self.forecastTime2.setAlignment(QtCore.Qt.AlignCenter) + self.forecastTime2.setObjectName("forecastTime2") + self.gridLayout_2.addWidget(self.forecastTime2, 0, 1, 1, 1) + self.forecastTime3 = QtWidgets.QLabel(self.centralwidget) + self.forecastTime3.setAlignment(QtCore.Qt.AlignCenter) + self.forecastTime3.setObjectName("forecastTime3") + self.gridLayout_2.addWidget(self.forecastTime3, 0, 2, 1, 1) + self.forecastTime4 = QtWidgets.QLabel(self.centralwidget) + self.forecastTime4.setAlignment(QtCore.Qt.AlignCenter) + self.forecastTime4.setObjectName("forecastTime4") + self.gridLayout_2.addWidget(self.forecastTime4, 0, 3, 1, 1) + self.forecastTime5 = QtWidgets.QLabel(self.centralwidget) + self.forecastTime5.setAlignment(QtCore.Qt.AlignCenter) + self.forecastTime5.setObjectName("forecastTime5") + self.gridLayout_2.addWidget(self.forecastTime5, 0, 4, 1, 1) + self.verticalLayout.addLayout(self.gridLayout_2) + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setObjectName("gridLayout") + self.formLayout = QtWidgets.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.label_5 = QtWidgets.QLabel(self.centralwidget) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.label_5.setFont(font) + self.label_5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_5.setObjectName("label_5") + self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_5) + self.label_6 = QtWidgets.QLabel(self.centralwidget) + self.label_6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_6.setObjectName("label_6") + self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_6) + self.temperatureLabel = QtWidgets.QLabel(self.centralwidget) + self.temperatureLabel.setText("") + self.temperatureLabel.setObjectName("temperatureLabel") + self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.temperatureLabel) + self.label_7 = QtWidgets.QLabel(self.centralwidget) + self.label_7.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_7.setObjectName("label_7") + self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_7) + self.humidityLabel = QtWidgets.QLabel(self.centralwidget) + self.humidityLabel.setText("") + self.humidityLabel.setObjectName("humidityLabel") + self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.humidityLabel) + self.label_8 = QtWidgets.QLabel(self.centralwidget) + self.label_8.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_8.setObjectName("label_8") + self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_8) + self.pressureLabel = QtWidgets.QLabel(self.centralwidget) + self.pressureLabel.setText("") + self.pressureLabel.setObjectName("pressureLabel") + self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.pressureLabel) + self.label = QtWidgets.QLabel(self.centralwidget) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label.setObjectName("label") + self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label) + self.label_2 = QtWidgets.QLabel(self.centralwidget) + self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_2.setObjectName("label_2") + self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.label_2) + self.longitudeLabel = QtWidgets.QLabel(self.centralwidget) + self.longitudeLabel.setText("") + self.longitudeLabel.setObjectName("longitudeLabel") + self.formLayout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.longitudeLabel) + self.label_3 = QtWidgets.QLabel(self.centralwidget) + self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_3.setObjectName("label_3") + self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.label_3) + self.latitudeLabel = QtWidgets.QLabel(self.centralwidget) + self.latitudeLabel.setText("") + self.latitudeLabel.setObjectName("latitudeLabel") + self.formLayout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.latitudeLabel) + self.label_4 = QtWidgets.QLabel(self.centralwidget) + self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_4.setObjectName("label_4") + self.formLayout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.label_4) + self.sunriseLabel = QtWidgets.QLabel(self.centralwidget) + self.sunriseLabel.setText("") + self.sunriseLabel.setObjectName("sunriseLabel") + self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.sunriseLabel) + self.label_9 = QtWidgets.QLabel(self.centralwidget) + self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_9.setObjectName("label_9") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_9) + self.label_10 = QtWidgets.QLabel(self.centralwidget) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.label_10.setFont(font) + self.label_10.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.label_10.setObjectName("label_10") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_10) + self.windLabel = QtWidgets.QLabel(self.centralwidget) + self.windLabel.setText("") + self.windLabel.setObjectName("windLabel") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.windLabel) + self.label_11 = QtWidgets.QLabel(self.centralwidget) + self.label_11.setText("") + self.label_11.setObjectName("label_11") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.label_11) + self.label_13 = QtWidgets.QLabel(self.centralwidget) + self.label_13.setText("") + self.label_13.setObjectName("label_13") + self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.label_13) + self.label_12 = QtWidgets.QLabel(self.centralwidget) + self.label_12.setText("") + self.label_12.setObjectName("label_12") + self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.label_12) + self.gridLayout.addLayout(self.formLayout, 1, 0, 1, 1) + self.verticalLayout.addLayout(self.gridLayout) + self.horizontalLayout.addLayout(self.verticalLayout) + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Raindar")) + self.lineEdit.setText(_translate("MainWindow", "Utrecht,the Netherlands")) + self.forecastTime1.setText(_translate("MainWindow", "+3h")) + self.forecastTime2.setText(_translate("MainWindow", "+6h")) + self.forecastTime3.setText(_translate("MainWindow", "+9h")) + self.forecastTime4.setText(_translate("MainWindow", "+12h")) + self.forecastTime5.setText(_translate("MainWindow", "+15h")) + self.label_5.setText(_translate("MainWindow", "Barometer")) + self.label_6.setText(_translate("MainWindow", "Temperature")) + self.label_7.setText(_translate("MainWindow", "Humidity")) + self.label_8.setText(_translate("MainWindow", "Pressure")) + self.label.setText(_translate("MainWindow", "Location")) + self.label_2.setText(_translate("MainWindow", "Longitude")) + self.label_3.setText(_translate("MainWindow", "Latitude")) + self.label_4.setText(_translate("MainWindow", "Sunrise")) + self.label_9.setText(_translate("MainWindow", "Speed")) + self.label_10.setText(_translate("MainWindow", "Wind")) + diff --git a/weather/images/01d.png b/weather/images/01d.png new file mode 100755 index 0000000..ff082c8 Binary files /dev/null and b/weather/images/01d.png differ diff --git a/weather/images/01n.png b/weather/images/01n.png new file mode 100755 index 0000000..545b6f9 Binary files /dev/null and b/weather/images/01n.png differ diff --git a/weather/images/02d.png b/weather/images/02d.png new file mode 100755 index 0000000..0696282 Binary files /dev/null and b/weather/images/02d.png differ diff --git a/weather/images/02n.png b/weather/images/02n.png new file mode 100755 index 0000000..d182600 Binary files /dev/null and b/weather/images/02n.png differ diff --git a/weather/images/03d.png b/weather/images/03d.png new file mode 100755 index 0000000..49afdad Binary files /dev/null and b/weather/images/03d.png differ diff --git a/weather/images/03n.png b/weather/images/03n.png new file mode 100755 index 0000000..49afdad Binary files /dev/null and b/weather/images/03n.png differ diff --git a/weather/images/04d.png b/weather/images/04d.png new file mode 100755 index 0000000..732c635 Binary files /dev/null and b/weather/images/04d.png differ diff --git a/weather/images/04n.png b/weather/images/04n.png new file mode 100755 index 0000000..732c635 Binary files /dev/null and b/weather/images/04n.png differ diff --git a/weather/images/09d.png b/weather/images/09d.png new file mode 100755 index 0000000..e3dea9b Binary files /dev/null and b/weather/images/09d.png differ diff --git a/weather/images/09n.png b/weather/images/09n.png new file mode 100755 index 0000000..e3dea9b Binary files /dev/null and b/weather/images/09n.png differ diff --git a/weather/images/10d.png b/weather/images/10d.png new file mode 100755 index 0000000..5c91a38 Binary files /dev/null and b/weather/images/10d.png differ diff --git a/weather/images/10n.png b/weather/images/10n.png new file mode 100755 index 0000000..5c91a38 Binary files /dev/null and b/weather/images/10n.png differ diff --git a/weather/images/11d.png b/weather/images/11d.png new file mode 100755 index 0000000..b7a03f6 Binary files /dev/null and b/weather/images/11d.png differ diff --git a/weather/images/11n.png b/weather/images/11n.png new file mode 100755 index 0000000..b7a03f6 Binary files /dev/null and b/weather/images/11n.png differ diff --git a/weather/images/13d.png b/weather/images/13d.png new file mode 100755 index 0000000..2b8ee5c Binary files /dev/null and b/weather/images/13d.png differ diff --git a/weather/images/13n.png b/weather/images/13n.png new file mode 100755 index 0000000..2b8ee5c Binary files /dev/null and b/weather/images/13n.png differ diff --git a/weather/images/50d.png b/weather/images/50d.png new file mode 100755 index 0000000..a17878d Binary files /dev/null and b/weather/images/50d.png differ diff --git a/weather/images/50n.png b/weather/images/50n.png new file mode 100755 index 0000000..26346a9 Binary files /dev/null and b/weather/images/50n.png differ diff --git a/weather/images/arrow-circle-225.png b/weather/images/arrow-circle-225.png new file mode 100755 index 0000000..d72696a Binary files /dev/null and b/weather/images/arrow-circle-225.png differ diff --git a/weather/mainwindow.ui b/weather/mainwindow.ui new file mode 100644 index 0000000..32778fa --- /dev/null +++ b/weather/mainwindow.ui @@ -0,0 +1,540 @@ + + + MainWindow + + + + 0 + 0 + 330 + 417 + + + + Raindar + + + + + + + + + + + Utrecht,the Netherlands + + + + + + + + + + + images/arrow-circle-225.pngimages/arrow-circle-225.png + + + + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 16 + 16 + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 200 + 16 + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 200 + 16 + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 200 + 16 + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 200 + 16 + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + + 200 + 16 + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + + + + + + + + + + + + + + +3h + + + Qt::AlignCenter + + + + + + + +6h + + + Qt::AlignCenter + + + + + + + +9h + + + Qt::AlignCenter + + + + + + + +12h + + + Qt::AlignCenter + + + + + + + +15h + + + Qt::AlignCenter + + + + + + + + + + + + + + 75 + true + + + + Barometer + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Temperature + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Humidity + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Pressure + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 75 + true + + + + Location + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Longitude + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Latitude + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Sunrise + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Speed + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 75 + true + + + + Wind + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/weather/weather.py b/weather/weather.py new file mode 100644 index 0000000..dbf53bf --- /dev/null +++ b/weather/weather.py @@ -0,0 +1,94 @@ +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * + +from MainWindow import Ui_MainWindow + +from datetime import datetime +import json +import os +import sys +import requests +from urllib.parse import urlencode + +OPENWEATHERMAP_API_KEY = os.environ.get('OPENWEATHERMAP_API_KEY') + +""" +Get an API key from https://openweathermap.org/ to use with this +application. + +""" + +class MainWindow(QMainWindow, Ui_MainWindow): + + def __init__(self, *args, **kwargs): + super(MainWindow, self).__init__(*args, **kwargs) + self.setupUi(self) + + self.pushButton.pressed.connect(self.update_weather) + self.pushButton.pressed.connect(self.update_forecast) + + self.show() + + def from_ts_to_time_of_day(self, ts): + dt = datetime.fromtimestamp(ts) + return dt.strftime("%I%p").lstrip("0") + + def update_weather(self): + params = dict( + q=self.lineEdit.text(), + appid=OPENWEATHERMAP_API_KEY + ) + + url = 'http://api.openweathermap.org/data/2.5/weather?%s&units=metric' % urlencode(params) + r = requests.get(url) + data = json.loads(r.text) + + self.latitudeLabel.setText("%.2f °" % data['coord']['lat']) + self.longitudeLabel.setText("%.2f °" % data['coord']['lon']) + + self.windLabel.setText("%.2f m/s" % data['wind']['speed']) + + self.temperatureLabel.setText("%.1f °C" % data['main']['temp']) + self.pressureLabel.setText("%d" % data['main']['pressure']) + self.humidityLabel.setText("%d" % data['main']['humidity']) + + self.sunriseLabel.setText(self.from_ts_to_time_of_day(data['sys']['sunrise'])) + + self.weatherLabel.setText("%s (%s)" % ( + data['weather'][0]['main'], + data['weather'][0]['description'] + ) + ) + + self.set_weather_icon(self.weatherIcon, data['weather']) + + def set_weather_icon(self, label, weather): + label.setPixmap( + QPixmap(os.path.join('images', "%s.png" % + weather[0]['icon'] + ) + ) + + ) + + def update_forecast(self): + params = dict( + q=self.lineEdit.text(), + appid=OPENWEATHERMAP_API_KEY + ) + + url = 'http://api.openweathermap.org/data/2.5/forecast?%s&units=metric' % urlencode(params) + r = requests.get(url) + data = json.loads(r.text) + + for n, forecast in enumerate(data['list'][:5], 1): + getattr(self, 'forecastTime%d' % n).setText(self.from_ts_to_time_of_day(forecast['dt'])) + self.set_weather_icon(getattr(self, 'forecastIcon%d' % n), forecast['weather']) + getattr(self, 'forecastTemp%d' % n).setText("%.1f °C" % forecast['main']['temp']) + +if __name__ == '__main__': + + app = QApplication([]) + window = MainWindow() + app.exec_() \ No newline at end of file