【天气查询系统】大学作业分享

查看 86|回复 9
作者:renhuangdou   
大学的期末作业,结合了网上很多大佬的代码,直接修改整合了一下。
我们老师要求代码要200行,所以写了很多。也顺便分享给各位需要交作业的同学。
新人第一次发帖,多多包涵。
天气数据接口使用了“心知天气”
会查询最近的天气数据并且发送到邮箱和推送的微信,微信推送用的是pushplus


微信截图_20240121100548.png (146.13 KB, 下载次数: 0)
下载附件
2024-1-21 10:09 上传



微信截图_20240121100627.png (80.33 KB, 下载次数: 0)
下载附件
2024-1-21 10:09 上传

程序代码
[Python] 纯文本查看 复制代码import json
import requests
import datetime
import cn2an
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from tkinter import messagebox# 引入弹窗库,防止解释器弹出报错。
from tkinter import *
# GUI
root = Tk()
# 文本
location_text = Text(root, width=25, height=2, font=("楷体", 15)) # 查询城市
location_text.insert("1.0", "请输入市级地址\n(默认为当前IP地址)")
location_text.grid(row=0, column=1)
email1 = Text(root, width=25, height=2, font=("楷体", 15))# 接收邮箱
email1.insert("1.0", "请输入接收邮箱\n(多个邮箱请用,分割)")
email1.grid(row=1, column=1)
pushplus_text = Text(root, width=25, height=2, font=("楷体", 15))# pushplus
pushplus_text.insert("1.0", "请输入pushplus的token")
pushplus_text.grid(row=2, column=1)
url_head = "https://api.seniverse.com/v3/weather/daily.json?"
key = "天气秘钥"
# ---------------------------------#
def get_weather(locat_name):
    global emailname , token1 # 声明是全局变量
    # 默认为的值
    if locat_name == "\n" or locat_name == "请输入市级地址\n(默认为当前IP地址)\n":
        locat_name = "ip"
    locat_name = locat_name.replace("\n", "")  # 去掉自带的换行
    if emailname == "\n" or emailname == "请输入接收邮箱\n(多个邮箱请用,分割)\n":
        emailname = "\n"
    emailname = emailname.replace("\n", "")  # 去掉自带的换行
    if token1 == "\n" or token1 == "请输入pushplus的token\n":
        token1 = '\n'
    token1 = token1.replace("\n", "")  # 去掉自带的换行
    # 整合url
    url = url_head + "key=" + key + "&" + "location=" + locat_name + "&" + "language=zh-Hans&unit=c&start=0&days=5"
    # 获取天气数据
    resq = requests.get(url)
    if resq.status_code == 200:
        val_data = resq.text
        weather_data = json.loads(val_data)
        locat = weather_data['results'][0]['location']['name']
        timezone = weather_data['results'][0]['location']['timezone']
        timezone_offset = weather_data['results'][0]['location']['timezone_offset']
        print("==========================")
        print("")
        print("地区:", locat)
        print("时区:", timezone)
        print("时区偏移:", timezone_offset)
        print("")
        weath_cn = 0  # 天气序号
        daily = weather_data['results'][0]['daily']
        while weath_cn '
            message['To'] = toaddr
            message['Subject'] = Header(subject, 'utf-8')
            receiver = message['To'].split(';')
            server.sendmail(fromaddr, receiver, message.as_string())
            server.quit()
        send_email(locat+f"{date} 周{weekday}"  +"   的天气情况", message)
        print("\n\n邮件发送成功")
        # 微信公众号推送天气
        def send_wechat(message):
            token = token1
            title =locat+'   的天气'
            content = message
            template = 'html'
            url = f"https://www.pushplus.plus/send?token={token}&title={title}&content={content}&template={template}"
            r = requests.get(url=url)
        if __name__ == '__main__':
            msg = 'Life is short I use python'
            send_wechat(message)
        print("微信公众号推送成功")
        messagebox.showinfo(title='天气获取成功',
                            message=f"{date} 周{weekday}" + "   " + locat + " 天气获取成功\n未来三天天气已保存为TXT文件"
                                                                            "\r邮件已发送给" + emailname + "\r微信已推送送给" + token1)  # 消息提醒弹窗,点击确定返回值为 ok
    else:
        print(resq.status_code)
def start_request():
    text = location_text.get("1.0", "end")
    print(text)
    global emailname , token1 # 声明是全局变量
    emailname = email1.get("1.0", "end")
    token1 = pushplus_text.get("1.0", "end")
    # 获取天气
    get_weather(text)
def info_request():
    messagebox.showinfo(title="提示",
                        message="未来3天天气状况会保存为TXT文件~\r不输入为默认值\r\n仅限市级城市呀😊  \r作者:忍黄豆  ")
def init_gui():
    root.geometry("380x150+750+400")
    root.title("—天气获取工具😀—  ")
    start_button = Button(root, text="获 取", anchor='w', font=("楷体", 15), command=start_request)
    start_button.grid(row=0, column=0)
    info_button = Button(root, text="关 于", anchor='w', font=("楷体", 15), command=info_request)
    info_button.grid(row=1, column=0)
def main():
    init_gui()
    root.mainloop()
main()
下面这个是有注释的,用AI生成的注释。
[Python] 纯文本查看 复制代码import datetime  # 导入时间处理模块
import json  # 导入JSON处理模块
import smtplib  # 导入SMTP邮件发送模块
from email.header import Header  # 导入邮件头部处理模块
from email.mime.text import MIMEText  # 导入邮件内容处理模块
from tkinter import *  # 导入tkinter模块,用于创建GUI界面
from tkinter import messagebox  # 导入弹窗库,防止解释器弹出报错。
import cn2an  # 导入中文到拼音转换模块
import requests  # 导入HTTP请求模块
    '''
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    本代码仅作为程序运行注,非运行代码!!!
    '''
# GUI
# 创建一个Tkinter根窗口对象
root = Tk()
# 文本
location_text = Text(root, width=25, height=2, font=("楷体", 15)) # 查询城市
location_text.insert("1.0", "请输入市级地址\n(默认为当前IP地址)")
location_text.grid(row=0, column=1)
email1 = Text(root, width=25, height=2, font=("楷体", 15)) # 接收邮箱
email1.insert("1.0", "请输入接收邮箱\n(多个邮箱请用,分割)")
email1.grid(row=1, column=1)
pushplus_text = Text(root, width=25, height=2, font=("楷体", 15)) # pushplus
pushplus_text.insert("1.0", "请输入pushplus的token")
pushplus_text.grid(row=2, column=1)
url_head = "https://api.seniverse.com/v3/weather/daily.json?" # URL头部
key = "天气密钥" # 天气密钥
# ---------------------------------#
def get_weather(locat_name):
    global emailname , token1 # 声明是全局变量
'''
当函数get_weather被调用时,它会执行以下操作:  
1. 声明locat_name和emailname为全局变量。
2. 检查locat_name是否为换行符或默认值字符串,如果是,则将locat_name赋值为字符串"ip"。
3. 移除locat_name中自带的换行符。
4. 检查emailname是否为换行符或默认值字符串,如果是,则将emailname赋值为换行符。
5. 移除emailname中自带的换行符。
6. 检查token1是否为换行符或默认值字符串,如果是,则将token1赋值为换行符。
7. 移除token1中自带的换行符。
8. 根据给定的参数和固定的URL头部构造一个完整的URL字符串。
9. 使用requests模块的get方法发送一个GET请求到上述构造的URL,并将返回的结果赋值给变量resq。
'''
    # 默认为的值
    if locat_name == "\n" or locat_name == "请输入市级地址\n(默认为当前IP地址)\n":
        locat_name = "ip"
    locat_name = locat_name.replace("\n", "")  # 去掉自带的换行
    if emailname == "\n" or emailname == "请输入接收邮箱\n(多个邮箱请用,分割)\n":
        emailname = "\n"
    emailname = emailname.replace("\n", "")  # 去掉自带的换行
    if token1 == "\n" or token1 == "请输入pushplus的token\n":
        token1 = '\n'
    token1 = token1.replace("\n", "")  # 去掉自带的换行
    # 整合url
    url = url_head + "key=" + key + "&" + "location=" + locat_name + "&" + "language=zh-Hans&unit=c&start=0&days=5"
    # 获取天气数据
    resq = requests.get(url)
    if resq.status_code == 200:  # 如果请求返回的状态码为200
        val_data = resq.text  # 将请求返回的文本赋值给val_data变量
        weather_data = json.loads(val_data)  # 将val_data解析为json格式并赋值给weather_data变量
        locat = weather_data['results'][0]['location']['name']  # 获取天气数据中的地点名称
        timezone = weather_data['results'][0]['location']['timezone']  # 获取天气数据中的时区
        timezone_offset = weather_data['results'][0]['location']['timezone_offset']  # 获取天气数据中的时区偏移
        print("==========================")
        print("")
        print("地区:", locat)  # 打印地区名称
        print("时区:", timezone)  # 打印时区
        print("时区偏移:", timezone_offset)  # 打印时区偏移
        print("")
               weath_cn = 0  # 天气序号
        daily = weather_data['results'][0]['daily']
    '''
    这段Python代码用于从天气API获取天气信息并保存到文本文件中。
    代码首先定义了一个变量weath_cn表示天气序号,然后获取到天气数据的daily信息。
    接下来使用while循环来遍历daily列表中的每一个天气信息,并进行处理。  
    在每一次循环中,首先获取当前天气信息的daily_d,
    然后通过open()函数以写入模式打开一个文本文件,
    并将日期作为文件名的一部分。然后使用print()函数打印一些天气信息,
    包括日期、天气情况、最高温度、最低温度、湿度、风向、风速、风向角度、风力等级和降水量。
    接着将这些天气信息写入到文件中,
    使用write()函数将日期、天气情况、最高温度、最低温度、湿度、风向、风速、风向角度、风力等级和降水量写入文件。  
    循环结束后,使用print()函数打印最后更新时间和一个分隔线。
    '''
        while weath_cn '
            message['To'] = toaddr
            # 设置邮件的主题
            message['Subject'] = Header(subject, 'utf-8')
            # 获取收件人地址列表
            receiver = message['To'].split(';')
            # 使用发件人和收件人列表,以及邮件内容发送邮件
            server.sendmail(fromaddr, receiver, message.as_string())
            # 关闭与邮箱服务器的连接
            server.quit()
        # 调用send_email函数发送邮件
        # 邮件主题为locat+f"{date} 周{weekday}" +"   的天气情况"
        # 邮件内容为message
        send_email(locat+f"{date} 周{weekday}"  +"   的天气情况", message)
        # 打印\n\n邮件发送成功\n\n
        print("\n\n邮件发送成功")
        # 微信公众号推送天气
        def send_wechat(message):
            # 设置token变量为token1
            token = token1
            # 设置title变量为locat+'   的天气'
            title = locat + '   的天气'
            # 设置content变量为message
            content = message
            # 设置template变量为'html'
            template = 'html'
            # 拼接url字符串
            url = f"https://www.pushplus.plus/send?token={token}&title={title}&content={content}&template={template}"
            # 发送get请求,将返回结果赋值给r变量
            r = requests.get(url=url)
            # 打印微信公众号推送成功的信息
            print("微信公众号推送成功")
    else:
        print(resq.status_code)
def start_request():
    """
    开始请求函数,获取文本信息并打印,同时获取全局变量emailname和token1的值,
    并调用get_weather函数获取天气信息。
    """
    text = location_text.get("1.0", "end")  # 获取文本信息
    print(text)  # 打印文本信息
    global emailname, token1  # 声明为全局变量
    emailname = email1.get("1.0", "end")  # 获取全局变量emailname的值
    token1 = pushplus_text.get("1.0", "end")  # 获取全局变量token1的值
    get_weather(text)  # 调用get_weather函数获取天气信息
def info_request():
    """
    提示用户未来3天天气状况会保存为TXT文件,并显示作者信息
    """
    messagebox.showinfo(title="提示",
                        message="未来3天天气状况会保存为TXT文件~\r不输入为默认值\r\n仅限市级城市呀😊  \r作者:忍黄豆  ")
def init_gui():
    # 设置窗口大小和位置
    root.geometry("380x150+750+400")
    # 设置窗口标题
    root.title("—天气获取工具😀—  ")
    # 创建一个开始按钮
    start_button = Button(root, text="获 取", anchor='w', font=("楷体", 15), command=start_request)
    # 将开始按钮放置在窗口的第0行第0列
    start_button.grid(row=0, column=0)
    # 创建一个关于按钮
    info_button = Button(root, text="关 于", anchor='w', font=("楷体", 15), command=info_request)
    # 将关于按钮放置在窗口的第1行第0列
    info_button.grid(row=1, column=0)
def main():     #主函数,启动应用程序
    # 初始化GUI界面
    init_gui()
    # 运行GUI程序
    root.mainloop()
main()

天气, 代码

yu520   

这个要是能显示图片就更高级了
咑菿尐鈤夲   

谢谢分享
nightshift   

好厉害。
Sky℃   

用的啥AI呀
風信子   

用的啥AI呀?
renhuangdou
OP
  


風信子 发表于 2024-1-21 15:35
用的啥AI呀?

通义灵码https://tongyi.aliyun.com/lingma
renhuangdou
OP
  


風信子 发表于 2024-1-21 15:35
用的啥AI呀?

通义灵码https://tongyi.aliyun.com/lingma
BigBoy1991   

赞一个赞一个
zhangfeng_223   

赞一个赞一个
您需要登录后才可以回帖 登录 | 立即注册

返回顶部