You've already forked QWeatherReporter
Compare commits
14 Commits
v3.2.1
...
v4.0.0pre-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6db23a3e28 | ||
|
|
5bed020e65 | ||
|
|
506bb81f44 | ||
|
|
3a0902509a | ||
|
|
704158bc64 | ||
|
|
f6f97a0785 | ||
|
|
b41be502f2 | ||
|
|
cc8bed1890 | ||
|
|
9174e11ecd | ||
|
|
31ea638770 | ||
|
|
11244734fd | ||
|
|
9cbd3b5063 | ||
|
|
3622b094fd | ||
|
|
4c73240fe9 |
34
QWeather.py
34
QWeather.py
@@ -6,9 +6,39 @@
|
|||||||
# @File Name: QWeather.py
|
# @File Name: QWeather.py
|
||||||
|
|
||||||
|
|
||||||
import sys
|
import threading
|
||||||
from core import qweather
|
from core import qweather
|
||||||
|
from tkinter import messagebox
|
||||||
|
from lib.buildGUIClass import tk
|
||||||
|
from lib.buildGUIClass import root
|
||||||
|
from lib.buildGUIClass import Features
|
||||||
|
|
||||||
|
|
||||||
|
def on_closing():
|
||||||
|
if messagebox.askokcancel('Exit', 'Confirm exit?'):
|
||||||
|
Features().quit_()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
sys.exit(qweather.main())
|
b1 = tk.Button(root,
|
||||||
|
text='Click to run QWeather',
|
||||||
|
command=threading.Thread(target=qweather.main, name='main').start)
|
||||||
|
b1.place(x=45, y=300)
|
||||||
|
b2 = tk.Button(root,
|
||||||
|
text='Exit the main program',
|
||||||
|
command=on_closing)
|
||||||
|
b2.place(x=275, y=300)
|
||||||
|
l1 = tk.Label(root,
|
||||||
|
text='更多功能敬请期待\nEnjoy this ~',)
|
||||||
|
l1.place(x=530, y=70)
|
||||||
|
information = """
|
||||||
|
已知问题:
|
||||||
|
1.开启QWeather主程序后退出只会退出界面主程序并不会退出
|
||||||
|
2.webservice.py 的输出并不会被插入到GUI界面里
|
||||||
|
* 更多问题待发现...
|
||||||
|
"""
|
||||||
|
l2 = tk.Label(root,
|
||||||
|
text=information)
|
||||||
|
l2.place(x=140, y=350)
|
||||||
|
root.protocol('WM_DELETE_WINDOW', on_closing)
|
||||||
|
root.mainloop()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/MarkusJoe/QWeather">
|
<a href="https://github.com/MarkusJoe/QWeather">
|
||||||
<img src="https://img.shields.io/badge/Python-3.10.x-blue.svg" alt="PythonVersion">
|
<img src="https://img.shields.io/badge/Python-3.10.x-blue.svg" alt="PythonVersion">
|
||||||
<img src="https://img.shields.io/badge/release-3.2.0-green.svg" alt="QWeatherVersion">
|
<img src="https://img.shields.io/badge/release-4.0.0-green.svg" alt="QWeatherVersion">
|
||||||
<img src="https://img.shields.io/badge/LINCESE-Apache2.0-orange.svg" alt="LICENSE">
|
<img src="https://img.shields.io/badge/LINCESE-Apache2.0-orange.svg" alt="LICENSE">
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
@@ -13,9 +13,14 @@
|
|||||||
<i style="text-align: center;"><a href="https://www.qweather.com/">QWeather Official Website</a></i>\
|
<i style="text-align: center;"><a href="https://www.qweather.com/">QWeather Official Website</a></i>\
|
||||||
<i style="text-align: center;"><a href="https://dev.qweather.com/">QWeather Development Platform</a></i>
|
<i style="text-align: center;"><a href="https://dev.qweather.com/">QWeather Development Platform</a></i>
|
||||||
|
|
||||||
|
> GUI问题: 无法填写城市位置, 清手动打开./res/china_city_list.xlsx 进行手动查询
|
||||||
|
> 并填写至`requests-settings` > `location`
|
||||||
|
> `only-view-settings` > `city-name` 也需手动填写
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
<b><i>当前分支: GUI, 为界面分支, 仍存在bug以及一些问题<br></i></b>
|
||||||
<b><i>当前分支版本为重构后的版本重构前版本请在before分支中查看<br>(重构前版本不再更新,最新版本为v2.9.0)</i></b><br>
|
<b><i>当前分支版本为重构后的版本重构前版本请在before分支中查看<br>(重构前版本不再更新,最新版本为v2.9.0)</i></b><br>
|
||||||
<b><i><a href="https://markusjoe.github.io/" target="_blank">点击跳转到帮助文档</a></i></b>
|
<b><i><a href="https://markusjoe.github.io/" target="_blank">点击跳转到帮助文档</a></i></b>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,6 +42,7 @@
|
|||||||
- [x] 在网页上快速查看天气
|
- [x] 在网页上快速查看天气
|
||||||
- [x] 在邮件html内附带一句一言
|
- [x] 在邮件html内附带一句一言
|
||||||
- [ ] ~~推送到QQ(咕咕咕)~~
|
- [ ] ~~推送到QQ(咕咕咕)~~
|
||||||
|
- [x] GUI界面 (无法填写城市位置, 清手动打开./res/china_city_list.xlsx 进行手动查询)
|
||||||
|
|
||||||
### 问题汇总
|
### 问题汇总
|
||||||
#### Python 版本:
|
#### Python 版本:
|
||||||
|
|||||||
@@ -110,6 +110,9 @@ client-settings:
|
|||||||
# 可选: "True" "False"
|
# 可选: "True" "False"
|
||||||
SSL: True
|
SSL: True
|
||||||
|
|
||||||
|
# [必填/只能一个] enable GUI or disable GUI
|
||||||
|
enable-GUI: True
|
||||||
|
|
||||||
|
|
||||||
# [标识/不填] 仅作用户读取标识
|
# [标识/不填] 仅作用户读取标识
|
||||||
only-view-settings:
|
only-view-settings:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
# @File Name: qweather.py
|
# @File Name: qweather.py
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import argparse
|
import argparse
|
||||||
@@ -16,6 +17,12 @@ from core.settings import change_settings
|
|||||||
from core.read_config import read_config
|
from core.read_config import read_config
|
||||||
from core.sendmail import Mail
|
from core.sendmail import Mail
|
||||||
from lib.webservice import accept_requests
|
from lib.webservice import accept_requests
|
||||||
|
from lib.buildGUIClass import InsertLog
|
||||||
|
|
||||||
|
language = Language()
|
||||||
|
settings = read_config()
|
||||||
|
processes = ProcessPoolExecutor(max_workers=3)
|
||||||
|
gui_log = InsertLog()
|
||||||
|
|
||||||
|
|
||||||
def check_time():
|
def check_time():
|
||||||
@@ -34,7 +41,10 @@ def check_time():
|
|||||||
if local_time in time_list:
|
if local_time in time_list:
|
||||||
Mail().dev_version()
|
Mail().dev_version()
|
||||||
Logger.info(f'{language["mail_succeed"]}')
|
Logger.info(f'{language["mail_succeed"]}')
|
||||||
|
gui_log.insert(f'{language["wait_seconds"]}')
|
||||||
Logger.info(f'{language["wait_seconds"]}')
|
Logger.info(f'{language["wait_seconds"]}')
|
||||||
|
gui_log.insert(f'{language["mail_succeed"]}')
|
||||||
|
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
case 'free':
|
case 'free':
|
||||||
while True:
|
while True:
|
||||||
@@ -43,7 +53,9 @@ def check_time():
|
|||||||
if local_time in time_list:
|
if local_time in time_list:
|
||||||
Mail().free_version()
|
Mail().free_version()
|
||||||
Logger.info(f'{language["mail_succeed"]}')
|
Logger.info(f'{language["mail_succeed"]}')
|
||||||
|
gui_log.insert(f'{language["wait_seconds"]}')
|
||||||
Logger.info(f'{language["wait_seconds"]}')
|
Logger.info(f'{language["wait_seconds"]}')
|
||||||
|
gui_log.insert(f'{language["mail_succeed"]}')
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
|
|
||||||
|
|
||||||
@@ -83,6 +95,16 @@ def main():
|
|||||||
主程序
|
主程序
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
Logger.info(f'{language["statement_1"]}')
|
||||||
|
gui_log.insert(f'{language["statement_1"]}')
|
||||||
|
Logger.info(f'{language["statement_2"]}')
|
||||||
|
gui_log.insert(f'{language["statement_2"]}')
|
||||||
|
Logger.info(f'{language["statement_3"]}')
|
||||||
|
gui_log.insert(f'{language["statement_3"]}')
|
||||||
|
Logger.info(f'{language["statement_4"]}')
|
||||||
|
gui_log.insert(f'{language["statement_4"]}')
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
arg_keywords = ['free', 'dev', 'warning', 'setting']
|
arg_keywords = ['free', 'dev', 'warning', 'setting']
|
||||||
parser.add_argument('-t',
|
parser.add_argument('-t',
|
||||||
@@ -95,18 +117,22 @@ def main():
|
|||||||
case 'free':
|
case 'free':
|
||||||
Mail().free_version()
|
Mail().free_version()
|
||||||
Logger.debug(f'{language["debug_done"]}')
|
Logger.debug(f'{language["debug_done"]}')
|
||||||
|
gui_log.insert(f'{language["debug_done"]}')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
case 'dev':
|
case 'dev':
|
||||||
Mail().dev_version()
|
Mail().dev_version()
|
||||||
Logger.debug(f'{language["debug_done"]}')
|
Logger.debug(f'{language["debug_done"]}')
|
||||||
|
gui_log.insert(f'{language["debug_done"]}')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
case 'warning':
|
case 'warning':
|
||||||
Mail().warning_()
|
Mail().warning_()
|
||||||
Logger.debug(f'{language["debug_done"]}')
|
Logger.debug(f'{language["debug_done"]}')
|
||||||
|
gui_log.insert(f'{language["debug_done"]}')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
case 'setting':
|
case 'setting':
|
||||||
change_settings()
|
change_settings()
|
||||||
Logger.debug(f'{language["debug_done"]}')
|
Logger.debug(f'{language["debug_done"]}')
|
||||||
|
gui_log.insert(f'{language["debug_done"]}')
|
||||||
case _:
|
case _:
|
||||||
if check_config():
|
if check_config():
|
||||||
setting()
|
setting()
|
||||||
@@ -116,7 +142,8 @@ def main():
|
|||||||
processes.submit(check_time)
|
processes.submit(check_time)
|
||||||
if settings[2]['webservice']:
|
if settings[2]['webservice']:
|
||||||
Logger.info(f'{language["webservice_ip"]}:127.0.0.1:7898')
|
Logger.info(f'{language["webservice_ip"]}:127.0.0.1:7898')
|
||||||
processes.submit(accept_requests())
|
gui_log.insert(f'{language["webservice_ip"]}:127.0.0.1:7898')
|
||||||
|
processes.submit(accept_requests)
|
||||||
|
|
||||||
time_count = 0
|
time_count = 0
|
||||||
while True:
|
while True:
|
||||||
@@ -125,14 +152,3 @@ def main():
|
|||||||
if time_count == 600:
|
if time_count == 600:
|
||||||
Mail().warning_()
|
Mail().warning_()
|
||||||
time_count = 0
|
time_count = 0
|
||||||
|
|
||||||
|
|
||||||
if __name__ != '__main__':
|
|
||||||
language = Language()
|
|
||||||
settings = read_config()
|
|
||||||
processes = ProcessPoolExecutor(max_workers=3)
|
|
||||||
|
|
||||||
Logger.info(f'{language["statement_1"]}')
|
|
||||||
Logger.info(f'{language["statement_2"]}')
|
|
||||||
Logger.info(f'{language["statement_3"]}')
|
|
||||||
Logger.info(f'{language["statement_4"]}')
|
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
import pandas
|
import pandas
|
||||||
from core.logger import Logger
|
from core.logger import Logger
|
||||||
from core.language import Language
|
from core.language import Language
|
||||||
|
from lib.buildGUIClass import InsertLog
|
||||||
|
|
||||||
|
gui_log = InsertLog()
|
||||||
|
|
||||||
|
|
||||||
def read_excel(kw: str):
|
def read_excel(kw: str):
|
||||||
@@ -21,12 +24,14 @@ def read_excel(kw: str):
|
|||||||
index_count = 0
|
index_count = 0
|
||||||
city_list = []
|
city_list = []
|
||||||
Logger.info(f'[Search]{language["reading_the_file"]}')
|
Logger.info(f'[Search]{language["reading_the_file"]}')
|
||||||
|
gui_log.insert(f'[Search]{language["reading_the_file"]}')
|
||||||
df = pandas.read_excel(f'./res/china_city_list.xlsx')
|
df = pandas.read_excel(f'./res/china_city_list.xlsx')
|
||||||
pandas.set_option('max_rows', None) # 读取xlsx文件不折叠
|
pandas.set_option('max_rows', None) # 读取xlsx文件不折叠
|
||||||
data_records = df.to_dict(orient='split')
|
data_records = df.to_dict(orient='split')
|
||||||
for i in data_records['data']:
|
for i in data_records['data']:
|
||||||
if kw in str(i):
|
if kw in str(i):
|
||||||
Logger.info(f' {index_count} | {i[2]}-{i[4]}-{i[6]}')
|
Logger.info(f' {index_count} | {i[2]}-{i[4]}-{i[6]}')
|
||||||
|
gui_log.insert(f' {index_count} | {i[2]}-{i[4]}-{i[6]}')
|
||||||
city = [index_count, i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9]]
|
city = [index_count, i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9]]
|
||||||
index_count += 1
|
index_count += 1
|
||||||
city_list.append(city)
|
city_list.append(city)
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ from core.language import Language
|
|||||||
from core.information import WeatherInfo
|
from core.information import WeatherInfo
|
||||||
from core.read_config import read_config
|
from core.read_config import read_config
|
||||||
from lib.hitokoto import hitokoto
|
from lib.hitokoto import hitokoto
|
||||||
|
from lib.buildGUIClass import InsertLog
|
||||||
|
|
||||||
|
gui_log = InsertLog()
|
||||||
|
|
||||||
|
|
||||||
class Mail:
|
class Mail:
|
||||||
@@ -209,8 +212,10 @@ class Mail:
|
|||||||
self.smtp.login(self.sender, self.password) # 登录
|
self.smtp.login(self.sender, self.password) # 登录
|
||||||
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
|
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
|
||||||
Logger.info(f'{self.language["mail_succeed"]}')
|
Logger.info(f'{self.language["mail_succeed"]}')
|
||||||
|
gui_log.insert(f'{self.language["mail_succeed"]}')
|
||||||
except smtplib.SMTPException as e: # 处理错误
|
except smtplib.SMTPException as e: # 处理错误
|
||||||
Logger.critical(f'{self.language["mail_error"]}: {e}')
|
Logger.critical(f'{self.language["mail_error"]}: {e}')
|
||||||
|
gui_log.insert(f'{self.language["mail_error"]}: {e}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def free_version(self):
|
def free_version(self):
|
||||||
@@ -356,8 +361,10 @@ class Mail:
|
|||||||
self.smtp.login(self.sender, self.password) # 登录
|
self.smtp.login(self.sender, self.password) # 登录
|
||||||
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
|
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
|
||||||
Logger.info(f'{self.language["mail_succeed"]}')
|
Logger.info(f'{self.language["mail_succeed"]}')
|
||||||
|
Logger.info(f'{self.language["mail_succeed"]}')
|
||||||
except smtplib.SMTPException as e: # 处理错误
|
except smtplib.SMTPException as e: # 处理错误
|
||||||
Logger.critical(f'{self.language["mail_error"]}: {e}')
|
Logger.critical(f'{self.language["mail_error"]}: {e}')
|
||||||
|
gui_log.insert(f'{self.language["mail_error"]}: {e}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def warning_(self):
|
def warning_(self):
|
||||||
@@ -379,11 +386,14 @@ class Mail:
|
|||||||
case 'update':
|
case 'update':
|
||||||
status = '预警更新'
|
status = '预警更新'
|
||||||
Logger.info(f'{self.language["new_warning"]}')
|
Logger.info(f'{self.language["new_warning"]}')
|
||||||
|
gui_log.insert(f'{self.language["new_warning"]}')
|
||||||
case 'active':
|
case 'active':
|
||||||
status = '已有灾害'
|
status = '已有灾害'
|
||||||
Logger.info(f'{self.language["warning_updated"]}')
|
Logger.info(f'{self.language["warning_updated"]}')
|
||||||
|
gui_log.insert(f'{self.language["warning_updated"]}')
|
||||||
case 'cancel':
|
case 'cancel':
|
||||||
Logger.info(f'{self.language["warning_canceled"]}')
|
Logger.info(f'{self.language["warning_canceled"]}')
|
||||||
|
gui_log.insert(f'{self.language["warning_canceled"]}')
|
||||||
|
|
||||||
mail_html = f"""
|
mail_html = f"""
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@@ -434,6 +444,8 @@ class Mail:
|
|||||||
self.smtp.login(self.sender, self.password) # 登录
|
self.smtp.login(self.sender, self.password) # 登录
|
||||||
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
|
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
|
||||||
Logger.info(f'{self.language["mail_succeed"]}')
|
Logger.info(f'{self.language["mail_succeed"]}')
|
||||||
|
gui_log.insert(f'{self.language["mail_succeed"]}')
|
||||||
except smtplib.SMTPException as e: # 处理错误
|
except smtplib.SMTPException as e: # 处理错误
|
||||||
Logger.critical(f'{self.language["mail_error"]}: {e}')
|
Logger.critical(f'{self.language["mail_error"]}: {e}')
|
||||||
|
gui_log.insert(f'{self.language["mail_error"]}: {e}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
@@ -11,7 +11,13 @@ import getpass
|
|||||||
from core.logger import Logger
|
from core.logger import Logger
|
||||||
from core.language import Language
|
from core.language import Language
|
||||||
from core.read_excel import read_excel
|
from core.read_excel import read_excel
|
||||||
|
from core.read_config import read_config
|
||||||
from ruamel.yaml import YAML
|
from ruamel.yaml import YAML
|
||||||
|
from lib.buildGUIClass import InsertLog
|
||||||
|
from lib.buildGUIClass import var_command
|
||||||
|
|
||||||
|
gui_log = InsertLog()
|
||||||
|
gui = read_config()[2]['enable-GUI']
|
||||||
|
|
||||||
|
|
||||||
def change_settings():
|
def change_settings():
|
||||||
@@ -22,8 +28,11 @@ def change_settings():
|
|||||||
language = Language()
|
language = Language()
|
||||||
|
|
||||||
Logger.info(f'[Modify]{language["change_setting"]}')
|
Logger.info(f'[Modify]{language["change_setting"]}')
|
||||||
|
gui_log.insert(f'[Modify]{language["change_setting"]}')
|
||||||
Logger.info(f'[Modify]{language["fill_the_config"]}')
|
Logger.info(f'[Modify]{language["fill_the_config"]}')
|
||||||
|
gui_log.insert(f'[Modify]{language["fill_the_config"]}')
|
||||||
Logger.info(f'[Modify]{language["input_a_city_name"]}')
|
Logger.info(f'[Modify]{language["input_a_city_name"]}')
|
||||||
|
gui_log.insert(f'[Modify]{language["input_a_city_name"]}')
|
||||||
while True:
|
while True:
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
city_name = input('-->')
|
city_name = input('-->')
|
||||||
@@ -38,17 +47,24 @@ def change_settings():
|
|||||||
break
|
break
|
||||||
searched_city = read_excel(city_name)
|
searched_city = read_excel(city_name)
|
||||||
Logger.info(f'[Modify]{language["user_input"]}:[{city_name}]')
|
Logger.info(f'[Modify]{language["user_input"]}:[{city_name}]')
|
||||||
|
gui_log.insert(f'[Modify]{language["user_input"]}:[{city_name}]')
|
||||||
Logger.info(f'[Modify]{language["select_a_index"]}')
|
Logger.info(f'[Modify]{language["select_a_index"]}')
|
||||||
|
gui_log.insert(f'[Modify]{language["select_a_index"]}')
|
||||||
if not searched_city:
|
if not searched_city:
|
||||||
Logger.error(f'[Modify]{language["no_result"]}')
|
Logger.error(f'[Modify]{language["no_result"]}')
|
||||||
|
gui_log.insert(f'[Modify]{language["no_result"]}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
|
# if not gui:
|
||||||
user_input = input('-->')
|
user_input = input('-->')
|
||||||
|
# else:
|
||||||
|
# user_input = var_command.get()
|
||||||
if user_input == 'q':
|
if user_input == 'q':
|
||||||
Logger.info(f'[Exit]{language["exit"]}')
|
Logger.info(f'[Exit]{language["exit"]}')
|
||||||
|
gui_log.insert(f'[Exit]{language["exit"]}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
index = searched_city[int(user_input)]
|
index = searched_city[int(user_input)]
|
||||||
with open('./config.yml', 'r', encoding='utf-8') as of:
|
with open('./config.yml', 'r', encoding='utf-8') as of:
|
||||||
@@ -60,11 +76,15 @@ def change_settings():
|
|||||||
with open('./config.yml', 'w', encoding='utf-8') as wf:
|
with open('./config.yml', 'w', encoding='utf-8') as wf:
|
||||||
YAML().dump(data, wf)
|
YAML().dump(data, wf)
|
||||||
Logger.info(f'[Write]{language["write_successfully"]}:config.yml')
|
Logger.info(f'[Write]{language["write_successfully"]}:config.yml')
|
||||||
|
gui_log.insert(f'[Write]{language["write_successfully"]}:config.yml')
|
||||||
break
|
break
|
||||||
except (IndexError, ValueError) as e:
|
except (IndexError, ValueError) as e:
|
||||||
Logger.info(e)
|
Logger.info(e)
|
||||||
|
gui_log.insert(e)
|
||||||
Logger.error(f'[Write]{language["input_type_error"]}')
|
Logger.error(f'[Write]{language["input_type_error"]}')
|
||||||
|
gui_log.insert(f'[Write]{language["input_type_error"]}')
|
||||||
continue
|
continue
|
||||||
finally:
|
finally:
|
||||||
Logger.info(f'[Exit]{language["exit"]}')
|
Logger.info(f'[Exit]{language["exit"]}')
|
||||||
|
gui_log.insert(f'[Exit]{language["exit"]}')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|||||||
58
lib/buildGUIClass.py
Normal file
58
lib/buildGUIClass.py
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -- coding:utf-8 --
|
||||||
|
# @Author: markushammered@gmail.com
|
||||||
|
# @Development Tool: PyCharm
|
||||||
|
# @Create Time: 2022/1/9
|
||||||
|
# @File Name: buildGUIClass.py
|
||||||
|
import tkinter
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
root = tk.Tk()
|
||||||
|
root.title('QWeather client')
|
||||||
|
sw = root.winfo_screenwidth()
|
||||||
|
sh = root.winfo_screenheight()
|
||||||
|
ww = 700
|
||||||
|
wh = 490
|
||||||
|
x = (sw - ww) / 2
|
||||||
|
y = (sh - wh) / 2
|
||||||
|
root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
|
||||||
|
root.minsize(700, 490)
|
||||||
|
root.maxsize(700, 490)
|
||||||
|
|
||||||
|
log_label = tk.Label(root, text='Log information')
|
||||||
|
log_label.place(x=170, y=4)
|
||||||
|
log_text = tk.Text(root, width=55, height=15)
|
||||||
|
log_text.place(x=30, y=30)
|
||||||
|
var_command = tk.StringVar()
|
||||||
|
|
||||||
|
|
||||||
|
class InsertLog:
|
||||||
|
def __init__(self):
|
||||||
|
self.log_text = log_text
|
||||||
|
|
||||||
|
def insert(self, msg: str):
|
||||||
|
"""
|
||||||
|
insert the information to gui(Text)
|
||||||
|
:param msg: information
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if '\n' not in msg:
|
||||||
|
msg = msg + '\n'
|
||||||
|
self.log_text.configure(state=tkinter.NORMAL) # writable
|
||||||
|
self.log_text.insert('insert', msg) # insert information
|
||||||
|
self.log_text.configure(state=tkinter.DISABLED) # readable
|
||||||
|
|
||||||
|
|
||||||
|
class Features:
|
||||||
|
def __init__(self):
|
||||||
|
self.root = root
|
||||||
|
self.tk = tk
|
||||||
|
self.log_text = log_text
|
||||||
|
|
||||||
|
def quit_(self):
|
||||||
|
"""
|
||||||
|
quit gui
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self.root.destroy()
|
||||||
|
self.root.quit()
|
||||||
@@ -12,11 +12,18 @@ from core.logger import Logger
|
|||||||
from core.read_config import read_config
|
from core.read_config import read_config
|
||||||
from core.information import WeatherInfo
|
from core.information import WeatherInfo
|
||||||
from core.language import Language
|
from core.language import Language
|
||||||
|
from lib.buildGUIClass import InsertLog
|
||||||
|
|
||||||
|
gui_log = InsertLog()
|
||||||
|
|
||||||
|
try:
|
||||||
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
server.bind(('127.0.0.1', 7898))
|
server.bind(('0.0.0.0', 7898))
|
||||||
server.listen(5)
|
server.listen(5)
|
||||||
|
except OSError as e:
|
||||||
|
Logger.critical(e)
|
||||||
|
gui_log.insert(e)
|
||||||
|
|
||||||
language = Language()
|
language = Language()
|
||||||
|
|
||||||
@@ -305,22 +312,23 @@ def process_requests(c, a):
|
|||||||
try:
|
try:
|
||||||
data = str(c.recv(1024)).split(':')[0][6:][:-17]
|
data = str(c.recv(1024)).split(':')[0][6:][:-17]
|
||||||
html = build_html()
|
html = build_html()
|
||||||
if data == '/' or '': # 判断用户请求的目标是否为根目录, 如果是则返回html; 如果不是则继续判断
|
if data == '/': # 判断用户请求的目标是否为根目录, 如果是则返回html; 如果不是则继续判断
|
||||||
c.sendto('HTTP1.1/ 200 OK\r\n\r\n'.encode('utf-8'), a)
|
c.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8'))
|
||||||
c.sendto(html.encode('utf-8'), a)
|
c.send(html.encode('utf-8'))
|
||||||
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
|
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
|
||||||
else: # 继续判断用户请求的文件是否存在
|
gui_log.insert(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
|
||||||
try:
|
try:
|
||||||
with open(f'.{data}', 'rb') as f:
|
with open(f'./{data}', 'rb') as f:
|
||||||
c.sendto('HTTP1.1/ 200 OK\r\n\r\n'.encode('utf-8'), a)
|
c.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8'))
|
||||||
c.sendto(f.read(), a)
|
c.send(f.read())
|
||||||
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
|
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
|
||||||
|
gui_log.insert(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
c.sendto(f'HTTP1.1/ 404 Not Found\r\n\r\n{html}'.encode('utf-8'), a)
|
with open('./res/basic-resources/404.html', 'r') as not_found:
|
||||||
|
c.send(f'HTTP/1.1 404 Not Found\r\n\r\n{not_found.read()}'.encode('utf-8'))
|
||||||
except BrokenPipeError:
|
except BrokenPipeError:
|
||||||
Logger.error(f'{language["connection_speed_too_fast"]}')
|
Logger.error(f'{language["connection_speed_too_fast"]}')
|
||||||
except IOError:
|
gui_log.insert(f'{language["connection_speed_too_fast"]}')
|
||||||
Logger.error(f'{language["an_io_error"]}')
|
|
||||||
finally:
|
finally:
|
||||||
c.close()
|
c.close()
|
||||||
return
|
return
|
||||||
|
|||||||
10
res/basic-resources/404.html
Normal file
10
res/basic-resources/404.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>QWeather|网页查看天气服务</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<i><b><p style="text-align: center; color: red">404 File Not Found</p></b></i>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -34,7 +34,6 @@
|
|||||||
"exit": "Exited.",
|
"exit": "Exited.",
|
||||||
"webservice_ip": "Local webservice ip",
|
"webservice_ip": "Local webservice ip",
|
||||||
"connection_speed_too_fast": "Connection speed is too fast",
|
"connection_speed_too_fast": "Connection speed is too fast",
|
||||||
"an_io_error": "An IO error.",
|
|
||||||
"noname": "No name.",
|
"noname": "No name.",
|
||||||
"hitokoto": "Get hitokoto successfully.",
|
"hitokoto": "Get hitokoto successfully.",
|
||||||
"get_resource": "Get resource",
|
"get_resource": "Get resource",
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
"exit": "已退出",
|
"exit": "已退出",
|
||||||
"webservice_ip": "webservice地址",
|
"webservice_ip": "webservice地址",
|
||||||
"connection_speed_too_fast": "连接速度过快",
|
"connection_speed_too_fast": "连接速度过快",
|
||||||
"an_io_error": "一个IO错误",
|
|
||||||
"noname": "佚名",
|
"noname": "佚名",
|
||||||
"hitokoto": "一言获取成功",
|
"hitokoto": "一言获取成功",
|
||||||
"get_resource": "获取资源",
|
"get_resource": "获取资源",
|
||||||
|
|||||||
Reference in New Issue
Block a user