安卓开发日记34

 

2024季学期《Python程序设计》大作业

 

系统说明报告

 

 

 

编制:

袁宇恒20223962

审查:

    

软件工程

    

2205-3


 

  

1项目目的与意义

1.1项目背景说明

1.2项目目的与意义

2 软件开发环境与技术说明

2.1软件开发环境

2.2软件开发技术描述

3系统分析与设计

3.1项目需求分析说明

3.2系统设计方案

4系统源代码

4.1系统源代码文件说明

4.2源代码

5系统使用说明书

6参考资料

7附件说明

 

 

1项目目的与意义

1.1项目背景说明

通过爬取天气网站的数据以实现特定地区特定时间的天气 预报,要求界面用户输入需要预报的地区位置信息和需要预报的时间信息。

要求图形界面实现。

 

 

1.2项目目的与意义

可以获取全国各地各级城市的天气预报

 

 

 

2 软件开发环境与技术说明

2.1软件开发环境

Python 3.12 

 

2.2软件开发技术描述

天气预报系统可以分为以下功能模块:

用户界面模块:

显示天气信息的表格;

提供输入框用于用户输入城市名称;

提供按钮触发获取天气信息的操作。

数据获取模块:

调用高德 API 请求城市天气数据。

数据处理模块:

API 返回的数据中提取并解析出需要的天气信息。

数据展示模块:

将获取的天气信息展示在用户界面的表格中。

 

 

3系统分析与设计

3.1项目需求分析说明

提供一个输入框,让用户输入要查询天气的城市名称。

提供一个按钮,用户点击后系统可以获取并显示该城市未来天的天气信息。

显示天气信息的界面要清晰易读

 

3.2系统设计方案

  1. 前端界面使用Tkinter库来构建,定制样式以美化界面,提高用户体验。
  2. 后端通过调用高德API来获取城市天气信息,可以选择合适的第三方天气API服务。
  3. 数据库可以选择使用轻量级的SQLite数据库,存储城市信息和天气信息等数据。
  4. 可以考虑使用PythonRequests库来处理HTTP请求,获取API返回的JSON数据,并解析成Python数据结构用于显示在界面上。
  5. 在系统设计中考虑错误处理和异常情况,例如用户输入错误的城市名称或API请求失败时如何处理。

 

4系统源代码

4.1系统源代码文件说明

gongjv连接代码

Yunxing主程序代码

tianqi辅助代码

4.2源代码

gongjv.py

def GetWeatherInfo():

    url = "http://restapi.amap.com/v3/weather/weatherInfo?key=cd85cc0d640e892fd9c08f15635900de&city=130100&extensions=all"      #将xxxxxx替换为你申请的key,city代码替换为你的城市代码

    try:

        html = requests.get(url)

        data = json.loads(html.text)

        # #将JSON编码的字符串转换回Python数据结构

        # output result of json

        # print(data)

        return data

    except:

        return None

 

 

tianqi.py

# coding = utf-8

import subprocess

import time

import os

#device :eth0,wlan0

def get_ip(device):

    ip = subprocess.check_output("ip -4 addr show " + device + " | grep inet | awk '{print $2}' | cut -d/ -f1", shell = True).strip()

    return ip

# Return % of CPU used by user as a character string                               

#def getCPUuse():

#    return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))

def getCPUuse():  

#calculate CPU with two short time, time2 - time1  

        time1 = os.popen('cat /proc/stat').readline().split()[1:5]  

        time.sleep(0.2)  

        time2 = os.popen('cat /proc/stat').readline().split()[1:5]  

        deltaUsed = int(time2[0])-int(time1[0])+int(time2[2])-int(time1[2])  

        deltaTotal = deltaUsed + int(time2[3])-int(time1[3])  

        cpuUsage = float(deltaUsed)/float(deltaTotal)*100  

        return cpuUsage

 

def net_stat():  

    net = []  

    f = open("/proc/net/dev")  

    lines = f.readlines()  

    f.close()  

    for line in lines[2:]:  

        con = line.split()  

        """

        intf = {}

        intf['interface'] = con[0].lstrip(":")

        intf['ReceiveBytes'] = int(con[1])

        intf['ReceivePackets'] = int(con[2])

        intf['ReceiveErrs'] = int(con[3])

        intf['ReceiveDrop'] = int(con[4])

        intf['ReceiveFifo'] = int(con[5])

        intf['ReceiveFrames'] = int(con[6])

        intf['ReceiveCompressed'] = int(con[7])

        intf['ReceiveMulticast'] = int(con[8])

        intf['TransmitBytes'] = int(con[9])

        intf['TransmitPackets'] = int(con[10])

        intf['TransmitErrs'] = int(con[11])

        intf['TransmitDrop'] = int(con[12])

        intf['TransmitFifo'] = int(con[13])

        intf['TransmitFrames'] = int(con[14])

        intf['TransmitCompressed'] = int(con[15])

        intf['TransmitMulticast'] = int(con[16])

        """  

        intf = dict(  

            zip(  

                ( 'interface','ReceiveBytes','ReceivePackets',  

                  'ReceiveErrs','ReceiveDrop','ReceiveFifo',  

                  'ReceiveFrames','ReceiveCompressed','ReceiveMulticast',  

                  'TransmitBytes','TransmitPackets','TransmitErrs',  

                  'TransmitDrop', 'TransmitFifo','TransmitFrames',  

                  'TransmitCompressed','TransmitMulticast' ),  

                ( con[0].rstrip(":"),int(con[1]),int(con[2]),  

                  int(con[3]),int(con[4]),int(con[5]),  

                  int(con[6]),int(con[7]),int(con[8]),  

                  int(con[9]),int(con[10]),int(con[11]),  

                  int(con[12]),int(con[13]),int(con[14]),  

                  int(con[15]),int(con[16]), )  

            )  

        )  

  

        net.append(intf)  

    return net

 

 

 

 

Yunxing.py

#encoding: utf-8

import pygame

import time

import weatherAPI

import SystemInfo

from datetime import datetime

 

# 显示图片函数

def ShowPicture(picturepath,x0,y0):  

    background=pygame.image.load(picturepath)

    background.convert_alpha()

    window.blit(background,(x0,y0))

    return

def ShowCircle():

    pygame.draw.circle(window,pygame.Color(255,255,255),(width/2,height/2),radius,fill)

    return

# 划线函数,起始坐标,终点坐标

def ShowLine(x0,y0,x1,y1):

    pygame.draw.line(window,pygame.Color(255,255,255),(x0,y0),(x1,y1),fill)

    return

Yellow=(255,255,0)

Red=(255,0,0)

LightBlue=(190,190,255)

Green=(0,255,0)

Black=(0,0,0)

White=(255,255,255)

# 画框函数

def ShowRec(x0,y0,x1,y1,color,fill):

    pygame.draw.rect(window,color,(x0,y0,x1,y1),fill)

    return

# 字符串显示函数

def ShowStr(mystring,x0,y0,size):

    font=pygame.font.Font('gkai00mp.ttf',size,bold=1)

    textSuface=font.render(mystring,1,pygame.Color(255,255,255))

    window.blit(textSuface,(x0,y0))                    

    return

 

def ShowStr2(mystring,x0,y0,size):

    font=pygame.font.Font('gkai00mp.ttf',size,bold=1)

    textSuface=font.render(mystring,1,pygame.Color(255,255,0))

    window.blit(textSuface,(x0,y0))                    

    return

def ShowStr3(mystring,x0,y0,size):

    font=pygame.font.Font('gkai00mp.ttf',size,bold=1)

    textSuface=font.render(mystring,1,pygame.Color(0,255,0))

    window.blit(textSuface,(x0,y0))                    

    return

#背景参数设置                            

width=1280

height=800

fill=1

#初始化背景

pygame.init()

window=pygame.display.set_mode((width,height),pygame.FULLSCREEN)#全屏

# window=pygame.display.set_mode((width,height))#不全屏

window.fill(pygame.Color(0,0,0))

# back=pygame.image.load(r"/home/pi/ccj/c.jpg")  #图片位置

 

 

loop=0

last_ip = ip = ''

updatingtime=""

Title_X=width

WeatherValidation=False

while True:

    # window.blit(back,(0,0))  #对齐的坐标

    window.fill(pygame.Color(0,0,0))     #背景色0为黑

   # ShowPicture("a_3.gif",20,450)

    #draw grids

    #ShowStr(u"时间",10,20,80)

    ShowRec(10,10,width-20,height-80,White,1)    #画一个大框

    ShowLine(10,height/5,width-10,height/5)

    ShowLine(10,height/5*3,width-10,height/5*3)

    ShowLine(width/2,height/5,width/2,height-70)

    ShowLine(width/4,height/5*3,width/4,height-70)

    ShowLine(width/4*3,height/5*3,width/4*3,height-70)

    

 

    #time show                                                                   

    mylocaltime=time.localtime()

    myclock=time.strftime("%H:%M:%S",mylocaltime)#13:15:03 2017-04-21

    ShowStr(myclock,0,0,180)

    mydate=time.strftime("%Y-%m-%d",mylocaltime)#2017-04-21

    ShowStr(mydate,810,5,90)

    mytime=time.strftime("%A",mylocaltime)#Thursday

    ShowStr(mytime,830,90,85)

    

    name = "自动化实验室欢迎您"

    ShowStr2(name,width/2+10,height/5*2-140,52)

    ip = SystemInfo.get_ip('wlan0')

    # ip = SystemInfo.get_ip('eth0')

    cpu_usage =SystemInfo.getCPUuse()

    ShowStr(ip,width/2+100,height/5*2-90,48)

    ShowStr("ip:",width/2+10,height/5*2-90,52)

 

    

    #netspeed show

    NetInfoOld=SystemInfo.net_stat()

    time.sleep(1)

    NetInfoNew=SystemInfo.net_stat()

    DownloadSpeed=(NetInfoNew[0]["ReceiveBytes"]-NetInfoOld[0]["ReceiveBytes"])/1048576 #last second total flow -current second total flow

    UploadSpeed=(NetInfoNew[0]["TransmitBytes"]-NetInfoOld[0]["TransmitBytes"])/1048576

    ShowRec(width/2+20,height/5*2-40,DownloadSpeed/10*600+20,48,Green,0)

    ShowRec(width/2+20,height/5*2+10,UploadSpeed/10*600+20,48,LightBlue,0)

    ShowStr(":"+str("%3.2f"%(DownloadSpeed))+"MB/s",width/2+20,height/5*2-40,48)

    ShowStr(":"+str("%3.2f"%(UploadSpeed))+"MB/s",width/2+20,height/5*2+10,48)

 

    #cpu_usage show

    ShowRec(width/2+20,height/5*2+60,cpu_usage/100*600+60,48,Yellow,0)

    ShowStr("CPU usage:"+str("%2d"%cpu_usage)+"%",width/2+20,height/5*2+110,48)

 

    if loop % 60==0 :

        future = datetime.strptime('2019-1-1 00:00:00','%Y-%m-%d %H:%M:%S')

        #当前时间

        now = datetime.now()

        #求时间差

        delta = future - now

        hour = delta.seconds/60/60

        minute = delta.seconds/60

        seconds = delta.seconds - hour*60*60 - minute*60

        # print_now=now.strftime('%Y-%m-%d %H:%M:%S')

        # print("今天是:",print_now)

        # print("距离 2019-02-01 \"work\" 还剩下:%d天"%delta.days)

        # print(delta.days,hour, minute, seconds)

 

    ShowStr2("倒计时:%dH (%dMin)"%(hour,minute),width/4*2+width/32+20,height/5*3+height/30+235,45)

 

# #########################本地信息获取完成#######################################

 #   print (":"+str("%3.1f"%(DownloadSpeed))+"MB/s")

  #  print (":"+str("%3.1f"%(UploadSpeed))+"MB/s")

    

    #print("CPU usage:"+str("%2d"%cpu_usage)+"%")

    

# ########weather show####################################

    if loop % 10800==0 :                                        #update per 3 hours

        jsonArr=weatherAPI.GetWeatherInfo()

        if jsonArr!=None :                                      #记录请求数据时间

            updatingtime=time.strftime("%H:%M:%S",mylocaltime)    

            if jsonArr["status"]!="1":

                print (jsonArr["msg"])

                WeatherValidation=False

            else:

                result=jsonArr["forecasts"][0]

                WeatherValidation=True

                #print (result["city"],result["weather"],result["temp"],result["temphigh"],result["templow"])

    if WeatherValidation==True:

        # AQI=result["aqi"]

        # index=result["index"]

        # index0=index[0]

        # daily=result["daily"]

        # day1=daily[1]#明天天气预报

        # day2=daily[2]#明天天气预报

        # day3=daily[3]#明天天气预报

        # day4=daily[4]#明天天气预报              

    # ##        #室外温湿度

    #     ShowPicture("pictures/"+result["img"]+".png",width/16,height/5+150)

        ShowStr("武汉市",width/32,height/5+10,60)

        ShowStr(result["city"],width/32,height/5+80,60)

        ShowStr(result["casts"][0]["dayweather"],width/32-25,height/5*2+50,120)

        ShowStr(result["casts"][0]["daytemp"]+"",width/4,height/5,160)

        

        ShowStr("气温最低:"+result["casts"][0]["nighttemp"] +"",width/4-10,height/5*2-20,48)

        ShowStr("接下来转:"+result["casts"][0]["nightweather"],width/4-10,height/5*2+50,48)

        # ShowStr("zhesgii",width/2+20,height/5+10,120)

        ShowStr("风力:"+result["casts"][0]["daypower"]+"级",width/4-10,height/5*2+110,48)

    # ##        #空气质量

    #     ShowStr("PM2.5:",width/2+280,height/5+120,32)

    #     ShowStr(AQI["pm2_5"],width/2+400,height/5-20,200)

    #     ShowStr("空气质量:"+AQI["quality"],width/2+240,height/5*2-40,32)

        ShowPicture("pictures/"+result["casts"][0]["dayweather"]+".png",width/32+60,height/5+145)

    #     if Title_X<=-100:

    #         Title_X=width

    #     else:

    #         Title_X=Title_X-40

    #     ShowStr(index0["detail"],Title_X,height-50,40)

    #     #未来几天天气预报

        ShowStr("明天:"+result["casts"][1]["date"],width/32,height/5*3+height/30-10,30)

        ShowStr(result["casts"][1]["dayweather"],width/32,height/5*3+height/30+30,50)

        ShowStr(result["casts"][2]["daytemp"]+"",width/32,height/5*3+height/30+80,70)

        ShowStr("气温Min:"+result["casts"][1]["nighttemp"] +"",width/32-10,height/5*3+height/30+140,45)

        ShowStr("未来转:"+result["casts"][1]["nightweather"],width/32-10,height/5*3+height/30+180,45)

        ShowPicture("pictures/"+result["casts"][1]["dayweather"]+".png",width/32+170,height/5*3+height/30+45)

    #     ShowPicture("pictures/"+day1["day"]["img"]+".png",width/32,height/5*3+height/10)

    # ##

        ShowStr("后天:"+result["casts"][2]["date"],width/4+width/32,height/5*3+height/30-10,30)

        ShowStr(result["casts"][2]["dayweather"],width/4+width/32,height/5*3+height/30+30,50)

        ShowStr(result["casts"][2]["daytemp"]+"",width/4+width/32,height/5*3+height/30+80,70)

        ShowStr("气温Min:"+result["casts"][2]["nighttemp"] +"",width/4+width/32-10,height/5*3+height/30+140,45)

        ShowStr("未来转:"+result["casts"][2]["nightweather"],width/4+width/32-10,height/5*3+height/30+180,45)

        ShowPicture("pictures/"+result["casts"][2]["dayweather"]+".png",width/4+width/32+170,height/5*3+height/30+45)

    #     ShowStr(day2["day"]["weather"],width/4+width/32,height/5*3+height/5-40,100)

    #     ShowStr(day2["day"]["windpower"],width/4+width/32+70,height/5*3+height/10,64)

    #     ShowStr(day2["night"]["templow"]+"~"+day2["day"]["temphigh"]+"",width/4+width/32,height-130,64)

    #     ShowPicture("pictures/"+day2["day"]["img"]+".png",width/4+width/32,height/5*3+height/10)

    # ##    

        ShowStr("大后天:"+result["casts"][3]["date"],width/4*2+width/32-25,height/5*3+height/30-10,30)

        ShowStr(result["casts"][3]["dayweather"],width/4*2+width/32-25,height/5*3+height/30+30,50)

        ShowStr(result["casts"][3]["daytemp"]+"",width/4*2+width/32-25,height/5*3+height/30+80,70)

        ShowStr("气温Min:"+result["casts"][3]["nighttemp"] +"",width/4*2+width/32-25,height/5*3+height/30+140,45)

        ShowStr("未来转:"+result["casts"][3]["nightweather"],width/4*2+width/32-25,height/5*3+height/30+180,45)

        ShowPicture("pictures/"+result["casts"][3]["dayweather"]+".png",width/4*2+width/32-25+170,height/5*3+height/30+45)

    #     ShowStr(day3["day"]["weather"],width/4*2+width/32,height/5*3+height/5-40,100)

    #     ShowStr(day3["day"]["windpower"],width/4*2+width/32+70,height/5*3+height/10,64)

    #     ShowStr(day3["night"]["templow"]+"~"+day2["day"]["temphigh"]+"",width/4*2+width/32,height-130,64)

    #     ShowPicture("pictures/"+day3["day"]["img"]+".png",width/4*2+width/32,height/5*3+height/10)

    # ##    

 

        ShowPicture("pictures/cj.png",width/4*3+width/32,height/5*3+height/30-15)

    #     ShowStr(day4["day"]["weather"],width/4*3+width/32,height/5*3+height/5-40,100)

    #     ShowStr(day4["day"]["windpower"],width/4*3+width/32+70,height/5*3+height/10,64)

    #     ShowStr(day4["night"]["templow"]+"~"+day2["day"]["temphigh"]+"",width/4*3+width/32,height-130,64)

    #     ShowPicture("pictures/"+day4["day"]["img"]+".png",width/4*3+width/32,height/5*3+height/10)

    # #记录请求数据时间

        ShowStr3("Last update:"+updatingtime,width/4*3+15,height/5*3,30)

        ShowStr2("这里是滚动字幕显示区,加循环可实现动态效果",width/32-25,height/5*3+height/30+235,45)

    #update

 

   

    pygame.display.update()

    

    loop +=1

    #全屏

   #for event in pygame.event.get():

   #     if event.type==pygame.KEYDOWN:

   #         running=False

pygame.quit()

 

 

 

 

5系统使用说明书

1在输入框中输入你要查询的城市

2点击查询按钮,会返回近天的天气预报

 

 

6参考资料

在树莓派上用 python 做一个炫酷的天气预报 - WireHome - 博客园 (cnblogs.com)

7附件说明

列出本文档要求的附件资料,主要包括项目源代码(包含支持类库、数据库备份)、可执行文件、运行环境说明、开发环境说明等资料。这些附件文件已压缩包的形式压缩上交。

 

posted @ 2024-05-08 21:02  大虚胖子  阅读(3)  评论(0编辑  收藏  举报