基于PyQt5的图形化界面开发——天气应用

news2024/11/18 0:35:19

目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于 3.0 和 2.0 的数据文件差异以及性能优化思路

如果需要对数据库性能优化,了解数据文件的存储方式和工作原理是必要的。 对于时序数据库(Time Series Database) TDengine 来说,在 2.x 版本中时序数据的保留策略是由keep和days这两个参数把控的。(详情可见&#xff…

云原生——Kubenetes基础

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 目录 一.什么是Kubernetes? 二.为什么你需要 Kubern…

markdown数学公式总结

行内与独行 行内公式:将公式插入到本行内,符号: 公式内容 公式内容 公式内容,如: x y z xyz xyz 独行公式:将公式插入到新的一行内,并且居中,符号: 公式内容 公式内容 公…

RISC-V IDE MRS使用笔记(十):嵌入式编程开发技巧汇总

RISC-V IDE MRS使用笔记(十):嵌入式编程开发技巧汇总 MRS常见嵌入式开发技巧: Q1:如何修改程序编译生成库? A1:在工具栏中点击活动工程的编译配置按钮,在Build Artifact的Tab页面指定目标类型,选中为Stat…

uniapp仿浙北惠生活微信小程序

最近给公司写了一个内部微信小程序,功能比较简单,之前是用微信小程序原声写的,一遍看文档一边写,js,wxml,wxcc,json分在不同文件的写法很不习惯,于是花了两天用uniapp重写了一遍&…

思维导图对我生活以及工作的帮助(用户投稿)

作为一名白领,我每天都面临着各种各样的工作和生活压力。 为了更好地应对这些挑战,我开始尝试使用思维导图来帮助自己更好地组织和管理各种信息和任务。其中一款非常优秀的软件就是ProcessOn思维导图,它为我的工作和生活带来了很多便利和帮助…

Spring Boot|启动图案修改ASCII字符画

效果图 实现 在项目目录的resources文件夹中新建一个banner.txt,将内容放入即可: // _ooOoo_ // // o8888888o // // …

华为ENSP配置无线AC-网关模式

1、配置交换机以及AC的接口为trunk 交换机 vlan b 10 20 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 10 20 # # interface GigabitEthernet0/0/2port link-type trunkport trunk pvid vlan 10port trunk allow-pass vlan 10 20 # …

Linux系统安装QQ最新版 2023-06-30

腾讯在2023-05-30更新了linux版的qq,这次界面终于不再复古,好看多了。 安装步骤: 1.进入官网,寻找合适的安装包下载 https://im.qq.com/linuxqq/index.shtml 选择跟自己计算机匹配的版本,一般都是X86,如…

JAVA-编程基础-05-方法的定义、调用、重载

Lison <dreamlison163.com>, v1.0.0, 2023.03.22 JAVA-编程基础-05-方法的定义、调用、重载 文章目录 JAVA-编程基础-05-方法的定义、调用、重载方法的概念什么是方法 方法的定义和调用无参数方法定义和调用方法调用过程图解 带参数方法的定义和调用带返回值方法的定义和…

Ureport 多数据集合关联显示

ureport 使用较少&#xff0c;目前单位这边有项目正好使用到了&#xff0c;也遇到不少坑&#xff0c;和其他报表稍微有些不同&#xff0c;在这里记录一下&#xff0c;为大家排一下坑 目前需求是要求数据以这样显示 1、创建数据源 1.1 B2、C1、D2 、C4、C2 各使用了不同的数据…

chatGPT流式回复是怎么实现的

chatGPT流式回复是怎么实现的 先说结论&#xff1a; chatGPT的流式回复用的就是HTTP请求方案中的server-send-event流式接口&#xff0c;也就是服务端向客户端推流数据。 那eventStream流式接口怎么实现呢&#xff0c;下面就进入正题&#xff01; 文章目录 chatGPT流式回复…

UE5ControlRig脚部IK匹配地面(FootIK)的简易实现

UE的Foot IK可以有多套方案&#xff0c;老的有动画蓝图中用TwoBoneIK&#xff0c;新的做法有ControlRig的BasicIK、FullBodyIK。博主针对FootIK做一个简单的验证&#xff0c;因此使用ControlRigTwoBoneIK的做法&#xff0c;并做一下记录&#xff0c;之前做过UE FootIK的大佬可以…

小白到运维工程师自学之路 第四十四集 (mariadb高可用集群故障转移)

一、概述 故障转移是指在集群中某个节点发生故障时&#xff0c;自动将服务转移到其他正常节点上的 过程。在MariaDB高可用集群中&#xff0c;通常使用主从复制的方式来实现故障转移。其中一个 节点被指定为主节点&#xff0c;负责处理所有的写操作和部分读操作&#xff0c;其…

通过无模型多代理强化学习掌握Stratego游戏

Stratego是一款流行的双人不完美信息棋盘游戏。由于其复杂性源于其巨大的游戏树、在不完善的信息下进行决策以及一开始的分段部署阶段&#xff0c;Stratego对人工智能&#xff08;AI&#xff09;构成了挑战。以前的计算机程序充其量只在业余水平上运行。 Perolat等人引入了一种…

Crontab的sendmail邮件发送引发磁盘问题

一.背景 大清早的收到一台服务器的内存占用高达98%的钉钉告警。 回想了一下&#xff0c;这台服务器没跑什么业务啊&#xff0c;咋从凌晨1点就开始告警呢? 赶紧登录服务器&#xff0c;top 按照内存倒序一下&#xff0c;没发现占用特别大的进程。内存监控图如下: 但是发现了很…

Windows环境本地部署Oracle11g r2实操手册

前言&#xff1a;一直在做其他测试&#xff0c;貌似都忘了Windows环境oracle安装&#xff0c;这是一个很早很早的安装记录了&#xff0c;放上来做个备录给到大家参考。 环境&#xff1a; &#xff08;都是常规系统及工具&#xff0c;官网度娘搜索即可下载测试学习&#xff09;…

通过无代码CDC工具实现Oracle实时同步到Mysql

Oracle数据实时同步需求 现代企业对于数据实时同步的需求日益迫切&#xff0c;特别是在涉及Oracle数据库的情况下。实时同步数据对企业来说至关重要&#xff0c;因为它可以确保不同系统之间的数据始终保持一致性和最新性&#xff0c;提供准确的决策支持和及时的业务反应。 针…

Leetcode-每日一题【725.分隔链表】

题目 给你一个头结点为 head 的单链表和一个整数 k &#xff0c;请你设计一个算法将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。这 k 个部分应该按照在链表中出现的顺序排列&#…

在 JavaScript 中获取选中或突出显示的文本

本文将展示我们如何使用 DOM API 来让用户在屏幕上突出显示或选择文本。 DOM API 为我们提供了 getSelection() 方法&#xff0c;该方法允许我们获取用户选择的文本。 窗口对象可以直接访问这个方法。 让我们看看如何实际实现此功能。 使用 JavaScript 中的 window.getSelecti…