├── LICENSE ├── README.md ├── icons.qrc ├── icons_rc.py ├── images ├── 01d.png ├── 01n.png ├── 02d.png ├── 02n.png ├── 03d.png ├── 03n.png ├── 04d.png ├── 04n.png ├── 09d.png ├── 09n.png ├── 10d.png ├── 10n.png ├── 11d.png ├── 11n.png ├── 13d.png ├── 13n.png ├── 50d.png └── 50n.png ├── main.py ├── mainwindow.ui └── ui_mainwindow.py /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-Weather-App-With-Open-Weather-API 2 | [Modern GUI] Create Weather app - Python, Pyqt5, Pyside2 [Flat UI] - Python Full Project 3 | -------------------------------------------------------------------------------- /icons.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | icons/weather/png/001-cloudy day.png 4 | icons/weather/png/002-sunny.png 5 | icons/weather/png/003-sunny.png 6 | icons/weather/png/004-thunderstorm.png 7 | icons/weather/png/005-cloudy.png 8 | icons/weather/png/006-snowy.png 9 | icons/weather/png/007-windy.png 10 | icons/weather/png/008-snowy.png 11 | icons/weather/png/009-rainy.png 12 | icons/weather/png/010-night.png 13 | icons/weather/png/011-night.png 14 | icons/weather/png/012-rainy.png 15 | icons/weather/png/013-rainbow.png 16 | icons/weather/png/014-thunderstorm.png 17 | icons/weather/png/015-rainy.png 18 | icons/weather/png/016-sunrise.png 19 | icons/weather/png/017-sunset.png 20 | icons/weather/png/018-high tide.png 21 | icons/weather/png/019-low tide.png 22 | icons/weather/png/020-Hailstorm.png 23 | icons/weather/png/021-cloudy night.png 24 | icons/weather/png/022-humidity.png 25 | icons/weather/png/023-moon phase.png 26 | icons/weather/png/024-temperature.png 27 | icons/weather/png/025-temperature.png 28 | icons/weather/png/026-weather alert.png 29 | icons/weather/png/027-location.png 30 | icons/weather/png/028-wind vane.png 31 | icons/weather/png/029-wave.png 32 | icons/weather/png/030-weather app.png 33 | icons/weather/png/031-weather forecast.png 34 | icons/weather/png/032-snowy.png 35 | icons/weather/png/033-rainy day.png 36 | icons/weather/png/034-sun.png 37 | icons/weather/png/035-night.png 38 | icons/weather/png/036-night.png 39 | 40 | 41 | -------------------------------------------------------------------------------- /images/01d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/01d.png -------------------------------------------------------------------------------- /images/01n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/01n.png -------------------------------------------------------------------------------- /images/02d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/02d.png -------------------------------------------------------------------------------- /images/02n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/02n.png -------------------------------------------------------------------------------- /images/03d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/03d.png -------------------------------------------------------------------------------- /images/03n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/03n.png -------------------------------------------------------------------------------- /images/04d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/04d.png -------------------------------------------------------------------------------- /images/04n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/04n.png -------------------------------------------------------------------------------- /images/09d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/09d.png -------------------------------------------------------------------------------- /images/09n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/09n.png -------------------------------------------------------------------------------- /images/10d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/10d.png -------------------------------------------------------------------------------- /images/10n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/10n.png -------------------------------------------------------------------------------- /images/11d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/11d.png -------------------------------------------------------------------------------- /images/11n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/11n.png -------------------------------------------------------------------------------- /images/13d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/13d.png -------------------------------------------------------------------------------- /images/13n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/13n.png -------------------------------------------------------------------------------- /images/50d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/50d.png -------------------------------------------------------------------------------- /images/50n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhamisiKibet/Python-Weather-App-With-Open-Weather-API/50020bb99302deae9fdc61071c46b0bc407b658d/images/50n.png -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | ##### 2 | ## SPINN DESIGN CODE 3 | # YOUTUBE: (SPINN TV) https://www.youtube.com/spinnTv 4 | # WEBSITE: spinndesign.com 5 | ######################################################################## 6 | 7 | ######################################################################## 8 | ## IMPORTS 9 | ######################################################################## 10 | import sys 11 | import os 12 | import platform 13 | from PySide2.QtGui import * 14 | from PySide2.QtWidgets import * 15 | from PySide2.QtCore import * 16 | 17 | from PyQt5.QtGui import * 18 | from PyQt5.QtWidgets import * 19 | from PyQt5.QtCore import * 20 | 21 | import time 22 | import traceback 23 | 24 | from datetime import datetime 25 | import json 26 | import requests 27 | import urllib 28 | from urllib.parse import urlencode 29 | ######################################################################## 30 | ## 31 | ######################################################################## 32 | 33 | # ######################### 34 | # IMPORT GUI FILE 35 | from ui_mainwindow import * 36 | # ########################## 37 | 38 | # ######################### 39 | # GLOBAL VALUES 40 | FINAL_WEATHER_ERROR = "none" #used to hold a variable that helps the app determine where an error occured while loading the app 41 | 42 | 43 | 44 | ######################################################################## 45 | ## WORKER SIGNAL CLASS 46 | ######################################################################## 47 | class WorkerSignals(QObject): 48 | ''' 49 | Defines the signals available from a running worker thread. 50 | 51 | Supported signals are: 52 | 53 | finished 54 | No data 55 | 56 | error 57 | tuple (exctype, value, traceback.format_exc() ) 58 | 59 | result 60 | object data returned from processing, anything 61 | 62 | progress 63 | int indicating % progress 64 | 65 | ''' 66 | finished = Signal() 67 | error = Signal(tuple) 68 | result = Signal(object) 69 | progress = Signal(int) 70 | 71 | ######################################################################## 72 | ## 73 | ######################################################################## 74 | 75 | 76 | ######################################################################## 77 | ## WORKER CLASS 78 | ######################################################################## 79 | class Worker(QRunnable): 80 | ''' 81 | Worker thread 82 | 83 | Inherits from QRunnable to handler worker thread setup, signals and wrap-up. 84 | 85 | :param callback: The function callback to run on this worker thread. Supplied args and 86 | kwargs will be passed through to the runner. 87 | :type callback: function 88 | :param args: Arguments to pass to the callback function 89 | :param kwargs: Keywords to pass to the callback function 90 | 91 | ''' 92 | 93 | def __init__(self, fn, *args, **kwargs): 94 | super(Worker, self).__init__() 95 | 96 | # Store constructor arguments (re-used for processing) 97 | self.fn = fn 98 | self.args = args 99 | self.kwargs = kwargs 100 | self.signals = WorkerSignals() 101 | 102 | # Add the callback to our kwargs 103 | self.kwargs['progress_callback'] = self.signals.progress 104 | 105 | @Slot() 106 | def run(self): 107 | ''' 108 | Initialise the runner function with passed args, kwargs. 109 | ''' 110 | 111 | # Retrieve args/kwargs here; and fire processing using them 112 | try: 113 | result = self.fn(*self.args, **self.kwargs) 114 | except: 115 | traceback.print_exc() 116 | exctype, value = sys.exc_info()[:2] 117 | self.signals.error.emit((exctype, value, traceback.format_exc())) 118 | else: 119 | self.signals.result.emit(result) # Return the result of the processing 120 | finally: 121 | self.signals.finished.emit() # Done 122 | 123 | 124 | ######################################################################## 125 | ## 126 | ######################################################################## 127 | 128 | 129 | 130 | 131 | ######################################################################## 132 | ## MAIN WINDOW CLASS 133 | ######################################################################## 134 | class MainWindow(QMainWindow): 135 | def __init__(self): 136 | QMainWindow.__init__(self) 137 | self.ui = Ui_MainWindow() 138 | self.ui.setupUi(self) 139 | 140 | # HIDE PROGRESSBAR AND MESSAGES CONTAINER BY DEFAULT 141 | self.ui.progressBar.setVisible(False) 142 | self.ui.message_frame.hide() 143 | 144 | 145 | ####################################################################### 146 | ## SHOW ==> MAIN WINDOW 147 | ######################################################################## 148 | self.show() 149 | ## == ## 150 | 151 | 152 | # START THREAD 153 | self.threadpool = QThreadPool() 154 | 155 | 156 | ######################################################################## 157 | ## UPDATE COUNTRIES ON CONTINENT CHANGE 158 | ######################################################################## 159 | self.ui.continents_list.currentTextChanged.connect(lambda: self.weather_thread("countries")) 160 | 161 | 162 | ######################################################################## 163 | ## UPDATE CITIES ON COUNTRIES CHANGE 164 | ######################################################################## 165 | self.ui.countries_list.currentTextChanged.connect(lambda: self.weather_thread("cities")) 166 | 167 | ######################################################################## 168 | ## UPDATE WEATHER ON CITY CHANGE 169 | ######################################################################## 170 | self.ui.cities_list.currentTextChanged.connect(lambda: self.weather_thread("weather")) 171 | 172 | 173 | ######################################################################## 174 | ## RELOAD WEATHER 175 | ######################################################################## 176 | # self.ui.retryButton.clicked.connect(lambda: self.reload_weather) 177 | self.ui.retryButton.pressed.connect(self.reload_weather) 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | self.weather_thread("weather") 187 | 188 | 189 | 190 | 191 | 192 | ######################################################################## 193 | ## CREATE WEATHER THREAD FUNCTION 194 | ######################################################################## 195 | def weather_thread(self, request): 196 | print("Requested", request) 197 | # DISABLE LIST ITEMS TO AVOID MULTIPLE REQUESTS 198 | self.ui.continents_list.setEnabled(False) 199 | self.ui.countries_list.setEnabled(False) 200 | self.ui.cities_list.setEnabled(False) 201 | # 202 | # DISPLAY PROGRESS BAR 203 | self.ui.progressBar.show() 204 | # 205 | # Hide messsage container 206 | self.ui.message_frame.hide() 207 | 208 | global FINAL_WEATHER_ERROR; 209 | # Pass the function to execute 210 | if request == "continents": 211 | # Update final error 212 | FINAL_WEATHER_ERROR = "continents" 213 | # UPDATE CONTINENTS 214 | worker = Worker(self.update_continents) 215 | elif request == "countries": 216 | # Update final error 217 | FINAL_WEATHER_ERROR = "countries" 218 | # UPDATE COUNRIES 219 | worker = Worker(self.update_countries) 220 | elif request == "cities": 221 | # Update final error 222 | FINAL_WEATHER_ERROR = "cities" 223 | # UPDATE CITIES 224 | worker = Worker(self.upadate_cities) 225 | elif request == "weather": 226 | # Update final error 227 | FINAL_WEATHER_ERROR = "weather" 228 | # UPDATE WEATHER 229 | worker = Worker(self.get_weather) 230 | else: 231 | # DISABLE LIST ITEMS (Invalid request) 232 | self.ui.continents_list.setEnabled(True) 233 | self.ui.countries_list.setEnabled(True) 234 | self.ui.cities_list.setEnabled(True) 235 | self.ui.progressBar.hide() 236 | return 237 | 238 | 239 | # START WORKER 240 | worker.signals.result.connect(self.print_output) 241 | worker.signals.finished.connect(self.thread_complete) 242 | worker.signals.progress.connect(self.progress_fn) 243 | 244 | # Execute 245 | self.threadpool.start(worker) 246 | 247 | ######################################################################## 248 | ## 249 | ######################################################################## 250 | 251 | ######################################################################## 252 | ## WORKER PRINT OUT 253 | ######################################################################## 254 | def print_output(self, s): 255 | print(s) 256 | ######################################################################## 257 | ## 258 | ######################################################################## 259 | 260 | ######################################################################## 261 | ## WORKER THREAD COMPLETE FUNCTION 262 | ######################################################################## 263 | def thread_complete(self): 264 | print("THREAD COMPLETE!") 265 | ######################################################################## 266 | ## 267 | ######################################################################## 268 | 269 | 270 | 271 | ######################################################################## 272 | ## WORKER THREAD PROGRESS FUNCTION 273 | ######################################################################## 274 | def progress_fn(self, n): 275 | # n = progress value 276 | print("%d%% done" % n) 277 | # set progress value to progress bar 278 | self.ui.progressBar.setValue(n) 279 | 280 | if n < 100: 281 | # disable list items and show progressbar while progress is less than 100 282 | self.ui.continents_list.setEnabled(False) 283 | self.ui.countries_list.setEnabled(False) 284 | self.ui.cities_list.setEnabled(False) 285 | self.ui.progressBar.show() 286 | else: 287 | # enable list items and hide progressbar if progress is 100 288 | self.ui.continents_list.setEnabled(True) 289 | self.ui.countries_list.setEnabled(True) 290 | self.ui.cities_list.setEnabled(True) 291 | self.ui.progressBar.hide() 292 | ######################################################################## 293 | ## 294 | ######################################################################## 295 | 296 | 297 | 298 | 299 | 300 | 301 | ######################################################################## 302 | ## A FUNCTION TO UPDATE CONTINENTS 303 | ######################################################################## 304 | def update_continents(self, progress_callback): 305 | # Update location label 306 | self.ui.weather_location.setText("Fetching continents list...") 307 | # GET GLOBAL VARIABLE 308 | global FINAL_WEATHER_ERROR 309 | FINAL_WEATHER_ERROR = "continents" #if an error occurs when loading continents, resume from this function 310 | 311 | # CATCH NETWORK ERROR USING TRY CATCH METHOD 312 | try: 313 | url = 'https://parseapi.back4app.com/classes/Continent?order=name' 314 | headers = { 315 | 'X-Parse-Application-Id': 'mxsebv4KoWIGkRntXwyzg6c6DhKWQuit8Ry9sHja', # This is the fake app's application id 316 | 'X-Parse-Master-Key': 'TpO0j3lG2PmEVMXlKYQACoOXKQrL3lwM0HwR9dbH' # This is the fake app's readonly master key 317 | } 318 | data = json.loads(requests.get(url, headers=headers).content.decode('utf-8')) # Here you have the data that you need 319 | # print(json.dumps(data, indent=2)) 320 | 321 | ######################################################################## 322 | ## CLEAR CONTINENTS LIST BEFORE UPDATING 323 | ######################################################################## 324 | self.ui.continents_list.clear() 325 | 326 | ####################################################################### 327 | # ADD CONTIENTS TO LIST 328 | ####################################################################### 329 | for continents in data['results']: 330 | 331 | self.ui.continents_list.addItem(continents['name'], continents['objectId']) 332 | print(continents['name'], continents['objectId']) 333 | 334 | 335 | else: 336 | # Select first list item after list update 337 | self.ui.countries_list.setCurrentIndex(0) 338 | # UPDATE WORKER PROGRESS 339 | WEATHER_WORKER_PROGRESS_VALUE = 1 340 | progress_callback.emit(WEATHER_WORKER_PROGRESS_VALUE*25) 341 | 342 | except Exception as e: 343 | print(e) 344 | self.alert(e) 345 | 346 | ######################################################################## 347 | ## 348 | ######################################################################## 349 | 350 | 351 | 352 | ######################################################################## 353 | ## A FUNCTION TO UPDATE COUNTRIES USING CONTINENT ID 354 | ######################################################################## 355 | def update_countries(self, progress_callback): 356 | # Update location label 357 | self.ui.weather_location.setText("Fetching countries list...") 358 | # GET GLOBAL VARIABLE 359 | global FINAL_WEATHER_ERROR 360 | FINAL_WEATHER_ERROR = "countries" #if an error occurs when loading continents, resume from this function 361 | 362 | ######################################################################## 363 | ## GET CONTINENT ID FROM LIST 364 | ######################################################################## 365 | continent_id = self.ui.continents_list.currentData() #id will be used to fetch countries 366 | 367 | # print(continent_id) 368 | 369 | try: 370 | where = urllib.parse.quote_plus(""" 371 | { 372 | "continent": { 373 | "__type": "Pointer", 374 | "className": "Continent", 375 | "objectId": "%s" 376 | } 377 | } 378 | """ % (continent_id) ) 379 | url = 'https://parseapi.back4app.com/classes/Country?order=name&where=%s' % where 380 | headers = { 381 | 'X-Parse-Application-Id': 'mxsebv4KoWIGkRntXwyzg6c6DhKWQuit8Ry9sHja', # This is the fake app's application id 382 | 'X-Parse-Master-Key': 'TpO0j3lG2PmEVMXlKYQACoOXKQrL3lwM0HwR9dbH' # This is the fake app's readonly master key 383 | } 384 | data = json.loads(requests.get(url, headers=headers).content.decode('utf-8')) # Here you have the data that you need 385 | # print(json.dumps(data, indent=2)) 386 | 387 | ######################################################################## 388 | ## CLEAR COUNTRIES LIST BEFORE UPDATING 389 | ######################################################################## 390 | self.ui.countries_list.clear() 391 | 392 | ######################################################################## 393 | ## UPDATE COUNTRIES LIST 394 | ######################################################################## 395 | for countries in data['results']: 396 | self.ui.countries_list.addItem(countries['name'], countries['objectId']) 397 | else: 398 | # Select first list item after list update 399 | self.ui.countries_list.setCurrentIndex(0) 400 | # UPDATE WORKER PROGRESS 401 | WEATHER_WORKER_PROGRESS_VALUE = 2 402 | progress_callback.emit(WEATHER_WORKER_PROGRESS_VALUE*25) 403 | 404 | except Exception as e: 405 | print(e) 406 | self.alert(e) 407 | 408 | 409 | ######################################################################## 410 | ## 411 | ######################################################################## 412 | 413 | 414 | ######################################################################## 415 | ## A FUNCTION TO UPDATE COUNTRY CITIES 416 | ######################################################################## 417 | def upadate_cities(self, progress_callback): 418 | # Update location label 419 | self.ui.weather_location.setText("Fetching cities list...") 420 | # GET GLOBAL VARIABLE 421 | global FINAL_WEATHER_ERROR 422 | FINAL_WEATHER_ERROR = "cities" #if an error occurs when loading continents, resume from this function 423 | 424 | ######################################################################## 425 | ## GET COUNTRY ID 426 | ######################################################################## 427 | country_id = self.ui.countries_list.currentData() 428 | # print(country_id) 429 | 430 | try: 431 | where = urllib.parse.quote_plus(""" 432 | { 433 | "country": { 434 | "__type": "Pointer", 435 | "className": "Country", 436 | "objectId": "%s" 437 | } 438 | } 439 | """ % (country_id)) 440 | 441 | url = 'https://parseapi.back4app.com/classes/City?order=name&where=%s' % where 442 | headers = { 443 | 'X-Parse-Application-Id': 'mxsebv4KoWIGkRntXwyzg6c6DhKWQuit8Ry9sHja', # This is the fake app's application id 444 | 'X-Parse-Master-Key': 'TpO0j3lG2PmEVMXlKYQACoOXKQrL3lwM0HwR9dbH' # This is the fake app's readonly master key 445 | } 446 | data = json.loads(requests.get(url, headers=headers).content.decode('utf-8')) # Here you have the data that you need 447 | # print(json.dumps(data, indent=2)) 448 | 449 | ######################################################################## 450 | ## CLEAR CITIES LIST BEFORE UPDATING 451 | ######################################################################## 452 | self.ui.cities_list.clear() 453 | 454 | ######################################################################## 455 | ## UPDATE CITIES LIST 456 | ######################################################################## 457 | for cities in data['results']: 458 | self.ui.cities_list.addItem(cities['name'], cities['objectId']) 459 | else: 460 | # Select first list item after list update 461 | self.ui.cities_list.setCurrentIndex(0) 462 | # UPDATE WORKER PROGRESS 463 | WEATHER_WORKER_PROGRESS_VALUE = 3 464 | progress_callback.emit(WEATHER_WORKER_PROGRESS_VALUE*25) 465 | 466 | except Exception as e: 467 | print(e) 468 | self.alert(e) 469 | 470 | 471 | ######################################################################## 472 | ## 473 | ######################################################################## 474 | 475 | ######################################################################## 476 | ## GET WEATHER INFORMATION OF SELECTED CITY LOCATION 477 | ######################################################################## 478 | def get_weather(self, progress_callback): 479 | # GET GLOBAL VARIABLE 480 | global FINAL_WEATHER_ERROR 481 | FINAL_WEATHER_ERROR = "weather" #if an error occurs when loading continents, resume from this function 482 | 483 | 484 | ######################################################################## 485 | ## CHECK IF THE CITIES AND COUNTRIES LISTS ARE EMPTY 486 | ######################################################################## 487 | if not self.ui.cities_list.currentText() or not self.ui.countries_list.currentText(): 488 | print("No location") 489 | # GET LOCATION INFORMATION 490 | if not self.ui.continents_list.currentText(): 491 | self.weather_thread("continents") 492 | elif not self.ui.countries_list.currentText(): 493 | self.weather_thread("countries") 494 | elif not self.ui.cities_list.currentText(): 495 | self.weather_thread("cities") 496 | 497 | return 498 | 499 | ######################################################################## 500 | ## GET LOCATION NAME 501 | ######################################################################## 502 | weather_location = self.ui.cities_list.currentText()+', '+self.ui.countries_list.currentText() 503 | # print(weather_location) 504 | 505 | ######################################################################## 506 | ## UPDATE UI LOCATION LABEL 507 | ######################################################################## 508 | self.ui.weather_location.setText("Loading weather information for "+weather_location+'('+self.ui.continents_list.currentText()+')') 509 | 510 | try: 511 | url = "https://community-open-weather-map.p.rapidapi.com/weather" 512 | 513 | querystring = {"q":weather_location,"lat":"0","lon":"0","lang":"null","units":"metric","mode":"xml, html"} 514 | 515 | headers = { 516 | 'x-rapidapi-key': "API_KEY", #Paste your api key here-----Get api key from https://rapidapi.com/community/api/open-weather-map/endpoints 517 | 'x-rapidapi-host': "community-open-weather-map.p.rapidapi.com" 518 | } 519 | 520 | weather = requests.request("GET", url, headers=headers, params=querystring) 521 | 522 | # UPDATE WORKER PROGRESS 523 | WEATHER_WORKER_PROGRESS_VALUE = 3.5 524 | progress_callback.emit(WEATHER_WORKER_PROGRESS_VALUE*25) 525 | 526 | # print(weather.text) 527 | ######################################################################## 528 | ## GET LOCATION WEATHER FORECAST 529 | ######################################################################## 530 | try: 531 | url = "https://community-open-weather-map.p.rapidapi.com/forecast" 532 | 533 | forecasts = requests.request("GET", url, headers=headers, params=querystring) 534 | 535 | # print(forecasts.text) 536 | 537 | # UPDATE WORKER PROGRESS 538 | WEATHER_WORKER_PROGRESS_VALUE = 4 539 | progress_callback.emit(WEATHER_WORKER_PROGRESS_VALUE*25) 540 | 541 | # UPDATE WEATHER UI 542 | self.weather_result(weather.json(), forecasts.json()) 543 | 544 | # WEATHER LOCATION LABLE 545 | self.ui.weather_location.setText(weather_location+'('+self.ui.continents_list.currentText()+')') 546 | 547 | except Exception as e: 548 | # Catch network errors. 549 | print(e) 550 | self.alert(e) 551 | 552 | 553 | except Exception as e: 554 | # Catch network errors. 555 | print(e) 556 | self.alert(e) 557 | 558 | ######################################################################## 559 | ## 560 | ######################################################################## 561 | 562 | 563 | ######################################################################## 564 | ## FUNCTION TO UPDATE UI WEATHER INFORMATION 565 | ######################################################################## 566 | # View the weather response code(200 means everything is ok) 567 | def weather_result(self, weather, forecasts): 568 | if weather['cod'] != 200: 569 | print(weather['message']) 570 | self.alert(weather['cod']+", "+weather['message']) 571 | return 572 | 573 | # UPDATE UI 574 | self.ui.latitude_label.setText("%.2f °" % weather['coord']['lat']) 575 | self.ui.longitude_label.setText("%.2f °" % weather['coord']['lon']) 576 | 577 | self.ui.wind_speed_label.setText("%.2f m/s" % weather['wind']['speed']) 578 | 579 | self.ui.temperature_label.setText("%.1f °C" % weather['main']['temp']) 580 | self.ui.pressure_label.setText("%d" % weather['main']['pressure']) 581 | 582 | self.ui.sunrise_label.setText(from_ts_to_time_of_day(weather['sys']['sunrise'])) 583 | 584 | self.ui.current_weather_label.setText("%s (%s)" % ( 585 | weather['weather'][0]['main'], 586 | weather['weather'][0]['description'] 587 | )) 588 | 589 | self.set_weather_icon(self.ui.current_weather_icon, weather['weather']) 590 | 591 | for n, forecast in enumerate(forecasts['list'][:5], 1): 592 | getattr(self.ui, 'forecast_time%d' % n).setText(from_ts_to_time_of_day(forecast['dt'])) 593 | self.set_weather_icon(getattr(self.ui, 'forecast_icon%d' % n), forecast['weather']) 594 | getattr(self.ui, 'forecast_temp%d' % n).setText("%.1f °C" % forecast['main']['temp']) 595 | 596 | 597 | ######################################################################## 598 | ## FUNCTION TO UPDATE WEATHER ICONS 599 | ######################################################################## 600 | def set_weather_icon(self, label, weather): 601 | label.setPixmap( 602 | QPixmap(os.path.join('images', "%s.png" % 603 | weather[0]['icon'] 604 | ))) 605 | ######################################################################## 606 | ## 607 | ######################################################################## 608 | 609 | 610 | ######################################################################## 611 | ## ALERT FUNCTION TO DISPLAY ERRORS 612 | ######################################################################## 613 | def alert(self, message): 614 | self.ui.message_frame.show() 615 | self.ui.message_label.setText(str(message)) 616 | ######################################################################## 617 | ## 618 | ######################################################################## 619 | 620 | ######################################################################## 621 | ## RELOAD WEATHER AFTER AN ERROR 622 | ######################################################################## 623 | def reload_weather(self): 624 | # Hide message box 625 | self.ui.message_frame.hide() 626 | # Get global variable 627 | global FINAL_WEATHER_ERROR; 628 | # Reload weather if an error occured 629 | print("Final error", FINAL_WEATHER_ERROR) 630 | self.weather_thread(FINAL_WEATHER_ERROR) 631 | 632 | 633 | 634 | 635 | 636 | ######################################################################## 637 | ## DATE FROM TIME STAMP FUNCTION 638 | ######################################################################## 639 | def from_ts_to_time_of_day(ts): 640 | dt = datetime.fromtimestamp(ts) 641 | return dt.strftime("%I%p").lstrip("0") 642 | ######################################################################## 643 | ## 644 | ######################################################################## 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | ######################################################################## 657 | ## EXECUTE APP 658 | ######################################################################## 659 | if __name__ == "__main__": 660 | app = QApplication(sys.argv) 661 | window = MainWindow() 662 | sys.exit(app.exec_()) 663 | ######################################################################## 664 | ## END===> 665 | ######################################################################## -------------------------------------------------------------------------------- /mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 935 10 | 750 11 | 12 | 13 | 14 | MainWindow 15 | 16 | 17 | QScrollArea { 18 | border: none; 19 | border-radius: 0px; 20 | } 21 | QScrollBar:horizontal { 22 | border: none; 23 | background: rgb(154, 148, 196); 24 | height: 5px; 25 | margin: 0px 21px 0 21px; 26 | border-radius: 0px; 27 | } 28 | QScrollBar:vertical { 29 | border: none; 30 | background: rgb(154, 148, 196); 31 | width: 5px; 32 | margin: 21px 0 21px 0; 33 | border-radius: 0px; 34 | } 35 | 36 | 37 | 38 | 39 | background-color: rgb(40, 40, 40); 40 | color: #fff; 41 | 42 | 43 | 44 | 0 45 | 46 | 47 | 0 48 | 49 | 50 | 0 51 | 52 | 53 | 0 54 | 55 | 56 | 0 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | QFrame::NoFrame 65 | 66 | 67 | true 68 | 69 | 70 | 71 | 72 | 0 73 | 0 74 | 930 75 | 807 76 | 77 | 78 | 79 | QComboBox{ 80 | background-color: rgb(27, 29, 35); 81 | } 82 | QComboBox:hover{ 83 | border: 2px solid rgb(64, 71, 88); 84 | } 85 | QComboBox QAbstractItemView { 86 | color: rgb(85, 170, 255); 87 | background-color: rgb(27, 29, 35); 88 | selection-background-color: rgb(39, 44, 54); 89 | } 90 | 91 | 92 | 93 | 0 94 | 95 | 96 | 0 97 | 98 | 99 | 0 100 | 101 | 102 | 0 103 | 104 | 105 | 0 106 | 107 | 108 | 109 | 110 | 111 | 0 112 | 0 113 | 114 | 115 | 116 | 117 | 16777215 118 | 16777215 119 | 120 | 121 | 122 | 123 | 124 | 125 | QFrame::StyledPanel 126 | 127 | 128 | QFrame::Raised 129 | 130 | 131 | 132 | 0 133 | 134 | 135 | 0 136 | 137 | 138 | 0 139 | 140 | 141 | 0 142 | 143 | 144 | 0 145 | 146 | 147 | 148 | 149 | 150 | 0 151 | 192 152 | 153 | 154 | 155 | true 156 | 157 | 158 | 159 | 160 | 0 161 | 0 162 | 1072 163 | 187 164 | 165 | 166 | 167 | 168 | 16777215 169 | 665 170 | 171 | 172 | 173 | 174 | 175 | 176 | QFrame{border-top: 2px solid rgb(154, 148, 196)} 177 | 178 | 179 | QFrame::StyledPanel 180 | 181 | 182 | QFrame::Raised 183 | 184 | 185 | 186 | 187 | 188 | background-color: rgb(27, 29, 35); 189 | padding: 10px; 190 | border-radius: 20px; 191 | border: none; 192 | 193 | 194 | QFrame::StyledPanel 195 | 196 | 197 | QFrame::Raised 198 | 199 | 200 | 201 | 202 | 203 | 204 | 0 205 | 30 206 | 207 | 208 | 209 | 210 | Adobe Caslon Pro 211 | 12 212 | 75 213 | true 214 | 215 | 216 | 217 | color: rgb(173, 167, 220);border: none; 218 | 219 | 220 | Please wait.. 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 50 229 | 50 230 | 231 | 232 | 233 | 234 | 50 235 | 50 236 | 237 | 238 | 239 | 240 | 2 241 | 242 | 243 | 244 | border: none; 245 | padding: 5px; 246 | border: 2px solid rgb(103, 103, 103); 247 | border-radius: 25px; 248 | color: rgb(252, 191, 130); 249 | 250 | 251 | 252 | 253 | 254 | :/weather/icons/weather/png/030-weather app.png 255 | 256 | 257 | true 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 0 266 | 30 267 | 268 | 269 | 270 | 271 | Adobe Caslon Pro 272 | 12 273 | 274 | 275 | 276 | border: none; 277 | 278 | 279 | +3 Hours 280 | 281 | 282 | Qt::AlignCenter 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | background-color: rgb(27, 29, 35); 293 | padding: 10px; 294 | border-radius: 20px; 295 | border: none; 296 | 297 | 298 | QFrame::StyledPanel 299 | 300 | 301 | QFrame::Raised 302 | 303 | 304 | 305 | 306 | 307 | 308 | 0 309 | 30 310 | 311 | 312 | 313 | 314 | Adobe Caslon Pro 315 | 12 316 | 75 317 | true 318 | 319 | 320 | 321 | color: rgb(173, 167, 220);border: none; 322 | 323 | 324 | Please wait.. 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 50 333 | 50 334 | 335 | 336 | 337 | 338 | 50 339 | 50 340 | 341 | 342 | 343 | 344 | 2 345 | 346 | 347 | 348 | border: none; 349 | padding: 5px; 350 | border: 2px solid rgb(103, 103, 103); 351 | border-radius: 25px; 352 | color: rgb(252, 191, 130); 353 | 354 | 355 | 356 | 357 | 358 | :/weather/icons/weather/png/030-weather app.png 359 | 360 | 361 | true 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 0 370 | 30 371 | 372 | 373 | 374 | 375 | Adobe Caslon Pro 376 | 12 377 | 378 | 379 | 380 | border: none; 381 | 382 | 383 | +6 Hours 384 | 385 | 386 | Qt::AlignCenter 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | background-color: rgb(27, 29, 35); 397 | padding: 10px; 398 | border-radius: 20px; 399 | border: none; 400 | 401 | 402 | QFrame::StyledPanel 403 | 404 | 405 | QFrame::Raised 406 | 407 | 408 | 409 | 410 | 411 | 412 | 0 413 | 30 414 | 415 | 416 | 417 | 418 | Adobe Caslon Pro 419 | 12 420 | 75 421 | true 422 | 423 | 424 | 425 | color: rgb(173, 167, 220);border: none; 426 | 427 | 428 | Please wait.. 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 50 437 | 50 438 | 439 | 440 | 441 | 442 | 50 443 | 50 444 | 445 | 446 | 447 | 448 | 2 449 | 450 | 451 | 452 | border: none; 453 | padding: 5px; 454 | border: 2px solid rgb(103, 103, 103); 455 | border-radius: 25px; 456 | color: rgb(252, 191, 130); 457 | 458 | 459 | 460 | 461 | 462 | :/weather/icons/weather/png/030-weather app.png 463 | 464 | 465 | true 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 0 474 | 30 475 | 476 | 477 | 478 | 479 | Adobe Caslon Pro 480 | 12 481 | 482 | 483 | 484 | border: none; 485 | 486 | 487 | +9 Hours 488 | 489 | 490 | Qt::AlignCenter 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | background-color: rgb(27, 29, 35); 501 | padding: 10px; 502 | border-radius: 20px; 503 | border: none; 504 | 505 | 506 | QFrame::StyledPanel 507 | 508 | 509 | QFrame::Raised 510 | 511 | 512 | 513 | 514 | 515 | 516 | 50 517 | 50 518 | 519 | 520 | 521 | 522 | 50 523 | 50 524 | 525 | 526 | 527 | 528 | 2 529 | 530 | 531 | 532 | border: none; 533 | padding: 5px; 534 | border: 2px solid rgb(103, 103, 103); 535 | border-radius: 25px; 536 | color: rgb(252, 191, 130); 537 | 538 | 539 | 540 | 541 | 542 | :/weather/icons/weather/png/030-weather app.png 543 | 544 | 545 | true 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 0 554 | 30 555 | 556 | 557 | 558 | 559 | Adobe Caslon Pro 560 | 12 561 | 75 562 | true 563 | 564 | 565 | 566 | color: rgb(173, 167, 220);border: none; 567 | 568 | 569 | Please wait.. 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 0 578 | 30 579 | 580 | 581 | 582 | 583 | Adobe Caslon Pro 584 | 12 585 | 586 | 587 | 588 | border: none; 589 | 590 | 591 | +12 Hours 592 | 593 | 594 | Qt::AlignCenter 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | background-color: rgb(27, 29, 35); 605 | padding: 10px; 606 | border-radius: 20px; 607 | border: none; 608 | 609 | 610 | QFrame::StyledPanel 611 | 612 | 613 | QFrame::Raised 614 | 615 | 616 | 617 | 618 | 619 | 620 | 0 621 | 30 622 | 623 | 624 | 625 | 626 | Adobe Caslon Pro 627 | 12 628 | 75 629 | true 630 | 631 | 632 | 633 | color: rgb(173, 167, 220); 634 | border: none; 635 | 636 | 637 | Please wait.. 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 50 646 | 50 647 | 648 | 649 | 650 | 651 | 50 652 | 50 653 | 654 | 655 | 656 | 657 | 2 658 | 659 | 660 | 661 | border: none; 662 | padding: 5px; 663 | border: 2px solid rgb(103, 103, 103); 664 | border-radius: 25px; 665 | color: rgb(252, 191, 130); 666 | 667 | 668 | 669 | 670 | 671 | :/weather/icons/weather/png/030-weather app.png 672 | 673 | 674 | true 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 0 683 | 30 684 | 685 | 686 | 687 | 688 | Adobe Caslon Pro 689 | 12 690 | 691 | 692 | 693 | border: none; 694 | 695 | 696 | +15 Hours 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | Adobe Garamond Pro Bold 715 | 12 716 | 717 | 718 | 719 | border: none; 720 | color: rgb(252, 192, 125) 721 | 722 | 723 | Forecast 724 | 725 | 726 | 727 | 728 | 729 | 730 | true 731 | 732 | 733 | 734 | 0 735 | 10 736 | 737 | 738 | 739 | 740 | 16777215 741 | 10 742 | 743 | 744 | 745 | QProgressBar{ 746 | background-color: rgb(27, 29, 35); 747 | border-style: none; 748 | border-radius: 10px; 749 | text-align: center; 750 | color: rgb(255, 0, 0) 751 | } 752 | QProgressBar::chunk{ 753 | background-color: qlineargradient(spread:pad, x1:0, y1:0.506, x2:1, y2:0.494, stop:0 rgba(252, 192, 125, 255), stop:1 rgba(255, 255, 255, 255)); 754 | border-radius: 5px; 755 | } 756 | 757 | 758 | 0 759 | 760 | 761 | 0 762 | 763 | 764 | false 765 | 766 | 767 | false 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 0 776 | 62 777 | 778 | 779 | 780 | 781 | 16777215 782 | 62 783 | 784 | 785 | 786 | 787 | 788 | 789 | QFrame::StyledPanel 790 | 791 | 792 | QFrame::Raised 793 | 794 | 795 | 796 | 797 | 798 | 799 | Open Sans Extrabold 800 | 15 801 | 50 802 | false 803 | 804 | 805 | 806 | color: rgb(252, 192, 125) 807 | 808 | 809 | Showing Weather Information For: 810 | 811 | 812 | Qt::AlignCenter 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | Adobe Kaiti Std R 821 | 13 822 | 75 823 | false 824 | true 825 | 826 | 827 | 828 | Loading weather location 829 | 830 | 831 | Qt::AlignCenter 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | Adobe Garamond Pro Bold 843 | 12 844 | 845 | 846 | 847 | border: none; 848 | color: rgb(252, 192, 125) 849 | 850 | 851 | Select weather location 852 | 853 | 854 | 855 | 856 | 857 | 858 | background-color: rgb(27, 29, 35); 859 | 860 | 861 | QFrame::StyledPanel 862 | 863 | 864 | QFrame::Raised 865 | 866 | 867 | 868 | 869 | 870 | 871 | 80 872 | 80 873 | 874 | 875 | 876 | 877 | 80 878 | 80 879 | 880 | 881 | 882 | 883 | 12 884 | 885 | 886 | 887 | 888 | 889 | 890 | :/weather/icons/weather/png/028-wind vane.png 891 | 892 | 893 | true 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | Adobe Garamond Pro Bold 902 | 25 903 | 75 904 | true 905 | 906 | 907 | 908 | border: none; 909 | color: rgb(252, 192, 125) 910 | 911 | 912 | Spinn Design Weather App 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 882 924 | 62 925 | 926 | 927 | 928 | 929 | 16777215 930 | 62 931 | 932 | 933 | 934 | border-bottom: 2px solid rgb(154, 148, 196) 935 | 936 | 937 | QFrame::StyledPanel 938 | 939 | 940 | QFrame::Raised 941 | 942 | 943 | 944 | 945 | 946 | 947 | Sitka Banner 948 | 14 949 | 950 | 951 | 952 | padding: 5px; 953 | border: 1px solid rgb(103, 103, 103); 954 | border-radius: 10px; 955 | color: rgb(252, 191, 130); 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | Sitka Banner 964 | 14 965 | 966 | 967 | 968 | padding: 5px; 969 | border: 1px solid rgb(103, 103, 103); 970 | border-radius: 10px; 971 | color: rgb(252, 191, 130); 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | Sitka Banner 983 | 14 984 | 985 | 986 | 987 | padding: 5px; 988 | border: 1px solid rgb(252, 192, 125); 989 | border-radius: 10px; 990 | 991 | 992 | Select Continent 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | Sitka Banner 1001 | 14 1002 | 1003 | 1004 | 1005 | padding: 5px; 1006 | border: 1px solid rgb(252, 192, 125); 1007 | border-radius: 10px; 1008 | 1009 | 1010 | Select Country 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | Sitka Banner 1019 | 14 1020 | 1021 | 1022 | 1023 | padding: 5px; 1024 | border: 1px solid rgb(252, 192, 125); 1025 | border-radius: 10px; 1026 | 1027 | 1028 | Select City 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | Sitka Banner 1037 | 14 1038 | 1039 | 1040 | 1041 | padding: 5px; 1042 | border: 1px solid rgb(103, 103, 103); 1043 | border-radius: 10px; 1044 | color: rgb(252, 191, 130); 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | QFrame{border-top: 2px solid rgb(154, 148, 196)} 1055 | 1056 | 1057 | QFrame::StyledPanel 1058 | 1059 | 1060 | QFrame::Raised 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | Adobe Garamond Pro Bold 1068 | 12 1069 | 1070 | 1071 | 1072 | border: none; 1073 | color: rgb(252, 192, 125) 1074 | 1075 | 1076 | Current Weather: 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | border: none; 1084 | 1085 | 1086 | QFrame::StyledPanel 1087 | 1088 | 1089 | QFrame::Raised 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 200 1097 | 200 1098 | 1099 | 1100 | 1101 | 1102 | 200 1103 | 200 1104 | 1105 | 1106 | 1107 | padding: 5px; 1108 | border: 5px solid rgb(103, 103, 103); 1109 | border-radius: 100px; 1110 | color: rgb(252, 191, 130); 1111 | 1112 | 1113 | QFrame::StyledPanel 1114 | 1115 | 1116 | QFrame::Raised 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 100 1124 | 100 1125 | 1126 | 1127 | 1128 | 1129 | 100 1130 | 100 1131 | 1132 | 1133 | 1134 | border: none; 1135 | background: none; 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | :/weather/icons/weather/png/027-location.png 1142 | 1143 | 1144 | true 1145 | 1146 | 1147 | Qt::AlignCenter 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | Adobe Caslon Pro 1156 | 12 1157 | 1158 | 1159 | 1160 | border: none; 1161 | padding: 15px; 1162 | background: none; 1163 | 1164 | 1165 | Please wait.. 1166 | 1167 | 1168 | Qt::AlignCenter 1169 | 1170 | 1171 | true 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 0 1183 | 0 1184 | 1185 | 1186 | 1187 | 1188 | 16777215 1189 | 16777215 1190 | 1191 | 1192 | 1193 | background-color: rgb(27, 29, 35); 1194 | padding: 10px; 1195 | border-radius: 20px; 1196 | 1197 | 1198 | QFrame::StyledPanel 1199 | 1200 | 1201 | QFrame::Raised 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | 1208 | 50 1209 | 50 1210 | 1211 | 1212 | 1213 | 1214 | 50 1215 | 50 1216 | 1217 | 1218 | 1219 | padding: 5px; 1220 | border: 2px solid rgb(103, 103, 103); 1221 | border-radius: 20px; 1222 | color: rgb(252, 191, 130); 1223 | 1224 | 1225 | 1226 | 1227 | 1228 | :/weather/icons/weather/png/031-weather forecast.png 1229 | 1230 | 1231 | true 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | 50 1240 | 50 1241 | 1242 | 1243 | 1244 | 1245 | 50 1246 | 50 1247 | 1248 | 1249 | 1250 | padding: 5px; 1251 | border: 2px solid rgb(103, 103, 103); 1252 | border-radius: 20px; 1253 | color: rgb(252, 191, 130); 1254 | 1255 | 1256 | 1257 | 1258 | 1259 | :/weather/icons/weather/png/031-weather forecast.png 1260 | 1261 | 1262 | true 1263 | 1264 | 1265 | 1266 | 1267 | 1268 | 1269 | 1270 | 0 1271 | 30 1272 | 1273 | 1274 | 1275 | 1276 | Adobe Caslon Pro 1277 | 12 1278 | 1279 | 1280 | 1281 | Latitude 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | 1288 | 1289 | 50 1290 | 50 1291 | 1292 | 1293 | 1294 | 1295 | 50 1296 | 50 1297 | 1298 | 1299 | 1300 | padding: 5px; 1301 | border: 2px solid rgb(103, 103, 103); 1302 | border-radius: 20px; 1303 | color: rgb(252, 191, 130); 1304 | 1305 | 1306 | 1307 | 1308 | 1309 | :/weather/icons/weather/png/001-cloudy day.png 1310 | 1311 | 1312 | true 1313 | 1314 | 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 0 1321 | 30 1322 | 1323 | 1324 | 1325 | 1326 | Adobe Caslon Pro 1327 | 12 1328 | 75 1329 | true 1330 | 1331 | 1332 | 1333 | color: rgb(173, 167, 220); 1334 | 1335 | 1336 | Please wait.. 1337 | 1338 | 1339 | 1340 | 1341 | 1342 | 1343 | 1344 | 0 1345 | 30 1346 | 1347 | 1348 | 1349 | 1350 | Adobe Caslon Pro 1351 | 12 1352 | 1353 | 1354 | 1355 | Sunrise 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 0 1364 | 30 1365 | 1366 | 1367 | 1368 | 1369 | Adobe Caslon Pro 1370 | 12 1371 | 1372 | 1373 | 1374 | Longitude 1375 | 1376 | 1377 | 1378 | 1379 | 1380 | 1381 | 1382 | 0 1383 | 30 1384 | 1385 | 1386 | 1387 | 1388 | Adobe Caslon Pro 1389 | 12 1390 | 75 1391 | true 1392 | 1393 | 1394 | 1395 | color: rgb(173, 167, 220); 1396 | 1397 | 1398 | Please wait.. 1399 | 1400 | 1401 | 1402 | 1403 | 1404 | 1405 | 1406 | 0 1407 | 30 1408 | 1409 | 1410 | 1411 | 1412 | Adobe Caslon Pro 1413 | 12 1414 | 75 1415 | true 1416 | 1417 | 1418 | 1419 | color: rgb(173, 167, 220); 1420 | 1421 | 1422 | Please wait.. 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | background-color: rgb(27, 29, 35); 1433 | padding: 10px; 1434 | border-radius: 20px; 1435 | 1436 | 1437 | QFrame::StyledPanel 1438 | 1439 | 1440 | QFrame::Raised 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 50 1448 | 50 1449 | 1450 | 1451 | 1452 | 1453 | 42 1454 | 1455 | 1456 | 1457 | padding: 5px; 1458 | border: 2px solid rgb(103, 103, 103); 1459 | border-radius: 20px; 1460 | color: rgb(252, 191, 130); 1461 | 1462 | 1463 | 1464 | 1465 | 1466 | :/weather/icons/weather/png/007-windy.png 1467 | 1468 | 1469 | true 1470 | 1471 | 1472 | 1473 | 1474 | 1475 | 1476 | 1477 | Adobe Caslon Pro 1478 | 12 1479 | 1480 | 1481 | 1482 | Wind Speed 1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | Adobe Caslon Pro 1491 | 12 1492 | 75 1493 | true 1494 | 1495 | 1496 | 1497 | color: rgb(173, 167, 220); 1498 | 1499 | 1500 | Please wait.. 1501 | 1502 | 1503 | 1504 | 1505 | 1506 | 1507 | 1508 | 50 1509 | 50 1510 | 1511 | 1512 | 1513 | padding: 5px; 1514 | border: 2px solid rgb(103, 103, 103); 1515 | border-radius: 20px; 1516 | color: rgb(252, 191, 130); 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | :/weather/icons/weather/png/024-temperature.png 1523 | 1524 | 1525 | true 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | Adobe Caslon Pro 1534 | 12 1535 | 1536 | 1537 | 1538 | Temperature 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | Adobe Caslon Pro 1547 | 12 1548 | 75 1549 | true 1550 | 1551 | 1552 | 1553 | color: rgb(173, 167, 220); 1554 | 1555 | 1556 | Please wait.. 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 50 1565 | 50 1566 | 1567 | 1568 | 1569 | padding: 5px; 1570 | border: 2px solid rgb(103, 103, 103); 1571 | border-radius: 20px; 1572 | color: rgb(252, 191, 130); 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | :/weather/icons/weather/png/019-low tide.png 1579 | 1580 | 1581 | true 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | Adobe Caslon Pro 1590 | 12 1591 | 1592 | 1593 | 1594 | Pressure 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | Adobe Caslon Pro 1603 | 12 1604 | 75 1605 | true 1606 | 1607 | 1608 | 1609 | color: rgb(159, 145, 188); 1610 | 1611 | 1612 | Please wait.. 1613 | 1614 | 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 0 1630 | 0 1631 | 1632 | 1633 | 1634 | QFrame::StyledPanel 1635 | 1636 | 1637 | QFrame::Raised 1638 | 1639 | 1640 | 1641 | 5 1642 | 1643 | 1644 | 5 1645 | 1646 | 1647 | 5 1648 | 1649 | 1650 | 5 1651 | 1652 | 1653 | 5 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 12 1660 | false 1661 | 1662 | 1663 | 1664 | color: rgb(255, 0, 0); 1665 | 1666 | 1667 | Weather response messages 1668 | 1669 | 1670 | true 1671 | 1672 | 1673 | Qt::AlignCenter 1674 | 1675 | 1676 | true 1677 | 1678 | 1679 | 5 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 12 1688 | 75 1689 | true 1690 | 1691 | 1692 | 1693 | padding: 5px; 1694 | border: 1px solid rgb(255, 0, 0); 1695 | background-color:rgb(252, 192, 125); 1696 | border-radius: 10px; 1697 | 1698 | 1699 | Re-try 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | -------------------------------------------------------------------------------- /ui_mainwindow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'mainwindowfWqlrO.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 5.15.0 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject, 12 | QObject, QPoint, QRect, QSize, QTime, QUrl, Qt) 13 | from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, 14 | QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter, 15 | QPixmap, QRadialGradient) 16 | from PySide2.QtWidgets import * 17 | 18 | import icons_rc 19 | import icons_rc 20 | 21 | class Ui_MainWindow(object): 22 | def setupUi(self, MainWindow): 23 | if not MainWindow.objectName(): 24 | MainWindow.setObjectName(u"MainWindow") 25 | MainWindow.resize(935, 750) 26 | MainWindow.setStyleSheet(u"QScrollArea {\n" 27 | " border: none;\n" 28 | " border-radius: 0px;\n" 29 | "}\n" 30 | "QScrollBar:horizontal {\n" 31 | " border: none;\n" 32 | " background: rgb(154, 148, 196);\n" 33 | " height: 5px;\n" 34 | " margin: 0px 21px 0 21px;\n" 35 | " border-radius: 0px;\n" 36 | "}\n" 37 | " QScrollBar:vertical {\n" 38 | " border: none;\n" 39 | " background: rgb(154, 148, 196);\n" 40 | " width: 5px;\n" 41 | " margin: 21px 0 21px 0;\n" 42 | " border-radius: 0px;\n" 43 | " }\n" 44 | "") 45 | self.centralwidget = QWidget(MainWindow) 46 | self.centralwidget.setObjectName(u"centralwidget") 47 | self.centralwidget.setStyleSheet(u"background-color: rgb(40, 40, 40);\n" 48 | "color: #fff;") 49 | self.horizontalLayout = QHBoxLayout(self.centralwidget) 50 | self.horizontalLayout.setSpacing(0) 51 | self.horizontalLayout.setObjectName(u"horizontalLayout") 52 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 53 | self.scrollArea = QScrollArea(self.centralwidget) 54 | self.scrollArea.setObjectName(u"scrollArea") 55 | self.scrollArea.setStyleSheet(u"") 56 | self.scrollArea.setFrameShape(QFrame.NoFrame) 57 | self.scrollArea.setWidgetResizable(True) 58 | self.scrollAreaWidgetContents = QWidget() 59 | self.scrollAreaWidgetContents.setObjectName(u"scrollAreaWidgetContents") 60 | self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 930, 807)) 61 | self.scrollAreaWidgetContents.setStyleSheet(u"QComboBox{\n" 62 | " background-color: rgb(27, 29, 35);\n" 63 | "}\n" 64 | "QComboBox:hover{\n" 65 | " border: 2px solid rgb(64, 71, 88);\n" 66 | "}\n" 67 | "QComboBox QAbstractItemView {\n" 68 | " color: rgb(85, 170, 255); \n" 69 | " background-color: rgb(27, 29, 35);\n" 70 | " selection-background-color: rgb(39, 44, 54);\n" 71 | "}") 72 | self.verticalLayout_3 = QVBoxLayout(self.scrollAreaWidgetContents) 73 | self.verticalLayout_3.setSpacing(0) 74 | self.verticalLayout_3.setObjectName(u"verticalLayout_3") 75 | self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) 76 | self.main_container = QFrame(self.scrollAreaWidgetContents) 77 | self.main_container.setObjectName(u"main_container") 78 | self.main_container.setMinimumSize(QSize(0, 0)) 79 | self.main_container.setMaximumSize(QSize(16777215, 16777215)) 80 | self.main_container.setStyleSheet(u"") 81 | self.main_container.setFrameShape(QFrame.StyledPanel) 82 | self.main_container.setFrameShadow(QFrame.Raised) 83 | self.gridLayout_4 = QGridLayout(self.main_container) 84 | self.gridLayout_4.setSpacing(0) 85 | self.gridLayout_4.setObjectName(u"gridLayout_4") 86 | self.gridLayout_4.setContentsMargins(0, 0, 0, 0) 87 | self.scrollArea_2 = QScrollArea(self.main_container) 88 | self.scrollArea_2.setObjectName(u"scrollArea_2") 89 | self.scrollArea_2.setMinimumSize(QSize(0, 192)) 90 | self.scrollArea_2.setWidgetResizable(True) 91 | self.scrollAreaWidgetContents_5 = QWidget() 92 | self.scrollAreaWidgetContents_5.setObjectName(u"scrollAreaWidgetContents_5") 93 | self.scrollAreaWidgetContents_5.setGeometry(QRect(0, 0, 1072, 187)) 94 | self.scrollAreaWidgetContents_5.setMaximumSize(QSize(16777215, 665)) 95 | self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents_5) 96 | self.verticalLayout.setObjectName(u"verticalLayout") 97 | self.weather_forecast_frame = QFrame(self.scrollAreaWidgetContents_5) 98 | self.weather_forecast_frame.setObjectName(u"weather_forecast_frame") 99 | self.weather_forecast_frame.setStyleSheet(u"QFrame{border-top: 2px solid rgb(154, 148, 196)}") 100 | self.weather_forecast_frame.setFrameShape(QFrame.StyledPanel) 101 | self.weather_forecast_frame.setFrameShadow(QFrame.Raised) 102 | self.horizontalLayout_4 = QHBoxLayout(self.weather_forecast_frame) 103 | self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") 104 | self.frame_8 = QFrame(self.weather_forecast_frame) 105 | self.frame_8.setObjectName(u"frame_8") 106 | self.frame_8.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 107 | "padding: 10px;\n" 108 | "border-radius: 20px;\n" 109 | "border: none;") 110 | self.frame_8.setFrameShape(QFrame.StyledPanel) 111 | self.frame_8.setFrameShadow(QFrame.Raised) 112 | self.gridLayout_7 = QGridLayout(self.frame_8) 113 | self.gridLayout_7.setObjectName(u"gridLayout_7") 114 | self.forecast_temp1 = QLabel(self.frame_8) 115 | self.forecast_temp1.setObjectName(u"forecast_temp1") 116 | self.forecast_temp1.setMinimumSize(QSize(0, 30)) 117 | font = QFont() 118 | font.setFamily(u"Adobe Caslon Pro") 119 | font.setPointSize(12) 120 | font.setBold(True) 121 | font.setWeight(75) 122 | self.forecast_temp1.setFont(font) 123 | self.forecast_temp1.setStyleSheet(u"color: rgb(173, 167, 220);border: none;") 124 | 125 | self.gridLayout_7.addWidget(self.forecast_temp1, 1, 1, 1, 1) 126 | 127 | self.forecast_icon1 = QLabel(self.frame_8) 128 | self.forecast_icon1.setObjectName(u"forecast_icon1") 129 | self.forecast_icon1.setMinimumSize(QSize(50, 50)) 130 | self.forecast_icon1.setMaximumSize(QSize(50, 50)) 131 | font1 = QFont() 132 | font1.setPointSize(2) 133 | self.forecast_icon1.setFont(font1) 134 | self.forecast_icon1.setStyleSheet(u"border: none;\n" 135 | "padding: 5px;\n" 136 | "border: 2px solid rgb(103, 103, 103);\n" 137 | "border-radius: 25px;\n" 138 | "color: rgb(252, 191, 130);") 139 | self.forecast_icon1.setPixmap(QPixmap(u":/weather/icons/weather/png/030-weather app.png")) 140 | self.forecast_icon1.setScaledContents(True) 141 | 142 | self.gridLayout_7.addWidget(self.forecast_icon1, 1, 0, 1, 1) 143 | 144 | self.forecast_time1 = QLabel(self.frame_8) 145 | self.forecast_time1.setObjectName(u"forecast_time1") 146 | self.forecast_time1.setMinimumSize(QSize(0, 30)) 147 | font2 = QFont() 148 | font2.setFamily(u"Adobe Caslon Pro") 149 | font2.setPointSize(12) 150 | self.forecast_time1.setFont(font2) 151 | self.forecast_time1.setStyleSheet(u"border: none;") 152 | self.forecast_time1.setAlignment(Qt.AlignCenter) 153 | 154 | self.gridLayout_7.addWidget(self.forecast_time1, 0, 0, 1, 2) 155 | 156 | 157 | self.horizontalLayout_4.addWidget(self.frame_8) 158 | 159 | self.frame_9 = QFrame(self.weather_forecast_frame) 160 | self.frame_9.setObjectName(u"frame_9") 161 | self.frame_9.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 162 | "padding: 10px;\n" 163 | "border-radius: 20px;\n" 164 | "border: none;") 165 | self.frame_9.setFrameShape(QFrame.StyledPanel) 166 | self.frame_9.setFrameShadow(QFrame.Raised) 167 | self.gridLayout_8 = QGridLayout(self.frame_9) 168 | self.gridLayout_8.setObjectName(u"gridLayout_8") 169 | self.forecast_temp2 = QLabel(self.frame_9) 170 | self.forecast_temp2.setObjectName(u"forecast_temp2") 171 | self.forecast_temp2.setMinimumSize(QSize(0, 30)) 172 | self.forecast_temp2.setFont(font) 173 | self.forecast_temp2.setStyleSheet(u"color: rgb(173, 167, 220);border: none;") 174 | 175 | self.gridLayout_8.addWidget(self.forecast_temp2, 1, 1, 1, 1) 176 | 177 | self.forecast_icon2 = QLabel(self.frame_9) 178 | self.forecast_icon2.setObjectName(u"forecast_icon2") 179 | self.forecast_icon2.setMinimumSize(QSize(50, 50)) 180 | self.forecast_icon2.setMaximumSize(QSize(50, 50)) 181 | self.forecast_icon2.setFont(font1) 182 | self.forecast_icon2.setStyleSheet(u"border: none;\n" 183 | "padding: 5px;\n" 184 | "border: 2px solid rgb(103, 103, 103);\n" 185 | "border-radius: 25px;\n" 186 | "color: rgb(252, 191, 130);") 187 | self.forecast_icon2.setPixmap(QPixmap(u":/weather/icons/weather/png/030-weather app.png")) 188 | self.forecast_icon2.setScaledContents(True) 189 | 190 | self.gridLayout_8.addWidget(self.forecast_icon2, 1, 0, 1, 1) 191 | 192 | self.forecast_time2 = QLabel(self.frame_9) 193 | self.forecast_time2.setObjectName(u"forecast_time2") 194 | self.forecast_time2.setMinimumSize(QSize(0, 30)) 195 | self.forecast_time2.setFont(font2) 196 | self.forecast_time2.setStyleSheet(u"border: none;") 197 | self.forecast_time2.setAlignment(Qt.AlignCenter) 198 | 199 | self.gridLayout_8.addWidget(self.forecast_time2, 0, 0, 1, 2) 200 | 201 | 202 | self.horizontalLayout_4.addWidget(self.frame_9) 203 | 204 | self.frame_10 = QFrame(self.weather_forecast_frame) 205 | self.frame_10.setObjectName(u"frame_10") 206 | self.frame_10.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 207 | "padding: 10px;\n" 208 | "border-radius: 20px;\n" 209 | "border: none;") 210 | self.frame_10.setFrameShape(QFrame.StyledPanel) 211 | self.frame_10.setFrameShadow(QFrame.Raised) 212 | self.gridLayout_9 = QGridLayout(self.frame_10) 213 | self.gridLayout_9.setObjectName(u"gridLayout_9") 214 | self.forecast_temp3 = QLabel(self.frame_10) 215 | self.forecast_temp3.setObjectName(u"forecast_temp3") 216 | self.forecast_temp3.setMinimumSize(QSize(0, 30)) 217 | self.forecast_temp3.setFont(font) 218 | self.forecast_temp3.setStyleSheet(u"color: rgb(173, 167, 220);border: none;") 219 | 220 | self.gridLayout_9.addWidget(self.forecast_temp3, 1, 1, 1, 1) 221 | 222 | self.forecast_icon3 = QLabel(self.frame_10) 223 | self.forecast_icon3.setObjectName(u"forecast_icon3") 224 | self.forecast_icon3.setMinimumSize(QSize(50, 50)) 225 | self.forecast_icon3.setMaximumSize(QSize(50, 50)) 226 | self.forecast_icon3.setFont(font1) 227 | self.forecast_icon3.setStyleSheet(u"border: none;\n" 228 | "padding: 5px;\n" 229 | "border: 2px solid rgb(103, 103, 103);\n" 230 | "border-radius: 25px;\n" 231 | "color: rgb(252, 191, 130);") 232 | self.forecast_icon3.setPixmap(QPixmap(u":/weather/icons/weather/png/030-weather app.png")) 233 | self.forecast_icon3.setScaledContents(True) 234 | 235 | self.gridLayout_9.addWidget(self.forecast_icon3, 1, 0, 1, 1) 236 | 237 | self.forecast_time3 = QLabel(self.frame_10) 238 | self.forecast_time3.setObjectName(u"forecast_time3") 239 | self.forecast_time3.setMinimumSize(QSize(0, 30)) 240 | self.forecast_time3.setFont(font2) 241 | self.forecast_time3.setStyleSheet(u"border: none;") 242 | self.forecast_time3.setAlignment(Qt.AlignCenter) 243 | 244 | self.gridLayout_9.addWidget(self.forecast_time3, 0, 0, 1, 2) 245 | 246 | 247 | self.horizontalLayout_4.addWidget(self.frame_10) 248 | 249 | self.frame_11 = QFrame(self.weather_forecast_frame) 250 | self.frame_11.setObjectName(u"frame_11") 251 | self.frame_11.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 252 | "padding: 10px;\n" 253 | "border-radius: 20px;\n" 254 | "border: none;") 255 | self.frame_11.setFrameShape(QFrame.StyledPanel) 256 | self.frame_11.setFrameShadow(QFrame.Raised) 257 | self.gridLayout_10 = QGridLayout(self.frame_11) 258 | self.gridLayout_10.setObjectName(u"gridLayout_10") 259 | self.forecast_icon4 = QLabel(self.frame_11) 260 | self.forecast_icon4.setObjectName(u"forecast_icon4") 261 | self.forecast_icon4.setMinimumSize(QSize(50, 50)) 262 | self.forecast_icon4.setMaximumSize(QSize(50, 50)) 263 | self.forecast_icon4.setFont(font1) 264 | self.forecast_icon4.setStyleSheet(u"border: none;\n" 265 | "padding: 5px;\n" 266 | "border: 2px solid rgb(103, 103, 103);\n" 267 | "border-radius: 25px;\n" 268 | "color: rgb(252, 191, 130);") 269 | self.forecast_icon4.setPixmap(QPixmap(u":/weather/icons/weather/png/030-weather app.png")) 270 | self.forecast_icon4.setScaledContents(True) 271 | 272 | self.gridLayout_10.addWidget(self.forecast_icon4, 1, 0, 1, 1) 273 | 274 | self.forecast_temp4 = QLabel(self.frame_11) 275 | self.forecast_temp4.setObjectName(u"forecast_temp4") 276 | self.forecast_temp4.setMinimumSize(QSize(0, 30)) 277 | self.forecast_temp4.setFont(font) 278 | self.forecast_temp4.setStyleSheet(u"color: rgb(173, 167, 220);border: none;") 279 | 280 | self.gridLayout_10.addWidget(self.forecast_temp4, 1, 1, 1, 1) 281 | 282 | self.forecast_time4 = QLabel(self.frame_11) 283 | self.forecast_time4.setObjectName(u"forecast_time4") 284 | self.forecast_time4.setMinimumSize(QSize(0, 30)) 285 | self.forecast_time4.setFont(font2) 286 | self.forecast_time4.setStyleSheet(u"border: none;") 287 | self.forecast_time4.setAlignment(Qt.AlignCenter) 288 | 289 | self.gridLayout_10.addWidget(self.forecast_time4, 0, 0, 1, 2) 290 | 291 | 292 | self.horizontalLayout_4.addWidget(self.frame_11) 293 | 294 | self.frame_12 = QFrame(self.weather_forecast_frame) 295 | self.frame_12.setObjectName(u"frame_12") 296 | self.frame_12.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 297 | "padding: 10px;\n" 298 | "border-radius: 20px;\n" 299 | "border: none;") 300 | self.frame_12.setFrameShape(QFrame.StyledPanel) 301 | self.frame_12.setFrameShadow(QFrame.Raised) 302 | self.gridLayout_11 = QGridLayout(self.frame_12) 303 | self.gridLayout_11.setObjectName(u"gridLayout_11") 304 | self.forecast_temp5 = QLabel(self.frame_12) 305 | self.forecast_temp5.setObjectName(u"forecast_temp5") 306 | self.forecast_temp5.setMinimumSize(QSize(0, 30)) 307 | self.forecast_temp5.setFont(font) 308 | self.forecast_temp5.setStyleSheet(u"color: rgb(173, 167, 220);\n" 309 | "border: none;") 310 | 311 | self.gridLayout_11.addWidget(self.forecast_temp5, 1, 1, 1, 1) 312 | 313 | self.forecast_icon5 = QLabel(self.frame_12) 314 | self.forecast_icon5.setObjectName(u"forecast_icon5") 315 | self.forecast_icon5.setMinimumSize(QSize(50, 50)) 316 | self.forecast_icon5.setMaximumSize(QSize(50, 50)) 317 | self.forecast_icon5.setFont(font1) 318 | self.forecast_icon5.setStyleSheet(u"border: none;\n" 319 | "padding: 5px;\n" 320 | "border: 2px solid rgb(103, 103, 103);\n" 321 | "border-radius: 25px;\n" 322 | "color: rgb(252, 191, 130);") 323 | self.forecast_icon5.setPixmap(QPixmap(u":/weather/icons/weather/png/030-weather app.png")) 324 | self.forecast_icon5.setScaledContents(True) 325 | 326 | self.gridLayout_11.addWidget(self.forecast_icon5, 1, 0, 1, 1) 327 | 328 | self.forecast_time5 = QLabel(self.frame_12) 329 | self.forecast_time5.setObjectName(u"forecast_time5") 330 | self.forecast_time5.setMinimumSize(QSize(0, 30)) 331 | self.forecast_time5.setFont(font2) 332 | self.forecast_time5.setStyleSheet(u"border: none;") 333 | 334 | self.gridLayout_11.addWidget(self.forecast_time5, 0, 0, 1, 2) 335 | 336 | 337 | self.horizontalLayout_4.addWidget(self.frame_12) 338 | 339 | 340 | self.verticalLayout.addWidget(self.weather_forecast_frame, 0, Qt.AlignTop) 341 | 342 | self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_5) 343 | 344 | self.gridLayout_4.addWidget(self.scrollArea_2, 8, 0, 1, 1) 345 | 346 | self.label_7 = QLabel(self.main_container) 347 | self.label_7.setObjectName(u"label_7") 348 | font3 = QFont() 349 | font3.setFamily(u"Adobe Garamond Pro Bold") 350 | font3.setPointSize(12) 351 | self.label_7.setFont(font3) 352 | self.label_7.setStyleSheet(u"border: none;\n" 353 | "color: rgb(252, 192, 125)") 354 | 355 | self.gridLayout_4.addWidget(self.label_7, 7, 0, 1, 1) 356 | 357 | self.progressBar = QProgressBar(self.main_container) 358 | self.progressBar.setObjectName(u"progressBar") 359 | self.progressBar.setEnabled(True) 360 | self.progressBar.setMinimumSize(QSize(0, 10)) 361 | self.progressBar.setMaximumSize(QSize(16777215, 10)) 362 | self.progressBar.setStyleSheet(u"QProgressBar{\n" 363 | " background-color: rgb(27, 29, 35);\n" 364 | " border-style: none;\n" 365 | " border-radius: 10px;\n" 366 | " text-align: center;\n" 367 | " color: rgb(255, 0, 0)\n" 368 | "}\n" 369 | "QProgressBar::chunk{\n" 370 | " background-color: qlineargradient(spread:pad, x1:0, y1:0.506, x2:1, y2:0.494, stop:0 rgba(252, 192, 125, 255), stop:1 rgba(255, 255, 255, 255));\n" 371 | " border-radius: 5px;\n" 372 | "}") 373 | self.progressBar.setMinimum(0) 374 | self.progressBar.setValue(0) 375 | self.progressBar.setTextVisible(False) 376 | self.progressBar.setInvertedAppearance(False) 377 | 378 | self.gridLayout_4.addWidget(self.progressBar, 4, 0, 1, 1) 379 | 380 | self.top_frame_2 = QFrame(self.main_container) 381 | self.top_frame_2.setObjectName(u"top_frame_2") 382 | self.top_frame_2.setMinimumSize(QSize(0, 62)) 383 | self.top_frame_2.setMaximumSize(QSize(16777215, 62)) 384 | self.top_frame_2.setStyleSheet(u"") 385 | self.top_frame_2.setFrameShape(QFrame.StyledPanel) 386 | self.top_frame_2.setFrameShadow(QFrame.Raised) 387 | self.gridLayout_2 = QGridLayout(self.top_frame_2) 388 | self.gridLayout_2.setObjectName(u"gridLayout_2") 389 | self.label_4 = QLabel(self.top_frame_2) 390 | self.label_4.setObjectName(u"label_4") 391 | font4 = QFont() 392 | font4.setFamily(u"Open Sans Extrabold") 393 | font4.setPointSize(15) 394 | font4.setBold(False) 395 | font4.setWeight(50) 396 | self.label_4.setFont(font4) 397 | self.label_4.setStyleSheet(u"color: rgb(252, 192, 125)") 398 | self.label_4.setAlignment(Qt.AlignCenter) 399 | 400 | self.gridLayout_2.addWidget(self.label_4, 0, 0, 1, 1, Qt.AlignTop) 401 | 402 | self.weather_location = QLabel(self.top_frame_2) 403 | self.weather_location.setObjectName(u"weather_location") 404 | font5 = QFont() 405 | font5.setFamily(u"Adobe Kaiti Std R") 406 | font5.setPointSize(13) 407 | font5.setBold(True) 408 | font5.setItalic(False) 409 | font5.setWeight(75) 410 | self.weather_location.setFont(font5) 411 | self.weather_location.setAlignment(Qt.AlignCenter) 412 | 413 | self.gridLayout_2.addWidget(self.weather_location, 1, 0, 1, 1) 414 | 415 | 416 | self.gridLayout_4.addWidget(self.top_frame_2, 3, 0, 1, 1) 417 | 418 | self.label_18 = QLabel(self.main_container) 419 | self.label_18.setObjectName(u"label_18") 420 | self.label_18.setFont(font3) 421 | self.label_18.setStyleSheet(u"border: none;\n" 422 | "color: rgb(252, 192, 125)") 423 | 424 | self.gridLayout_4.addWidget(self.label_18, 1, 0, 1, 1) 425 | 426 | self.header_frame = QFrame(self.main_container) 427 | self.header_frame.setObjectName(u"header_frame") 428 | self.header_frame.setStyleSheet(u" background-color: rgb(27, 29, 35);") 429 | self.header_frame.setFrameShape(QFrame.StyledPanel) 430 | self.header_frame.setFrameShadow(QFrame.Raised) 431 | self.horizontalLayout_3 = QHBoxLayout(self.header_frame) 432 | self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") 433 | self.label_20 = QLabel(self.header_frame) 434 | self.label_20.setObjectName(u"label_20") 435 | self.label_20.setMinimumSize(QSize(80, 80)) 436 | self.label_20.setMaximumSize(QSize(80, 80)) 437 | font6 = QFont() 438 | font6.setPointSize(12) 439 | self.label_20.setFont(font6) 440 | self.label_20.setPixmap(QPixmap(u":/weather/icons/weather/png/028-wind vane.png")) 441 | self.label_20.setScaledContents(True) 442 | 443 | self.horizontalLayout_3.addWidget(self.label_20, 0, Qt.AlignHCenter) 444 | 445 | self.label_19 = QLabel(self.header_frame) 446 | self.label_19.setObjectName(u"label_19") 447 | font7 = QFont() 448 | font7.setFamily(u"Adobe Garamond Pro Bold") 449 | font7.setPointSize(25) 450 | font7.setBold(True) 451 | font7.setWeight(75) 452 | self.label_19.setFont(font7) 453 | self.label_19.setStyleSheet(u"border: none;\n" 454 | "color: rgb(252, 192, 125)") 455 | 456 | self.horizontalLayout_3.addWidget(self.label_19) 457 | 458 | 459 | self.gridLayout_4.addWidget(self.header_frame, 0, 0, 1, 1) 460 | 461 | self.top_frame = QFrame(self.main_container) 462 | self.top_frame.setObjectName(u"top_frame") 463 | self.top_frame.setMinimumSize(QSize(882, 62)) 464 | self.top_frame.setMaximumSize(QSize(16777215, 62)) 465 | self.top_frame.setStyleSheet(u"border-bottom: 2px solid rgb(154, 148, 196)") 466 | self.top_frame.setFrameShape(QFrame.StyledPanel) 467 | self.top_frame.setFrameShadow(QFrame.Raised) 468 | self.gridLayout = QGridLayout(self.top_frame) 469 | self.gridLayout.setObjectName(u"gridLayout") 470 | self.countries_list = QComboBox(self.top_frame) 471 | self.countries_list.setObjectName(u"countries_list") 472 | font8 = QFont() 473 | font8.setFamily(u"Sitka Banner") 474 | font8.setPointSize(14) 475 | self.countries_list.setFont(font8) 476 | self.countries_list.setStyleSheet(u"padding: 5px;\n" 477 | "border: 1px solid rgb(103, 103, 103);\n" 478 | "border-radius: 10px;\n" 479 | "color: rgb(252, 191, 130);") 480 | 481 | self.gridLayout.addWidget(self.countries_list, 1, 3, 1, 1) 482 | 483 | self.continents_list = QComboBox(self.top_frame) 484 | self.continents_list.setObjectName(u"continents_list") 485 | self.continents_list.setFont(font8) 486 | self.continents_list.setStyleSheet(u"padding: 5px;\n" 487 | "border: 1px solid rgb(103, 103, 103);\n" 488 | "border-radius: 10px;\n" 489 | "color: rgb(252, 191, 130);") 490 | 491 | self.gridLayout.addWidget(self.continents_list, 1, 1, 1, 1) 492 | 493 | self.label = QLabel(self.top_frame) 494 | self.label.setObjectName(u"label") 495 | self.label.setFont(font8) 496 | self.label.setStyleSheet(u"padding: 5px;\n" 497 | "border: 1px solid rgb(252, 192, 125);\n" 498 | "border-radius: 10px;") 499 | 500 | self.gridLayout.addWidget(self.label, 1, 0, 1, 1) 501 | 502 | self.label_3 = QLabel(self.top_frame) 503 | self.label_3.setObjectName(u"label_3") 504 | self.label_3.setFont(font8) 505 | self.label_3.setStyleSheet(u"padding: 5px;\n" 506 | "border: 1px solid rgb(252, 192, 125);\n" 507 | "border-radius: 10px;") 508 | 509 | self.gridLayout.addWidget(self.label_3, 1, 2, 1, 1) 510 | 511 | self.label_2 = QLabel(self.top_frame) 512 | self.label_2.setObjectName(u"label_2") 513 | self.label_2.setFont(font8) 514 | self.label_2.setStyleSheet(u"padding: 5px;\n" 515 | "border: 1px solid rgb(252, 192, 125);\n" 516 | "border-radius: 10px;") 517 | 518 | self.gridLayout.addWidget(self.label_2, 1, 4, 1, 1) 519 | 520 | self.cities_list = QComboBox(self.top_frame) 521 | self.cities_list.setObjectName(u"cities_list") 522 | self.cities_list.setFont(font8) 523 | self.cities_list.setStyleSheet(u"padding: 5px;\n" 524 | "border: 1px solid rgb(103, 103, 103);\n" 525 | "border-radius: 10px;\n" 526 | "color: rgb(252, 191, 130);") 527 | 528 | self.gridLayout.addWidget(self.cities_list, 1, 5, 1, 1) 529 | 530 | 531 | self.gridLayout_4.addWidget(self.top_frame, 2, 0, 1, 1) 532 | 533 | self.frame = QFrame(self.main_container) 534 | self.frame.setObjectName(u"frame") 535 | self.frame.setStyleSheet(u"QFrame{border-top: 2px solid rgb(154, 148, 196)}") 536 | self.frame.setFrameShape(QFrame.StyledPanel) 537 | self.frame.setFrameShadow(QFrame.Raised) 538 | self.verticalLayout_2 = QVBoxLayout(self.frame) 539 | self.verticalLayout_2.setObjectName(u"verticalLayout_2") 540 | self.label_5 = QLabel(self.frame) 541 | self.label_5.setObjectName(u"label_5") 542 | self.label_5.setFont(font3) 543 | self.label_5.setStyleSheet(u"border: none;\n" 544 | "color: rgb(252, 192, 125)") 545 | 546 | self.verticalLayout_2.addWidget(self.label_5, 0, Qt.AlignLeft|Qt.AlignTop) 547 | 548 | self.middle_frame = QFrame(self.frame) 549 | self.middle_frame.setObjectName(u"middle_frame") 550 | self.middle_frame.setStyleSheet(u"border: none;") 551 | self.middle_frame.setFrameShape(QFrame.StyledPanel) 552 | self.middle_frame.setFrameShadow(QFrame.Raised) 553 | self.horizontalLayout_2 = QHBoxLayout(self.middle_frame) 554 | self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") 555 | self.frame_6 = QFrame(self.middle_frame) 556 | self.frame_6.setObjectName(u"frame_6") 557 | self.frame_6.setMinimumSize(QSize(200, 200)) 558 | self.frame_6.setMaximumSize(QSize(200, 200)) 559 | self.frame_6.setStyleSheet(u"padding: 5px;\n" 560 | "border: 5px solid rgb(103, 103, 103);\n" 561 | "border-radius: 100px;\n" 562 | "color: rgb(252, 191, 130);") 563 | self.frame_6.setFrameShape(QFrame.StyledPanel) 564 | self.frame_6.setFrameShadow(QFrame.Raised) 565 | self.verticalLayout_4 = QVBoxLayout(self.frame_6) 566 | self.verticalLayout_4.setObjectName(u"verticalLayout_4") 567 | self.current_weather_icon = QLabel(self.frame_6) 568 | self.current_weather_icon.setObjectName(u"current_weather_icon") 569 | self.current_weather_icon.setMinimumSize(QSize(100, 100)) 570 | self.current_weather_icon.setMaximumSize(QSize(100, 100)) 571 | self.current_weather_icon.setStyleSheet(u"border: none;\n" 572 | "background: none;") 573 | self.current_weather_icon.setPixmap(QPixmap(u":/weather/icons/weather/png/027-location.png")) 574 | self.current_weather_icon.setScaledContents(True) 575 | self.current_weather_icon.setAlignment(Qt.AlignCenter) 576 | 577 | self.verticalLayout_4.addWidget(self.current_weather_icon) 578 | 579 | self.current_weather_label = QLabel(self.frame_6) 580 | self.current_weather_label.setObjectName(u"current_weather_label") 581 | self.current_weather_label.setFont(font2) 582 | self.current_weather_label.setStyleSheet(u"border: none;\n" 583 | "padding: 15px;\n" 584 | "background: none;") 585 | self.current_weather_label.setAlignment(Qt.AlignCenter) 586 | self.current_weather_label.setWordWrap(True) 587 | 588 | self.verticalLayout_4.addWidget(self.current_weather_label) 589 | 590 | 591 | self.horizontalLayout_2.addWidget(self.frame_6, 0, Qt.AlignLeft|Qt.AlignVCenter) 592 | 593 | self.frame_3 = QFrame(self.middle_frame) 594 | self.frame_3.setObjectName(u"frame_3") 595 | self.frame_3.setMinimumSize(QSize(0, 0)) 596 | self.frame_3.setMaximumSize(QSize(16777215, 16777215)) 597 | self.frame_3.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 598 | "padding: 10px;\n" 599 | "border-radius: 20px;") 600 | self.frame_3.setFrameShape(QFrame.StyledPanel) 601 | self.frame_3.setFrameShadow(QFrame.Raised) 602 | self.gridLayout_3 = QGridLayout(self.frame_3) 603 | self.gridLayout_3.setObjectName(u"gridLayout_3") 604 | self.label_12 = QLabel(self.frame_3) 605 | self.label_12.setObjectName(u"label_12") 606 | self.label_12.setMinimumSize(QSize(50, 50)) 607 | self.label_12.setMaximumSize(QSize(50, 50)) 608 | self.label_12.setStyleSheet(u"padding: 5px;\n" 609 | "border: 2px solid rgb(103, 103, 103);\n" 610 | "border-radius: 20px;\n" 611 | "color: rgb(252, 191, 130);") 612 | self.label_12.setPixmap(QPixmap(u":/weather/icons/weather/png/031-weather forecast.png")) 613 | self.label_12.setScaledContents(True) 614 | 615 | self.gridLayout_3.addWidget(self.label_12, 1, 0, 1, 1) 616 | 617 | self.label_8 = QLabel(self.frame_3) 618 | self.label_8.setObjectName(u"label_8") 619 | self.label_8.setMinimumSize(QSize(50, 50)) 620 | self.label_8.setMaximumSize(QSize(50, 50)) 621 | self.label_8.setStyleSheet(u"padding: 5px;\n" 622 | "border: 2px solid rgb(103, 103, 103);\n" 623 | "border-radius: 20px;\n" 624 | "color: rgb(252, 191, 130);") 625 | self.label_8.setPixmap(QPixmap(u":/weather/icons/weather/png/031-weather forecast.png")) 626 | self.label_8.setScaledContents(True) 627 | 628 | self.gridLayout_3.addWidget(self.label_8, 0, 0, 1, 1) 629 | 630 | self.latitude_label1 = QLabel(self.frame_3) 631 | self.latitude_label1.setObjectName(u"latitude_label1") 632 | self.latitude_label1.setMinimumSize(QSize(0, 30)) 633 | self.latitude_label1.setFont(font2) 634 | 635 | self.gridLayout_3.addWidget(self.latitude_label1, 1, 1, 1, 1) 636 | 637 | self.label_13 = QLabel(self.frame_3) 638 | self.label_13.setObjectName(u"label_13") 639 | self.label_13.setMinimumSize(QSize(50, 50)) 640 | self.label_13.setMaximumSize(QSize(50, 50)) 641 | self.label_13.setStyleSheet(u"padding: 5px;\n" 642 | "border: 2px solid rgb(103, 103, 103);\n" 643 | "border-radius: 20px;\n" 644 | "color: rgb(252, 191, 130);") 645 | self.label_13.setPixmap(QPixmap(u":/weather/icons/weather/png/001-cloudy day.png")) 646 | self.label_13.setScaledContents(True) 647 | 648 | self.gridLayout_3.addWidget(self.label_13, 2, 0, 1, 1) 649 | 650 | self.longitude_label = QLabel(self.frame_3) 651 | self.longitude_label.setObjectName(u"longitude_label") 652 | self.longitude_label.setMinimumSize(QSize(0, 30)) 653 | self.longitude_label.setFont(font) 654 | self.longitude_label.setStyleSheet(u"color: rgb(173, 167, 220);") 655 | 656 | self.gridLayout_3.addWidget(self.longitude_label, 0, 2, 1, 1) 657 | 658 | self.sunrise_label1 = QLabel(self.frame_3) 659 | self.sunrise_label1.setObjectName(u"sunrise_label1") 660 | self.sunrise_label1.setMinimumSize(QSize(0, 30)) 661 | self.sunrise_label1.setFont(font2) 662 | 663 | self.gridLayout_3.addWidget(self.sunrise_label1, 2, 1, 1, 1) 664 | 665 | self.current_weather_label_8 = QLabel(self.frame_3) 666 | self.current_weather_label_8.setObjectName(u"current_weather_label_8") 667 | self.current_weather_label_8.setMinimumSize(QSize(0, 30)) 668 | self.current_weather_label_8.setFont(font2) 669 | 670 | self.gridLayout_3.addWidget(self.current_weather_label_8, 0, 1, 1, 1) 671 | 672 | self.latitude_label = QLabel(self.frame_3) 673 | self.latitude_label.setObjectName(u"latitude_label") 674 | self.latitude_label.setMinimumSize(QSize(0, 30)) 675 | self.latitude_label.setFont(font) 676 | self.latitude_label.setStyleSheet(u"color: rgb(173, 167, 220);") 677 | 678 | self.gridLayout_3.addWidget(self.latitude_label, 1, 2, 1, 1) 679 | 680 | self.sunrise_label = QLabel(self.frame_3) 681 | self.sunrise_label.setObjectName(u"sunrise_label") 682 | self.sunrise_label.setMinimumSize(QSize(0, 30)) 683 | self.sunrise_label.setFont(font) 684 | self.sunrise_label.setStyleSheet(u"color: rgb(173, 167, 220);") 685 | 686 | self.gridLayout_3.addWidget(self.sunrise_label, 2, 2, 1, 1) 687 | 688 | 689 | self.horizontalLayout_2.addWidget(self.frame_3, 0, Qt.AlignHCenter) 690 | 691 | self.frame_7 = QFrame(self.middle_frame) 692 | self.frame_7.setObjectName(u"frame_7") 693 | self.frame_7.setStyleSheet(u"background-color: rgb(27, 29, 35);\n" 694 | "padding: 10px;\n" 695 | "border-radius: 20px;") 696 | self.frame_7.setFrameShape(QFrame.StyledPanel) 697 | self.frame_7.setFrameShadow(QFrame.Raised) 698 | self.gridLayout_6 = QGridLayout(self.frame_7) 699 | self.gridLayout_6.setObjectName(u"gridLayout_6") 700 | self.label_9 = QLabel(self.frame_7) 701 | self.label_9.setObjectName(u"label_9") 702 | self.label_9.setMaximumSize(QSize(50, 50)) 703 | font9 = QFont() 704 | font9.setPointSize(42) 705 | self.label_9.setFont(font9) 706 | self.label_9.setStyleSheet(u"padding: 5px;\n" 707 | "border: 2px solid rgb(103, 103, 103);\n" 708 | "border-radius: 20px;\n" 709 | "color: rgb(252, 191, 130);") 710 | self.label_9.setPixmap(QPixmap(u":/weather/icons/weather/png/007-windy.png")) 711 | self.label_9.setScaledContents(True) 712 | 713 | self.gridLayout_6.addWidget(self.label_9, 0, 0, 1, 1) 714 | 715 | self.wind_speed_label1 = QLabel(self.frame_7) 716 | self.wind_speed_label1.setObjectName(u"wind_speed_label1") 717 | self.wind_speed_label1.setFont(font2) 718 | 719 | self.gridLayout_6.addWidget(self.wind_speed_label1, 0, 1, 1, 1) 720 | 721 | self.wind_speed_label = QLabel(self.frame_7) 722 | self.wind_speed_label.setObjectName(u"wind_speed_label") 723 | self.wind_speed_label.setFont(font) 724 | self.wind_speed_label.setStyleSheet(u"color: rgb(173, 167, 220);") 725 | 726 | self.gridLayout_6.addWidget(self.wind_speed_label, 0, 2, 1, 1) 727 | 728 | self.label_10 = QLabel(self.frame_7) 729 | self.label_10.setObjectName(u"label_10") 730 | self.label_10.setMaximumSize(QSize(50, 50)) 731 | self.label_10.setStyleSheet(u"padding: 5px;\n" 732 | "border: 2px solid rgb(103, 103, 103);\n" 733 | "border-radius: 20px;\n" 734 | "color: rgb(252, 191, 130);") 735 | self.label_10.setPixmap(QPixmap(u":/weather/icons/weather/png/024-temperature.png")) 736 | self.label_10.setScaledContents(True) 737 | 738 | self.gridLayout_6.addWidget(self.label_10, 1, 0, 1, 1) 739 | 740 | self.current_weather_label_3 = QLabel(self.frame_7) 741 | self.current_weather_label_3.setObjectName(u"current_weather_label_3") 742 | self.current_weather_label_3.setFont(font2) 743 | 744 | self.gridLayout_6.addWidget(self.current_weather_label_3, 1, 1, 1, 1) 745 | 746 | self.temperature_label = QLabel(self.frame_7) 747 | self.temperature_label.setObjectName(u"temperature_label") 748 | self.temperature_label.setFont(font) 749 | self.temperature_label.setStyleSheet(u"color: rgb(173, 167, 220);") 750 | 751 | self.gridLayout_6.addWidget(self.temperature_label, 1, 2, 1, 1) 752 | 753 | self.label_11 = QLabel(self.frame_7) 754 | self.label_11.setObjectName(u"label_11") 755 | self.label_11.setMaximumSize(QSize(50, 50)) 756 | self.label_11.setStyleSheet(u"padding: 5px;\n" 757 | "border: 2px solid rgb(103, 103, 103);\n" 758 | "border-radius: 20px;\n" 759 | "color: rgb(252, 191, 130);") 760 | self.label_11.setPixmap(QPixmap(u":/weather/icons/weather/png/019-low tide.png")) 761 | self.label_11.setScaledContents(True) 762 | 763 | self.gridLayout_6.addWidget(self.label_11, 2, 0, 1, 1) 764 | 765 | self.current_weather_label_6 = QLabel(self.frame_7) 766 | self.current_weather_label_6.setObjectName(u"current_weather_label_6") 767 | self.current_weather_label_6.setFont(font2) 768 | 769 | self.gridLayout_6.addWidget(self.current_weather_label_6, 2, 1, 1, 1) 770 | 771 | self.pressure_label = QLabel(self.frame_7) 772 | self.pressure_label.setObjectName(u"pressure_label") 773 | self.pressure_label.setFont(font) 774 | self.pressure_label.setStyleSheet(u"color: rgb(159, 145, 188);") 775 | 776 | self.gridLayout_6.addWidget(self.pressure_label, 2, 2, 1, 1) 777 | 778 | 779 | self.horizontalLayout_2.addWidget(self.frame_7, 0, Qt.AlignRight) 780 | 781 | 782 | self.verticalLayout_2.addWidget(self.middle_frame, 0, Qt.AlignTop) 783 | 784 | 785 | self.gridLayout_4.addWidget(self.frame, 6, 0, 1, 1) 786 | 787 | self.message_frame = QFrame(self.main_container) 788 | self.message_frame.setObjectName(u"message_frame") 789 | self.message_frame.setMinimumSize(QSize(0, 0)) 790 | self.message_frame.setFrameShape(QFrame.StyledPanel) 791 | self.message_frame.setFrameShadow(QFrame.Raised) 792 | self.verticalLayout_5 = QVBoxLayout(self.message_frame) 793 | self.verticalLayout_5.setSpacing(5) 794 | self.verticalLayout_5.setObjectName(u"verticalLayout_5") 795 | self.verticalLayout_5.setContentsMargins(5, 5, 5, 5) 796 | self.message_label = QLabel(self.message_frame) 797 | self.message_label.setObjectName(u"message_label") 798 | font10 = QFont() 799 | font10.setPointSize(12) 800 | font10.setItalic(False) 801 | self.message_label.setFont(font10) 802 | self.message_label.setStyleSheet(u"color: rgb(255, 0, 0);") 803 | self.message_label.setScaledContents(True) 804 | self.message_label.setAlignment(Qt.AlignCenter) 805 | self.message_label.setWordWrap(True) 806 | self.message_label.setMargin(5) 807 | 808 | self.verticalLayout_5.addWidget(self.message_label) 809 | 810 | self.retryButton = QPushButton(self.message_frame) 811 | self.retryButton.setObjectName(u"retryButton") 812 | font11 = QFont() 813 | font11.setPointSize(12) 814 | font11.setBold(True) 815 | font11.setWeight(75) 816 | self.retryButton.setFont(font11) 817 | self.retryButton.setStyleSheet(u"padding: 5px;\n" 818 | "border: 1px solid rgb(255, 0, 0);\n" 819 | "background-color:rgb(252, 192, 125);\n" 820 | "border-radius: 10px;") 821 | 822 | self.verticalLayout_5.addWidget(self.retryButton, 0, Qt.AlignHCenter|Qt.AlignVCenter) 823 | 824 | 825 | self.gridLayout_4.addWidget(self.message_frame, 5, 0, 1, 1) 826 | 827 | 828 | self.verticalLayout_3.addWidget(self.main_container) 829 | 830 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) 831 | 832 | self.horizontalLayout.addWidget(self.scrollArea) 833 | 834 | MainWindow.setCentralWidget(self.centralwidget) 835 | 836 | self.retranslateUi(MainWindow) 837 | 838 | QMetaObject.connectSlotsByName(MainWindow) 839 | # setupUi 840 | 841 | def retranslateUi(self, MainWindow): 842 | MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) 843 | self.forecast_temp1.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 844 | self.forecast_icon1.setText("") 845 | self.forecast_time1.setText(QCoreApplication.translate("MainWindow", u"+3 Hours", None)) 846 | self.forecast_temp2.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 847 | self.forecast_icon2.setText("") 848 | self.forecast_time2.setText(QCoreApplication.translate("MainWindow", u"+6 Hours", None)) 849 | self.forecast_temp3.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 850 | self.forecast_icon3.setText("") 851 | self.forecast_time3.setText(QCoreApplication.translate("MainWindow", u"+9 Hours", None)) 852 | self.forecast_icon4.setText("") 853 | self.forecast_temp4.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 854 | self.forecast_time4.setText(QCoreApplication.translate("MainWindow", u"+12 Hours", None)) 855 | self.forecast_temp5.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 856 | self.forecast_icon5.setText("") 857 | self.forecast_time5.setText(QCoreApplication.translate("MainWindow", u"+15 Hours", None)) 858 | self.label_7.setText(QCoreApplication.translate("MainWindow", u"Forecast", None)) 859 | self.label_4.setText(QCoreApplication.translate("MainWindow", u"Showing Weather Information For:", None)) 860 | self.weather_location.setText(QCoreApplication.translate("MainWindow", u"Loading weather location", None)) 861 | self.label_18.setText(QCoreApplication.translate("MainWindow", u"Select weather location", None)) 862 | self.label_20.setText("") 863 | self.label_19.setText(QCoreApplication.translate("MainWindow", u"Spinn Design Weather App", None)) 864 | self.continents_list.setCurrentText("") 865 | self.label.setText(QCoreApplication.translate("MainWindow", u"Select Continent", None)) 866 | self.label_3.setText(QCoreApplication.translate("MainWindow", u"Select Country", None)) 867 | self.label_2.setText(QCoreApplication.translate("MainWindow", u"Select City", None)) 868 | self.label_5.setText(QCoreApplication.translate("MainWindow", u"Current Weather:", None)) 869 | self.current_weather_icon.setText("") 870 | self.current_weather_label.setText(QCoreApplication.translate("MainWindow", u"Please wait.. ", None)) 871 | self.label_12.setText("") 872 | self.label_8.setText("") 873 | self.latitude_label1.setText(QCoreApplication.translate("MainWindow", u"Latitude", None)) 874 | self.label_13.setText("") 875 | self.longitude_label.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 876 | self.sunrise_label1.setText(QCoreApplication.translate("MainWindow", u"Sunrise", None)) 877 | self.current_weather_label_8.setText(QCoreApplication.translate("MainWindow", u"Longitude", None)) 878 | self.latitude_label.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 879 | self.sunrise_label.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 880 | self.label_9.setText("") 881 | self.wind_speed_label1.setText(QCoreApplication.translate("MainWindow", u"Wind Speed ", None)) 882 | self.wind_speed_label.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 883 | self.label_10.setText("") 884 | self.current_weather_label_3.setText(QCoreApplication.translate("MainWindow", u"Temperature", None)) 885 | self.temperature_label.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 886 | self.label_11.setText("") 887 | self.current_weather_label_6.setText(QCoreApplication.translate("MainWindow", u"Pressure", None)) 888 | self.pressure_label.setText(QCoreApplication.translate("MainWindow", u"Please wait..", None)) 889 | self.message_label.setText(QCoreApplication.translate("MainWindow", u"Weather response messages", None)) 890 | self.retryButton.setText(QCoreApplication.translate("MainWindow", u"Re-try", None)) 891 | # retranslateUi 892 | 893 | --------------------------------------------------------------------------------