天气预报信息获取程序--GUI--可以使用

news2024/12/26 23:02:50

 上次正对项目中需要填写项目日志,制作了一个命令行版本的下载天气信息的程序,满足日常需要,调整一下界面版本的程序

如果大家使用命令行的可以使用下面的版本(连接)

https://ht666666.blog.csdn.net/article/details/131020276 

一、项目遇到的问题:

------

一、遇到的坑一

程序遇到的问题,就是信号的处理的问题时候遇到问题一直解决不了,崩溃,找不到原因

1.排查多线程"QThread",使用多线程的时候要注意的是实现类的方式,是里面有个run方法,

 

2.实例化类的时候要启用start()方法,如下

 --------------------------

 遇到的坑二、

信号的调测,虽然对pyqt5不是很熟悉,所以调测了半天

信号的视线步骤:

1.注册信号在类里面第一个位置注册【类属性】,不能放在实例属性里面

《注册信号的位置与  信号触发emit在一个类里面--》产生信息的类里面》

(标记为第一类)

 

2.在另外一个类(标记为第二个类),获取信号以及创建槽函数(处理信息的函数)

 

3.回到第一个类,什么时机产生触发条件,

 通过上面信号“”三部曲“”完成信号设定以及使用过程。

-------------------------------

其他代码在我的上一个命令行程序中保持基本一致。

上代码:

UI--代码【用PQT5 QT Designer设计的】


 

 二、代码部分:

下面是代码:

 界面代码:

 gettq.py

 

-----

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'gettq.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(365, 297)
        Form.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(10, 30, 231, 221))
        self.groupBox.setObjectName("groupBox")
        self.pushButton_get = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_get.setGeometry(QtCore.QRect(30, 160, 181, 41))
        self.pushButton_get.setObjectName("pushButton_get")
        self.lineEdit_code = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_code.setGeometry(QtCore.QRect(100, 28, 113, 20))
        self.lineEdit_code.setObjectName("lineEdit_code")
        self.lineEdit_end = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_end.setGeometry(QtCore.QRect(100, 88, 113, 20))
        self.lineEdit_end.setObjectName("lineEdit_end")
        self.lineEdit_start = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_start.setGeometry(QtCore.QRect(100, 58, 113, 20))
        self.lineEdit_start.setObjectName("lineEdit_start")
        self.lineEdit_endmm = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit_endmm.setGeometry(QtCore.QRect(100, 118, 113, 20))
        self.lineEdit_endmm.setObjectName("lineEdit_endmm")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(33, 30, 51, 20))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setGeometry(QtCore.QRect(30, 58, 54, 12))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setGeometry(QtCore.QRect(30, 88, 54, 12))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.groupBox)
        self.label_4.setGeometry(QtCore.QRect(30, 118, 54, 12))
        self.label_4.setObjectName("label_4")
        self.groupBox_2 = QtWidgets.QGroupBox(Form)
        self.groupBox_2.setGeometry(QtCore.QRect(240, 30, 120, 221))
        self.groupBox_2.setObjectName("groupBox_2")
        self.label_6 = QtWidgets.QLabel(self.groupBox_2)
        self.label_6.setGeometry(QtCore.QRect(20, 30, 81, 16))
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.groupBox_2)
        self.label_7.setGeometry(QtCore.QRect(20, 60, 81, 16))
        self.label_7.setObjectName("label_7")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(280, 260, 71, 20))
        self.label_5.setObjectName("label_5")
        self.label_show = QtWidgets.QLabel(Form)
        self.label_show.setGeometry(QtCore.QRect(10, 270, 221, 20))
        self.label_show.setText("")
        self.label_show.setObjectName("label_show")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "获取天气信息[HT]"))
        self.groupBox.setTitle(_translate("Form", "GETDATA"))
        self.pushButton_get.setText(_translate("Form", "下载数据"))
        self.label.setText(_translate("Form", "城市代码:"))
        self.label_2.setText(_translate("Form", "开始年份:"))
        self.label_3.setText(_translate("Form", "结束年份:"))
        self.label_4.setText(_translate("Form", "结束月份:"))
        self.groupBox_2.setTitle(_translate("Form", "常用城市代码"))
        self.label_6.setText(_translate("Form", "西安:57036"))
        self.label_7.setText(_translate("Form", "咸阳:57048"))
        self.label_5.setText(_translate("Form", "作者:海涛"))

核心代码:

import json
import sys,re,datetime,csv
import requests
from PyQt5.QtCore import pyqtSignal, QThread
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QApplication,QWidget
from gettq import Ui_Form


# 在1的基础上,进行界面显示打印的信息


class Myclass(QWidget,Ui_Form):

    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.setGeometry(300, 300, 300, 365)
        # 设置窗口固定大小
        self.setFixedSize(self.height(), self.width())

        # 点击按钮后调用函数
        self.pushButton_get.clicked.connect(self.eventbtn)

        # 优化措施,给读取框中赋值,避免后续不输入数字,默认赋初始值

        self.lineEdit_code.setText('57048')
        self.lineEdit_start.setText('2023')
        self.lineEdit_end.setText('2023')
        self.lineEdit_endmm.setText('5')

        self.label_show.setText("准备就绪")


    # 函数,处理函数
    def eventbtn(self):
        # 获取lineEdit 输入框输入的内容获取
        lineEdit_code=int(self.lineEdit_code.text())
        lineEdit_start=int(self.lineEdit_start.text())
        lineEdit_end=int(self.lineEdit_end.text())
        lineEdit_endmm=int(self.lineEdit_endmm.text())



        # 实例化类,传入参数
        self.weather = WeatherForecast(lineEdit_code, lineEdit_start, lineEdit_end, lineEdit_endmm)




        # 实例话WeatherForecast类,为了使用里面的‘signal_info’信号
        self.weather.signal.connect(self.labelshowfunc)

        # 这里面是继承自QThread,启用类的说过start()
        self.weather.start()

        # print(lineEdit_code,lineEdit_start,lineEdit_end,lineEdit_endmm)

    def labelshowfunc(self,eminfo):
        print("主界面接受到的信息",eminfo)
        # 在GUI界面上label_show显示日志信息
        self.label_show.setText(eminfo)
        # 后台下载信息显示在这个标签里
        # self.label_show.setText()



# class WeatherForecast(object):
class WeatherForecast(QThread):
    # 定义一个信号,把信息发送到另外一个类的 lable中显示内容,用来通知显示信息
    signal=pyqtSignal(str)

    def __init__(self,city_code,start_year,end_year,end_month):
        super().__init__()
        self.city_code=city_code
        self.start_year=start_year
        self.end_year=end_year
        self.end_month=end_month

        # self.url = 'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=59493&areaInfo%5BareaType%5D=2&date%5Byear%5D={0}&date%5Bmonth%5D={1}'
        # #西安地址链接  57036--->BareaId%5D=59493
        # self.url = 'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=57036&areaInfo%5BareaType%5D=2&date%5Byear%5D={0}&date%5Bmonth%5D={1}'

        # 咸阳地址链接57048--->%5BareaId%5D=59493
        # self.url = 'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=57048&areaInfo%5BareaType%5D=2&date%5Byear%5D={0}&date%5Bmonth%5D={1}'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.24',
            'accept-encoding': 'gzip, deflate, br'
        }
        self.data_list = []

    def get_content(self, url):
        res = requests.get(url=url, headers=self.headers)
        content = res.json()
        # print(content['data'])
        return content['data']

    def parse_data(self, content):
        result = re.compile(r'<td>(?P<date>.*?)</td>.*?<td style="color:#ff5040;">(?P<max>.*?)</td>'
                            r'.*?<td style="color:#3097fd;" >(?P<min>.*?)</td>.*?<td>(?P<weather>.*?)</td>'
                            r'.*?<td>(?P<cloud>.*?)</td>.*?<td><span class="history-aqi wea-aqi.*?>(?P<sky>.*?)</span></td>',
                            re.S)
        find_result = result.finditer(content)
        for it in find_result:
            data_dict = it.groupdict()
            # print(data_dict)
            self.data_list.append(data_dict)
        return self.data_list

    def write_csv(self, data_list):
        curent_date=datetime.datetime.now().strftime("%Y%m%d")
        save_name=str(self.city_code)+curent_date+'.csv'
        with open(save_name, 'w',newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['日期', '最高温度', '最低温度', '天气', '风力风向', '空气质量'])
            for i in data_list:
                writer.writerow(i.values())
                # print(i.values())





    #     爬取数据的事项,只能获取整年,如果到月份的话                if year==2024 & month>6:
    #                     continue  通过他跳过指定的月份,获取数据
    def run(self):
        for year in range(self.start_year, self.end_year+1, 1):
            for month in range(1, 13, 1):
                if year>self.end_year:
                    continue
                elif  year==self.end_year:
                    if month>self.end_month:
                        continue


                url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={self.city_code}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'

                print('正在获取第{0}年{1}月的天气!'.format(year, month))
                content = self.get_content(url)
                # print(content,"json---->")
                data = self.parse_data(content)
                # self.signal.emit("正在写入数据中,请稍等...")
                self.signal.emit("数据下载中...")
                self.write_csv(data)

            self.signal.emit('全部下载完毕')
            print('全部获取完毕,请在程序目录获取下载xxxx.csv!')






if __name__ == '__main__':
    app=QApplication(sys.argv)

    win=Myclass()

    win.setWindowIcon(QIcon("lob.ico"))
    win.show()


    sys.exit(app.exec_())

 

界面展示:

 

 程序目录结构:

 

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

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

相关文章

逻辑漏洞学习-知识点总结

逻辑漏洞就是程序在实现业务逻辑上存在的错误&#xff0c;辑漏洞的出现通常是因为程序在设计业务逻辑时考虑不够全面&#xff0c;或者程序员的思维过程存在瑕疵&#xff0c;没有充分考虑到各种可能的情况 大部分程序员在设计的时候&#xff0c;目标是实现功能需求&#xff0c;…

Linux基础知识点 有这篇就足够了!!

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 目录 一、 从认识操作系统开始 1.1 操作系统简介 1.2 操作系统…

chatgpt赋能Python-python分表

介绍 Python是一种流行的编程语言&#xff0c;适用于各种应用程序开发&#xff0c;包括网络应用程序、数据库应用程序以及数据分析和科学计算。Python分表是基于Python编写的分表工具&#xff0c;可以帮助开发人员更轻松地管理大型数据库表格。 Python分表是如何工作的&#…

0219-810

3GPP TS 02.19 V8.1.0 (2005-06) 前言 本技术规范由第三代合作伙伴计划 (3GPP) 制定。 本文件的内容取决于 TSG 的持续工作&#xff0c;并可能在 TSG 正式批准后发生变化。 如果 TSG 修改本文档的内容&#xff0c;TSG 将重新发布 确定发布日期的变化和版本号的增加如下&…

低代码开发平台选择指南:如何选出最适合企业的低代码平台?

低代码平台的兴起改变了公司处理软件开发的方式。这些平台使组织能够快速高效地构建应用程序&#xff0c;该应用程序可以利用预设组件和开箱功能。但是&#xff0c;因为有这么多低代码平台可以使用&#xff0c;所以为你的组织选择合适的平台可能是一个挑战。本文将探索如何低代…

FreeRTOS任务切换

PendSV异常 SVC 用于产生系统函数的调用请求。例如&#xff0c;操作系统不让用户程序直接访问硬件&#xff0c;而是通过提供一些系统服务函数&#xff0c;用户程序使用 SVC 发出对系统服务函数的呼叫请求&#xff0c;以这种方法调用它们来间接访问硬件。因此&#xff0c;当用户…

(字符串 ) 459. 重复的子字符串——【Leetcode每日一题】

❓459. 重复的子字符串 难度&#xff1a;简单 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “…

IDEA+Mysql调试常见异常解决办法_kaic

IDEA导入项目出现Error: java: 程序包javax.servlet.http不存在错误的解决办法 解决方法&#xff1a;打开File>Project Structure>Libraries&#xff0c;点击右侧加号&#xff0c;寻找到tomcat的lib文件夹&#xff0c;点击ok&#xff0c;IDEA会自动重新Rebuild Project&…

数据结构 | 图的深度优先遍历和广度优先遍历(C语言)

一、数据结构定义 1、图 #define MaxVertexNum 100 // 最大可存储的节点数目/*图*/ typedef char VexterType; typedef int EdgeType;typedef struct GraphMatrix {VexterType Vexs[MaxVertexNum]; //结点 EdgeType Edges[MaxVertexNum][MaxVertexNum]; //边int vexnum, a…

使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 转载自远程穿透文章&…

【AI】Stable-Diffusion-WebUI使用指南

注&#xff1a;csdn对图片有审核&#xff0c;审核还很奇葩&#xff0c;线稿都能违规&#xff0c;为保证完整的阅读体验建议移步至个人博客阅读 最近AI绘画实现了真人照片级绘画水准&#xff0c;导致AI绘画大火&#xff0c;公司也让我研究研究&#xff0c;借此机会正好了解一下…

图像处理:GrapeCity Documents Imaging 6.1.2 Crack

适用于 .NET 6 的快速、强大的映像 API 库,在代码中应用高级图像处理&#xff0c;零依赖关系。 加载和保存图像文件&#xff0c;如BMP&#xff0c;JPEG&#xff0c;TIFF&#xff0c;GIF&#xff0c;ICO&#xff0c;SVG&#xff0c;WebP和PNG 对灰度和 RGB 图像应用抖动和阈值等…

Ribbon 负载均衡策略 —— 图解、源码级解析

文章目录 负载均衡策略RandomRuleRoundRobinRuleRetryRuleWeightedResponseTimeRuleBestAvailableRuleAvailabilityFilteringRuleZoneAvoidanceRule Ribbon 负载均衡策略源码RandomRule源码RoundRobinRule源码BestAvailableRule源码RetryRule源码 通过本文你可以学习到&#xf…

自学大语言模型之BERT

BERT 模型由 Jacob Devlin、Ming-Wei Chang、Kenton Lee 和 Kristina Toutanova在BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding中提出。它是一种双向变换器&#xff0c;使用掩码语言建模目标和对包含多伦多图书语料库和维基百科的大型语…

开源高星精选,10个2023企业级Python测试项目,再不学习时间就没了

纸上得来终觉浅&#xff0c;光学习理论知识是不够的。 想要学好软件测试必须要结合实战项目深入掌握&#xff0c;今天给大家分享十个2022最新企业级Python软件测试项目&#xff1a; ​ 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ▌Rank 1&#xf…

SEW-Movifit软件的调试步骤

首先安装软件&#xff08;名称和版本为SEW_Software_MotionStudio_V5-9-0-4-compact&#xff09;。安装完毕后打开软件&#xff0c;新建一个工程。 3、新建完成之后会进入如下画面。 4、点击红框内的图标进行设置 5、打开后会显示如下画面&#xff0c;在下拉菜单中选择serial这…

【Unity3D】高斯模糊特效

1 高斯模糊原理 边缘检测特效中使用了卷积运算进行了边缘检测&#xff0c;本文实现的高斯模糊特效同样使用了卷积运算&#xff0c;关于卷积核和卷积运算的概念&#xff0c;读者可以参考边缘检测特效。 本文完整资源见→Unity3D高斯模糊特效。 我们将用于模糊处理的卷积核称为模…

C++模拟牛顿力学(2D)

简介 如何用计算机来模拟真实世界呢&#xff1f;计算机最大的功能是计算&#xff0c;而物理学的种种公式就把现实世界中的物理规律以数学的语言描绘了出来&#xff0c;从而使我们可以通过计算大致模拟现实世界的物体运动。因此不难想到把物理学定律&#xff08;这里用的是牛顿…

SAP-MM-维护物料主数据的类(Class)和特性(Characteristic)

一&#xff0e;说明 物料主数据有千个左右条目&#xff0c;但仍不能满足各类物料自有特性的描述&#xff0c;为此SAP启用了类&#xff08;Class&#xff09;和特性&#xff08;Characteristic&#xff09;&#xff0c;并在物料主数据的分类视图&#xff08;Characteristic&…

推荐一款免费开源的代码质量分析工具

文章目录 一、简介二、环境安装三、使用说明四、其他报错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 29: ordinal not in range(128)**linux:****windos:** 五、安全编程规范 一、简介 Flawfinder是一款开源的关于C/C静态扫描分析工具&#xf…