天气时钟

Python实现的天气时钟

  曾经看树莓派实在是可爱,一冲动就买了一个回来,还给它配了外壳和屏幕,然后就这么一直看着它,稀罕但又不知道该拿它来干什么。与其放着吃灰,不如让它发挥点作用,放在桌面上当个时钟吧,而且不仅要能看时间,还要能看天气才行。

在树莓派上的运行效果

实现过程

  使用”time.asctime()”即可获取系统日期和时间。

  获取实时天气最简单的方法是调用天气API,这里使用的是心知天气提供的API,如果是个人使用的话免费版就足够了。在控制台查看自己的API密钥,由于是个人使用,使用私钥即可。阅读心知天气产品文档,将示例url中的相应部分替换为自己的私钥,城市和语言。

  使用”requests.get(url)”调用天气API,返回的信息可自行筛选,这里只选择了天气和温度。

  使用tkinter模块编写图形化界面。

  图形化界面的实时刷新功能困扰了我好久,找了各种多进程的方法无果。最后才知道tkinter窗口可以使用after方法实现定时器的作用,让”refresh_time()”,”refresh_date()”,”refresh_weather()”隔一段时间调用自身即可实现刷新。

  由于希望这是一个全屏应用,所以树莓派的任务栏会影响观感。编辑树莓派的”~/.config/lxpanel/LXDE-pi/panels/panel”文件,将文件中”autohide=0”改为”autohide=1”,重启,即可隐藏任务栏。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import requests
import time
from tkinter import *

root = Tk()
root.title('weather clock')
root.geometry('800x480') # 调整窗口大小
root.config(cursor='none') # 隐藏鼠标指针

frame1 = Frame(root, bg='black')
frame1.pack(fill='both')


def get_time():
t = time.asctime()
items = t.split(' ')
items_time = items[3].split(':')
# items_time = items_time[0] + ':' + items_time[1] + ':' + items_time[2] # 时:分:秒
items_time = items_time[0] + ':' + items_time[1] # 时:分

return items_time


def get_date():
t = time.asctime()
items = t.split(' ')
items_date = items[0] + ' ' + items[1] + ' ' + items[2]

return items_date


def get_weather():
r = requests.get('https://api.seniverse.com/v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c') # 替换API密钥
weather = r.json()['results'][0]['now']['text'] + ' ' + r.json()['results'][0]['now']['temperature'] + '℃'

return weather


# StringVar() 可变字符串
time_str = StringVar()
date_str = StringVar()
weather_str = StringVar()


def refresh_time():
global time_str
time_str.set(get_time())
root.after(1000, refresh_time) # 每隔一秒刷新一次时间


def refresh_date():
global date_str
date_str.set(get_date())
root.after(1000, refresh_date) # 每隔一秒刷新一次日期


def refresh_weather():
global weather_str
weather_str.set(get_weather())
root.after(1000 * 60 * 60, refresh_weather) # 每隔一小时刷新一次天气


Label(frame1, textvariable=time_str, bg='black', font=('', 200), fg='white').pack()
Label(frame1, textvariable=date_str, bg='black', font=('', 36), fg='white').pack()
Label(frame1, textvariable=weather_str, bg='black', font=('', 24), height=2, fg='white').pack()

refresh_time()
refresh_date()
refresh_weather()

root.mainloop()