【青少年编程】黄羽恒:天气预报
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。
微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档)。
编程题
“天气预报”是来自「青少年编程竞赛交流群」中 「黄羽恒」 小朋友的作品。
小朋友们出去郊游之前,最重要的就是查看郊游目的地的天气情况。
首先,准备一组图像包括背景图(背景2.jpg)、晴天图(qing.jpg)、阴天图(yin.jpg)、下雪图(xue.jpg)等等,以及播报天气情况时的背景音乐(Plant vs Zombie.wav)如下图所示,
其次,利用爬虫技术,从下列网址爬取指定城市的天气情况。
https://www.tianqiapi.com/api?version=v6&appid=87842446&appsecret=PvYxBu6V&city='北京'
再次,根据天气情况选择对应的图片进行显示。
最后,给定城市(比如上海、北京等)之后,程序就会播报该城市的天气情况。
1. 思路分析
写一个weather_helper
的类。
get_weather(city)
:获取指定城市city
的天气情况;play_sound(name, loop=-1, volume=0.5)
:指定播放声音的文件name
以及重复的次数loop
和音量volume
来播放声音的函数;get_font(size)
:指定字体大小(size)来获取字体的函数;get_img(name, size)
:指定文件名(name)和大小(size)来获取图片的函数;
2. 程序代码
import pygame
import sys
import requests
import random
class weather_helper():
def __init__(self):
self.weather_info = self.get_weather('北京')
print(self.weather_info)
pygame.init()
self.screen = pygame.display.set_mode([600, 290])
pygame.display.set_caption('天气')
self.clock = pygame.time.Clock()
self.play_sound('天气/Plants vs Zombie.wav')
self.do_pygame_process()
def do_pygame_process(self):
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 在窗口上绘制图片
self.screen.blit(self.get_img('天气/背景2.jpg', (620, 300)), self.get_random((-10, -10), 2))
wea_img = self.get_img('天气/' + self.weather_info['wea_img'] + '.jpg', (256, 256))
self.screen.blit(wea_img, self.get_random((20, 10), 2))
f1_r = self.get_font(80).render(self.weather_info['wea'], True, (0, 0, 0))
self.screen.blit(f1_r, (250, 24))
f2_r = self.get_font(24).render(
self.weather_info['city'] + ' ' + self.weather_info['date'] + ' ' + self.weather_info['week'], True,
(0, 0, 0))
self.screen.blit(f2_r, (300, 120))
f3_r = self.get_font(24).render(
'湿度' + self.weather_info['tem2'] + '~' + self.weather_info['tem1'] + ' 空气质量' + self.weather_info[
'air_level'], True, (0, 0, 0))
self.screen.blit(f3_r, (300, 160))
text = self.weather_info['air_tips']
x = 300
y = 200
line_warp = 0
for words in text:
f3_r = self.get_font(18).render(words, True, (0, 0, 0))
self.screen.blit(f3_r, (x, y))
x += 18
line_warp += 1
if line_warp % 15 == 0:
y += 18
x = 300
pygame.display.update()
self.clock.tick(60)
def get_font(self, size):
return pygame.font.SysFont('SimHei', size)
def get_img(self, name, size):
img = pygame.image.load(name)
return pygame.transform.scale(img, size)
def get_weather(self, city):
url = 'https://www.tianqiapi.com/api?version=v6&appid=87842446&appsecret=PvYxBu6V&city=' + city
with requests.get(url) as response:
json = response.content.decode()
return eval(json)
def get_random(self, scope, step):
return random.randint(scope[0] - step, scope[0] + step), random.randint(scope[1] - step, scope[1] + step)
def play_sound(self, name, loop=-1, volume=0.5):
pygame.mixer.init()
sound = pygame.mixer.Sound(name) # 声音
sound.set_volume(volume)
sound.play(loop)
weather_helper()
3. 结果展示
基础知识:
一级编程题:
01 森林的一天 02 舞者凯希 03 小狗散步 04 猫捉老鼠 05 城堡漫步 06 火箭发射 07 飞向太空 08 小狗长大记 09 运动起来 10 动物园之旅 11 球飞了 12 希神吓走猫头鹰 13 棒球运动会
二级编程题:
三级编程题:
小朋友投稿:
Scratch:
Python:
群内答疑:
Scratch:
Python: