基于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的图形化界面开发——队列动画演示

猜你喜欢

转载自blog.csdn.net/qq_53381910/article/details/131484578