目录
- 0. 前言
- 1. 注册心知天气
- 2. 代码实现
- 3. 其他PyQt5文章
0. 前言
本节使用PyQt5开发天气应用程序实现以下功能:
通过调用天气API获取实时天气数据,并在应用程序中显示当前城市的温度、天气状况、风速等信息。
操作系统:Windows10 专业版
开发环境:Pycahrm Comunity 2022.3
Python解释器版本:Python3.8
第三方库:PyQt5,requests
1. 注册心知天气
你需要注册心知天气,获取API-key用来调用心知天气接口来获取天气信息
心知天气官网
注册好后,将私钥填写到你的代码中即可完成调用
你可以运行这段代码测试是否填写正确:
import requests
api_key = '你的api-key'
api_url = f'https://api.seniverse.com/v3/weather/now.json?key={api_key}&location=北京&language=zh-Hans&unit=c'
response = requests.get(api_url)
data = response.json()
city_name = data['results'][0]['location']['name']
weather = data['results'][0]['now']['text']
temp_c = data['results'][0]['now']['temperature']
print(f'城市:{city_name}')
print(f'天气:{weather}')
print(f'温度:{temp_c}°C')
以下是北京和九江的测试:
2. 代码实现
注意修改API-key:
import sys
import requests
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
class WeatherApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('天气应用')
self.setGeometry(100, 100, 300, 100)
self.city_label = QLabel('城市:', self)
self.weather_label = QLabel('天气:', self)
self.temp_label = QLabel('温度:', self)
layout = QVBoxLayout(self)
layout.addWidget(self.city_label)
layout.addWidget(self.weather_label)
layout.addWidget(self.temp_label)
self.get_weather('北京') # 默认显示北京的天气信息
def get_weather(self, city):
api_key = '你的api-key'
api_url = f'https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={city}&language=zh-Hans&unit=c'
response = requests.get(api_url)
data = response.json()
city_name = data['results'][0]['location']['name']
weather = data['results'][0]['now']['text']
temp_c = data['results'][0]['now']['temperature']
self.city_label.setText(f'城市:{city_name}')
self.weather_label.setText(f'天气:{weather}')
self.temp_label.setText(f'温度:{temp_c}°C')
if __name__ == '__main__':
app = QApplication(sys.argv)
weather_app = WeatherApp()
weather_app.show()
sys.exit(app.exec_())
运行后效果如下:
这份代码只是在应用程序启动时获取一次天气信息并显示在界面上,并没有实现实时更新的功能。
接下来我们来使用PyQt5的定时器实现实时更新功能:
import sys
import requests
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class WeatherApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('天气应用')
width = 100
high = 100
self.setGeometry(1920 - 2 * width, 1080 - 2 * high, width, high)
self.city_label = QLabel('城市:', self)
self.weather_label = QLabel('天气:', self)
self.temp_label = QLabel('温度:', self)
layout = QVBoxLayout(self)
layout.addWidget(self.city_label)
layout.addWidget(self.weather_label)
layout.addWidget(self.temp_label)
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_weather)
self.timer.start(600000) # 每隔10分钟更新一次,单位为毫秒
self.update_weather('九江') # 显示九江的天气信息
# 隐藏任务栏图标
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.SplashScreen | Qt.FramelessWindowHint | Qt.FramelessWindowHint)
# # 设置窗口背景透明
# self.setWindowOpacity(0.5) # 设置窗口透明度
# self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明
def update_weather(self, city):
api_key = '你的api-key'
api_url = f'https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={city}&language=zh-Hans&unit=c'
response = requests.get(api_url)
data = response.json()
city_name = data['results'][0]['location']['name']
weather = data['results'][0]['now']['text']
temp_c = data['results'][0]['now']['temperature']
self.city_label.setText(f'城市:{city_name}')
self.weather_label.setText(f'天气:{weather}')
self.temp_label.setText(f'温度:{temp_c}°C')
if __name__ == '__main__':
app = QApplication(sys.argv)
weather_app = WeatherApp()
weather_app.show()
sys.exit(app.exec_())
代码使用了QTimer类创建了一个定时器,并通过连接timeout信号将update_weather函数与定时器关联起来。
在每个定时器的时间到达时,会触发timeout信号,从而调用update_weather函数来更新天气信息。
我取消了小图标和选项卡,为的是让它更简洁和方便:
它将永远处在屏幕右下方,并且每隔十分钟就会更新一次,你可以将这个实用(没用)的小工具设置开机自启动:
3. 其他PyQt5文章
基于PyQt5的图形化界面开发——自制MQTT客户端
基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]
基于PyQt5的图形化界面开发——模拟医院管理系统
基于PyQt5的图形化界面开发——自制ssh工具
基于PyQt5的图形化界面开发——PyQt示例_计算器
基于PyQt5的图形化界面开发——PyQt示例_扫雷
基于PyQt5的图形化界面开发——自制Redis图形化客户端(文末附源码)
基于PyQt5的图形化界面开发——堆栈动画演示
基于PyQt5的图形化界面开发——队列动画演示