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