天气查询邮件提醒
胖虎

天气查询邮件提醒

软件界面ui

ui设计

用的是PyQt5,先用Qt Designer设计界面,拖动组件改属性即可,注意objectName一定要改,保持良好的习惯。

image-20210530172731604

主程序调用ui

将ui文件转化成py文件Ui_weatherQuery.py,在这个文件里绑定事件,然后在主程序里面调用界面就可。

ui事件绑定业务函数

Ui_weatherQuery.py文件里,

1
2
3
self.queryBtn.clicked.connect(Dialog.queryWeather)
self.clearBtn.clicked.connect(Dialog.clearText)
self.pushButton.clicked.connect(Dialog.sendEmail)
主程序里与ui的交互
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MainDialog(QDialog):
def __init__(self, parent=None):
super(QDialog, self).__init__(parent)
self.ui = Ui_weatherQuery.Ui_Dialog()
self.ui.setupUi(self)

def queryWeather(self):
city_name = self.ui.txtCityName.text()
self.res = query_weather(city_name=city_name)
self.ui.txtQueryRes.setText(self.res)

def clearText(self):
self.ui.txtQueryRes.clear()
self.ui.txtCityName.clear()

def sendEmail(self):
email_send.go(msg=self.res, subject_msg='天气预报')
pass
显示界面模板框架
1
2
3
4
5
6
7
8
from PyQt5.QtWidgets import QApplication, QDial, QDialog

if __name__ == '__main__':
myApp = QApplication(sys.argv)
myDlg = MainDialog()
myDlg.show()

sys.exit(myApp.exec_())

天气查询部分

调用api

api有免费的,申请就完事了。

request包发送请求,返回的json解析一下就可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def query_weather(city_name="武汉", record=True):
appid = "29467327"
appsecret = "27kJLhNF"
# 请求地址&信息
url = u"https://www.tianqiapi.com/free/week?appid={}&appsecret={}&city={}".format(
appid, appsecret, city_name)
# 发送请求得到返回结果
r = requests.get(url)
# 格式化显示json
res = json.dumps(r.json(), indent=4, ensure_ascii=False)
if record:
with open("res.txt", 'w')as f:
f.write(res)
return res

部分结果展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"cityid": "101200101",
"city": "武汉",
"update_time": "2021-05-30 15:55:18",
"data": [
{
"date": "2021-05-30",
"wea": "晴转多云",
"wea_img": "yun",
"tem_day": "30",
"tem_night": "20",
"win": "南风",
"win_speed": "<3级"
},
......
]
}

邮件发送部分

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
# smtp(simple mail transfer protocol)是python自带的邮件模块,负责邮件传输
# email负责邮件内容
import smtplib

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

# stmp_server={'163':'smtp.163.com','qq':'stmp.qq.com'}
# port_list={'163':25,'qq':465}
class email_send:
'''
description:封装了构造邮件及发送邮件的操作
param {*}
return {*}
'''

def __init__(self, from_addr, password, to_addr, server="smtp.qq.com", port=465) -> None:
self.from_addr = from_addr
self.password = password
self.to_addr = to_addr
self.server = server
self.port = port

def server_start(self):
self.server = smtplib.SMTP_SSL(host=self.server, port=self.port)
print(self.server)

def server_quit(self):
self.server.quit()

def _format_addr(self, addr_msg):
name, addr = parseaddr(addr_msg)
return formataddr((Header(name, 'utf-8').encode(), addr))

def send_text_data(self, text, data_type, subject_msg):
msg = MIMEText(_text=text, _subtype='plain', _charset='utf-8')
msg['From'] = self._format_addr(self.from_addr)
msg['To'] = self._format_addr(self.to_addr)
msg['Subject'] = Header(s=subject_msg, charset='utf-8')
self.server.login(self.from_addr, self.password)
self.server.sendmail(self.from_addr, self.to_addr, msg.as_string())


def go(msg='新的邮件代码测试', subject_msg='A new test'):
# 账号信息
sender = "141*****@qq.com" # 发件人
password = "*******" # 在QQ邮箱里可打开SMTP服务的密码,非邮箱登录密码
receivers = ["13******@qq.com"] # 收件人
# 邮件文本内容
try:
es = email_send(sender, password, receivers)
es.server_start()
es.send_text_data(msg, 'plain', subject_msg)
es.server_quit()
print('success')
except:
print('error')


if __name__ == "__main__":
go()
  • Post title:天气查询邮件提醒
  • Post author:胖虎
  • Create time:2021-05-30 00:00:00
  • Post link:https://leiwei.space/2021/05/30/2021-05-30-python天气查询邮件提醒/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments