[经验] 【行空板 Python编程学习主控板】七:按键切换页面

数码小叶   2022-12-10 22:04 楼主

上一篇已经可以显示获取到的网络天气信息,但是天气数据比较多,而上一篇只是显示当日的一些天气信息。一般实际显示的天气数据有一天的还有七天的,因此,像上一篇那样,一个页面就显示不全,除非缩小字体,但那样就不直观了。比较合适的是切换页面,不同页面显示不同信息。行空板刚好有两个用户按键可以用来控制切换页面。

要使用按键,就要用到pinpong库了,在pinpong库中有两种方式调用按钮,一种是直接读取-查询式,第二种是中断事件回调式。pinpong库中给出了使用方法

if button_a.is_pressed() == True: #判断按钮是否被按下
    print("按钮A按下")
if button_b.is_pressed() == True: #判断按钮是否被按下
    print("按钮B按下")
def btn_a_rasing_handler(pin):#中断事件回调函数
  print("按钮A按下")

def btn_b_falling_handler(pin):#中断事件回调函数
  print("按钮B松开")

button_a.irq(trigger=Pin.IRQ_RISING, handler = btn_a_rasing_handler)#上升沿触发
button_b.irq(trigger=Pin.IRQ_FALLING, handler = btn_b_falling_handler)#下降沿触发

 

实际测试发现,查询的方式另外要做消抖处理,不然一次调用,实际会触发好几次不等,中断的方式就很稳定,因此最后使用中断方式。

button_a.irq(trigger=Pin.IRQ_RISING, handler = Analysis_RealDaydate)
button_b.irq(trigger=Pin.IRQ_RISING, handler = Analysis_SevenDaydate)

上按键按下,显示当日天气,下按键按下,显示一周天气。当日天气,直接使用上一篇的显示效果,只需要再调试下一周天气效果即可。

 

同样,可以从几个天气网站上找到七日数据的请求API,依旧使用免费版的,免费版的已经够使用了。

2022-12-10_21-51-07.png

 

同样,使用requests 以及 json 两个模块来获取天气数据。七日的Response数据解析,稍微比单日的复杂一点点,返回的是字典、列表组成的字典

{"nums":22,"cityid":"101220301","city":"芜湖","update_time":"2022-12-10 19:53:49","data":[{"date":"2022-12-10","wea":"雾转多云","wea_img":"yun","tem_day":"11","tem_night":"2","win":"西北风","win_speed":"3-4级"},{"date":"2022-12-11","wea":"阴转多云","wea_img":"yun","tem_day":"8","tem_night":"0","win":"东北风","win_speed":"3-4级转<3级"},{"date":"2022-12-12","wea":"多云转晴","wea_img":"yun","tem_day":"8","tem_night":"0","win":"西风","win_speed":"3-4级转<3级"},{"date":"2022-12-13","wea":"晴","wea_img":"qing","tem_day":"11","tem_night":"-1","win":"北风","win_speed":"3-4级转<3级"},{"date":"2022-12-14","wea":"晴","wea_img":"qing","tem_day":"6","tem_night":"-1","win":"东风","win_speed":"<3级"},{"date":"2022-12-15","wea":"多云转阴","wea_img":"yun","tem_day":"11","tem_night":"-1","win":"东北风","win_speed":"<3级转3-4级"},{"date":"2022-12-16","wea":"小雪转多云","wea_img":"yun","tem_day":"5","tem_night":"-5","win":"北风","win_speed":"3-4级"}]}

 

仔细观察,发现解析时,只要选择date键的值就可以了

week_data = SevenDayweather_data['data']

 

其键值是一个字典组成的列表,包含了需要的全部七日天气数据

[{'date': '2022-12-10', 'wea': '雾转多云', 'wea_img': 'yun', 'tem_day': '11', 'tem_night': '2', 'win': '西北风', 'win_speed': '3-4级'}, {'date': '2022-12-11', 'wea': '阴转多云', 'wea_img': 'yun', 'tem_day': '8', 'tem_night': '0', 'win': '东北风', 'win_speed': '3-4级转<3级'}, {'date': '2022-12-12', 'wea': '多云转晴', 'wea_img': 'yun', 'tem_day': '8', 'tem_night': '0', 'win': '西风', 'win_speed': '3-4级转<3级'}, {'date': '2022-12-13', 'wea': '晴', 'wea_img': 'qing', 'tem_day': '11', 'tem_night': '-1', 'win': '北风', 'win_speed': '3-4级转<3级'}, {'date': '2022-12-14', 'wea': '晴', 'wea_img': 'qing', 'tem_day': '6', 'tem_night': '-1', 'win': '东风', 'win_speed': '<3级'}, {'date': '2022-12-15', 'wea': '多云转阴', 'wea_img': 'yun', 'tem_day': '11', 'tem_night': '-1', 'win': '东北风', 'win_speed': '<3级转3-4级'}, {'date': '2022-12-16', 'wea': '小雪转多云', 'wea_img': 'yun', 'tem_day': '5', 'tem_night': '-5', 'win': '北风', 'win_speed': '3-4级'}]

 

因此,只要解析这个列表就ok了

day1_date.config(text=str(week_data[0]['date']))
day1_wea.config(text=str(week_data[0]['wea']))
day1_temnight.config(text=str(week_data[0]['tem_night'])+"~")
day1_temday.config(text=str(week_data[0]['tem_day'])+"oC")

 

最后依旧花费一点时间,调整下显示坐标

微信图片_20221210211638.jpg

 

还剩下最后一个问题,就是天气获取的频次,因为使用的免费版,是有次数限制的,不能一直获取天气数据,而且,太频繁的获取天气数据也没有实际意义。实际中,天气数据也是隔几个小时变化一次。因此想到了定时器,运行一段时间获取一次。但是不论是在循环里延时,还是timer模块,感觉都适合s级,ms级任务,不太适合几小时一次,最后找到了schedule模块python-schedule模块(定时任务)基于官方文档总结 - 腾讯云开发者社区-腾讯云 (tencent.com)

schedule.every().seconds 每秒运行一次
schedule.every(2).seconds 每2秒运行一次
schedule.every(1).to(5).seconds 每1-5秒运行一次
schedule.every().minutes 每分钟运行一次
schedule.every().hour 每小时运行一次
schedule.every().day 每天运行一次如果后面没有at表示每天当前时间执行一次
schedule.every().day.at("00:00"). 每天凌晨运行一次
schedule.every().week每周凌晨运行一次
schedule.every().wednesday.at("00:00") 每周三凌晨运行一次

 

刚好完美的可以实现,隔几个小时获取一次天气数据的需求

schedule.every().day.at("00:00").do(Get_NetWeather)
schedule.every().day.at("04:00").do(Get_NetWeather)
schedule.every().day.at("08:00").do(Get_NetWeather)
schedule.every().day.at("12:00").do(Get_NetWeather)
schedule.every().day.at("16:00").do(Get_NetWeather)
schedule.every().day.at("20:00").do(Get_NetWeather)

 

因为没有使用GUI,所以实际切换的只是重绘屏幕上的组件,还好unihiker库提供了一次删除控件的方法:

gui.clear()

所有的问题都解决了,可以达到按键切换天气数据的目的了


 

本帖最后由 数码小叶 于 2022-12-10 22:03 编辑

回复评论 (6)

能不能获取gps信息?


点赞  2022-12-11 09:10

这个获取天气情况挺实用的,等后面有空的时候我也试一下,话说这个底板是在DFrobot店买的么?

 

点赞  2022-12-11 10:48
引用: 大秦正声 发表于 2022-12-11 09:10 能不能获取gps信息?

那得加GPS模块了,目前实现不了

点赞  2022-12-11 12:39
引用: yaoquan5201314 发表于 2022-12-11 10:48 这个获取天气情况挺实用的,等后面有空的时候我也试一下,话说这个底板是在DFrobot店买的么?  

不是。。。但是DFrobot店也有IO口扩展板

点赞  2022-12-11 12:40
引用: 数码小叶 发表于 2022-12-11 12:40 不是。。。但是DFrobot店也有IO口扩展板

好的,我找找看,先买一个扩展版研究一下金手指的接口方式,后面自己再动手画一个适合自己的扩展板。

点赞  2022-12-11 12:49
一看到JSON格式数据,就觉得功能实现大部分了,然后解析一下JSON数据,就可以显示了
点赞  2023-1-28 15:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复