【行空板 Python编程学习主控板】七:按键切换页面
[复制链接]
本帖最后由 数码小叶 于 2022-12-10 22:03 编辑
上一篇已经可以显示获取到的网络天气信息,但是天气数据比较多,而上一篇只是显示当日的一些天气信息。一般实际显示的天气数据有一天的还有七天的,因此,像上一篇那样,一个页面就显示不全,除非缩小字体,但那样就不直观了。比较合适的是切换页面,不同页面显示不同信息。行空板刚好有两个用户按键可以用来控制切换页面。
要使用按键,就要用到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,依旧使用免费版的,免费版的已经够使用了。
同样,使用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")
最后依旧花费一点时间,调整下显示坐标
还剩下最后一个问题,就是天气获取的频次,因为使用的免费版,是有次数限制的,不能一直获取天气数据,而且,太频繁的获取天气数据也没有实际意义。实际中,天气数据也是隔几个小时变化一次。因此想到了定时器,运行一段时间获取一次。但是不论是在循环里延时,还是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()
所有的问题都解决了,可以达到按键切换天气数据的目的了
|