数码小叶 发表于 2022-12-10 22:04

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

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

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

<p><span style="font-size:16px;">要使用按键,就要用到pinpong库了,在pinpong库中有两种方式调用按钮,一种是直接读取-查询式,第二种是中断事件回调式。pinpong库中给出了使用方法</span></p>

<pre>
<code>if button_a.is_pressed() == True: #判断按钮是否被按下
    print("按钮A按下")
if button_b.is_pressed() == True: #判断按钮是否被按下
    print("按钮B按下")</code></pre>

<pre>
<code>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)#下降沿触发
</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">实际测试发现,查询的方式另外要做消抖处理,不然一次调用,实际会触发好几次不等,中断的方式就很稳定,因此最后使用中断方式。</span></p>

<pre>
<code>button_a.irq(trigger=Pin.IRQ_RISING, handler = Analysis_RealDaydate)
button_b.irq(trigger=Pin.IRQ_RISING, handler = Analysis_SevenDaydate)</code></pre>

<p><span style="font-size:16px;">上按键按下,显示当日天气,下按键按下,显示一周天气。当日天气,直接使用上一篇的显示效果,只需要再调试下一周天气效果即可。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">同样,可以从几个天气网站上找到七日数据的请求API,依旧使用免费版的,免费版的已经够使用了。</span></p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">同样,使用requests 以及&nbsp;json 两个模块来获取天气数据。七日的Response</span><span style="font-size:16px;">数据解析,稍微比单日的复杂一点点,返回的是字典、列表组成的字典</span></p>

<pre>
<code>{"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级转&lt;3级"},{"date":"2022-12-12","wea":"多云转晴","wea_img":"yun","tem_day":"8","tem_night":"0","win":"西风","win_speed":"3-4级转&lt;3级"},{"date":"2022-12-13","wea":"晴","wea_img":"qing","tem_day":"11","tem_night":"-1","win":"北风","win_speed":"3-4级转&lt;3级"},{"date":"2022-12-14","wea":"晴","wea_img":"qing","tem_day":"6","tem_night":"-1","win":"东风","win_speed":"&lt;3级"},{"date":"2022-12-15","wea":"多云转阴","wea_img":"yun","tem_day":"11","tem_night":"-1","win":"东北风","win_speed":"&lt;3级转3-4级"},{"date":"2022-12-16","wea":"小雪转多云","wea_img":"yun","tem_day":"5","tem_night":"-5","win":"北风","win_speed":"3-4级"}]}</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">仔细观察,发现解析时,只要选择date键的值就可以了</span></p>

<pre>
<code>week_data = SevenDayweather_data['data']</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">其键值是一个字典组成的列表,包含了需要的全部七日天气数据</span></p>

<pre>
<code>[{'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级转&lt;3级'}, {'date': '2022-12-12', 'wea': '多云转晴', 'wea_img': 'yun', 'tem_day': '8', 'tem_night': '0', 'win': '西风', 'win_speed': '3-4级转&lt;3级'}, {'date': '2022-12-13', 'wea': '晴', 'wea_img': 'qing', 'tem_day': '11', 'tem_night': '-1', 'win': '北风', 'win_speed': '3-4级转&lt;3级'}, {'date': '2022-12-14', 'wea': '晴', 'wea_img': 'qing', 'tem_day': '6', 'tem_night': '-1', 'win': '东风', 'win_speed': '&lt;3级'}, {'date': '2022-12-15', 'wea': '多云转阴', 'wea_img': 'yun', 'tem_day': '11', 'tem_night': '-1', 'win': '东北风', 'win_speed': '&lt;3级转3-4级'}, {'date': '2022-12-16', 'wea': '小雪转多云', 'wea_img': 'yun', 'tem_day': '5', 'tem_night': '-5', 'win': '北风', 'win_speed': '3-4级'}]</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">因此,只要解析这个列表就ok了</span></p>

<pre>
<code>day1_date.config(text=str(week_data['date']))
day1_wea.config(text=str(week_data['wea']))
day1_temnight.config(text=str(week_data['tem_night'])+"~")
day1_temday.config(text=str(week_data['tem_day'])+"oC")</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">最后依旧花费一点时间,调整下显示坐标</span></p>

<p></p>

<p>&nbsp;</p>

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

<pre>
<code>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") 每周三凌晨运行一次</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">刚好完美的可以实现,隔几个小时获取一次天气数据的需求</span></p>

<pre>
<code>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)</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">因为没有使用GUI,所以实际切换的只是重绘屏幕上的组件,还好unihiker库提供了一次删除控件的方法:</span></p>

<pre>
<code>gui.clear()</code></pre>

<p><span style="font-size:16px;">所有的问题都解决了,可以达到按键切换天气数据的目的了</span></p>

<p><iframe allowfullscreen="true" frameborder="0" height="510" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&amp;lessonid=35208" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
&nbsp;</p>

大秦正声 发表于 2022-12-11 09:10

<p>能不能获取gps信息?</p><br/>

yaoquan5201314 发表于 2022-12-11 10:48

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

<p>&nbsp;</p>

数码小叶 发表于 2022-12-11 12:39

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

<p>那得加GPS模块了,目前实现不了</p>

数码小叶 发表于 2022-12-11 12:40

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

&nbsp;

<p>不是。。。但是DFrobot店也有IO口扩展板</p>

yaoquan5201314 发表于 2022-12-11 12:49

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

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

piazini 发表于 2023-1-28 15:44

一看到JSON格式数据,就觉得功能实现大部分了,然后解析一下JSON数据,就可以显示了
页: [1]
查看完整版本: 【行空板 Python编程学习主控板】七:按键切换页面