您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何基于Python繪制一個摸魚倒計時界面,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先要知道、除了靜態文字之外的比如當前日期、距離節日放假的天數等都是動態返回的,我需要使用 Jinja2 模板進行動態綁定。
我應該把重點放在時間的處理上。
而且在這個模板中,有陽歷的節日,也是陰歷的節日,我需要轉換。
初始化一個 FastAPI 對象并聲明靜態頁面的模板目錄 (Jinja2Templates)
# -*- coding: utf-8 -*- import datetime from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from zhdate import ZhDate as lunar_date app = FastAPI( debug=False, title="My API", docs_url="/docs", openapi_url=f"/openapi.json" ) templates = Jinja2Templates(directory="templates")
可以看到的是我用到了 zhdate 這個庫、主要用于陰歷和陽歷之間的相互轉換。用法如下
today = datetime.date.today() print(today.year, today.month, today.day) print("大年時間: ", lunar_date(today.year+1, 1, 1).to_datetime().date()) print("端午時間: ", lunar_date(today.year, 5, 5).to_datetime().date()) print("中秋時間: ", lunar_date(today.year, 8, 15).to_datetime().date()) print("元旦時間: ", f"{today.year+1}-01-01") print("清明時間: ", f"{today.year}-04-05") print("勞動時間: ", f"{today.year}-05-01") print("國慶時間: ", f"{today.year}-10-01")
我們可以梳理一下:
計算距離 大年、元旦 的天數時,要在年份上 +1
計算距離 其他節日 的天數時,要判斷天數差是否小于 0,如果是,則年份需要 +1,因為已經過去的節日對此沒有意義
distance_big_year = (lunar_date(today.year + 1, 1, 1).to_datetime().date() - today).days distance_5_5 = (lunar_date(today.year, 5, 5).to_datetime().date() - today).days distance_5_5 = distance_5_5 if distance_5_5 > 0 else ( lunar_date(today.year + 1, 5, 5).to_datetime().date() - today).days distance_8_15 = (lunar_date(today.year, 8, 15).to_datetime().date() - today).days distance_8_15 = distance_8_15 if distance_8_15 > 0 else ( lunar_date(today.year + 1, 8, 15).to_datetime().date() - today).days distance_year = (datetime.datetime.strptime(f"{today.year + 1}-01-01", "%Y-%m-%d").date() - today).days distance_4_5 = (datetime.datetime.strptime(f"{today.year}-04-05", "%Y-%m-%d").date() - today).days distance_4_5 = distance_4_5 if distance_4_5 > 0 else ( datetime.datetime.strptime(f"{today.year + 1}-04-05", "%Y-%m-%d").date() - today).days distance_5_1 = (datetime.datetime.strptime(f"{today.year}-05-01", "%Y-%m-%d").date() - today).days distance_5_1 = distance_5_1 if distance_5_1 > 0 else ( datetime.datetime.strptime(f"{today.year + 1}-05-01", "%Y-%m-%d").date() - today).days distance_10_1 = (datetime.datetime.strptime(f"{today.year}-10-01", "%Y-%m-%d").date() - today).days distance_10_1 = distance_10_1 if distance_10_1 > 0 else ( datetime.datetime.strptime(f"{today.year + 1}-10-01", "%Y-%m-%d").date() - today).days
怎么樣? 我的命名足夠瘋狂吧。
接下來需要計算一下距離周末的天數。
def get_week_day(date): week_day_dict = { 0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五', 5: '星期六', 6: '星期天', } day = date.weekday() return week_day_dict[day] week_day_ = get_week_day(today) print(f"今天是: {week_day_}") # 先獲取今天是星期幾
按照每周 5 個工作日計算,今天距離周末的天數就是
5 - today.weekday() # today.weekday() 今天距離周末
現在將所有的數據組裝起來
time_ = [ {"v_": distance_year, "title": "元旦"}, # 距離元旦 {"v_": distance_big_year, "title": "過年"}, # 距離過年 {"v_": distance_4_5, "title": "清明節"}, # 距離清明 {"v_": distance_5_1, "title": "勞動節"}, # 距離勞動 {"v_": distance_5_5, "title": "端午節"}, # 距離端午 {"v_": distance_8_15, "title": "中秋節"}, # 距離中秋 {"v_": distance_10_1, "title": "國慶節"}, # 距離國慶 ]
至于為什么是 List 而不是 Dict,那是我需要做一個根據距離天數的排序,讓最先放假的節日放于最前面, 這樣看起來會舒服得多。
time_ = sorted(time_, key=lambda x: x['v_'], reverse=False)
接下來要寫一個 路由,將數據傳入到 html 頁面中去。
@app.get("/", response_class=HTMLResponse) async def readme(request: Request): return templates.TemplateResponse("readme.html", {"request": request, "time_": time_, "now_": now_, "week_day_": week_day_})
來看一下完整的代碼 (main.py):
# -*- coding: utf-8 -*- import datetime from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from zhdate import ZhDate as lunar_date app = FastAPI( debug=False, title="My API", docs_url=f"/docs", openapi_url=f"/openapi.json" ) templates = Jinja2Templates(directory="templates") today = datetime.date.today() # print(today.year, today.month, today.day) # print("大年時間: ", lunar_date(today.year+1, 1, 1).to_datetime().date()) # print("端午時間: ", lunar_date(today.year, 5, 5).to_datetime().date()) # print("中秋時間: ", lunar_date(today.year, 8, 15).to_datetime().date()) # print("元旦時間: ", f"{today.year+1}-01-01") # print("清明時間: ", f"{today.year+1}-04-05") # print("勞動時間: ", f"{today.year+1}-05-01") # print("國慶時間: ", f"{today.year+1}-10-01") distance_big_year = (lunar_date(today.year + 1, 1, 1).to_datetime().date() - today).days distance_5_5 = (lunar_date(today.year, 5, 5).to_datetime().date() - today).days distance_5_5 = distance_5_5 if distance_5_5 > 0 else ( lunar_date(today.year + 1, 5, 5).to_datetime().date() - today).days distance_8_15 = (lunar_date(today.year, 8, 15).to_datetime().date() - today).days distance_8_15 = distance_8_15 if distance_8_15 > 0 else ( lunar_date(today.year + 1, 8, 15).to_datetime().date() - today).days distance_year = (datetime.datetime.strptime(f"{today.year + 1}-01-01", "%Y-%m-%d").date() - today).days distance_4_5 = (datetime.datetime.strptime(f"{today.year}-04-05", "%Y-%m-%d").date() - today).days distance_4_5 = distance_4_5 if distance_4_5 > 0 else ( datetime.datetime.strptime(f"{today.year + 1}-04-05", "%Y-%m-%d").date() - today).days distance_5_1 = (datetime.datetime.strptime(f"{today.year}-05-01", "%Y-%m-%d").date() - today).days distance_5_1 = distance_5_1 if distance_5_1 > 0 else ( datetime.datetime.strptime(f"{today.year + 1}-05-01", "%Y-%m-%d").date() - today).days distance_10_1 = (datetime.datetime.strptime(f"{today.year}-10-01", "%Y-%m-%d").date() - today).days distance_10_1 = distance_10_1 if distance_10_1 > 0 else ( datetime.datetime.strptime(f"{today.year + 1}-10-01", "%Y-%m-%d").date() - today).days def get_week_day(date): week_day_dict = { 0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五', 5: '星期六', 6: '星期天', } day = date.weekday() return week_day_dict[day] # print("距離大年: ", distance_big_year) # print("距離端午: ", distance_5_5) # print("距離中秋: ", distance_8_15) # print("距離元旦: ", distance_year) # print("距離清明: ", distance_4_5) # print("距離勞動: ", distance_5_1) # print("距離國慶: ", distance_10_1) # print("距離周末: ", 5 - today.weekday()) now_ = f"{today.year}年{today.month}月{today.day}日" week_day_ = get_week_day(today) time_ = [ {"v_": 5 - 1 - today.weekday(), "title": "周末"}, # 距離周末 {"v_": distance_year, "title": "元旦"}, # 距離元旦 {"v_": distance_big_year, "title": "過年"}, # 距離過年 {"v_": distance_4_5, "title": "清明節"}, # 距離清明 {"v_": distance_5_1, "title": "勞動節"}, # 距離勞動 {"v_": distance_5_5, "title": "端午節"}, # 距離端午 {"v_": distance_8_15, "title": "中秋節"}, # 距離中秋 {"v_": distance_10_1, "title": "國慶節"}, # 距離國慶 ] time_ = sorted(time_, key=lambda x: x['v_'], reverse=False) @app.get("/", response_class=HTMLResponse) async def readme(request: Request): return templates.TemplateResponse("readme.html", {"request": request, "time_": time_, "now_": now_, "week_day_": week_day_}) if __name__ == '__main__': import uvicorn uvicorn.run(app='main:app', host="0.0.0.0", port=8080, reload=True)
最后就到了 html 頁面部分了,來看一下主要的傳值。
<center> 【摸魚辦公室】今天是 {{ now_ }} {{ week_day_ }} <br><br> {% for v_ in time_ %} <p>???? 距離 {{ v_.title }} 放假還有 {{ v_.v_ }} 天</p> {% else %} <p>沒有任何值</p> {% endfor %} </center>
這樣整個的路由構造和頁面編寫就算是完成了。
最后通過 Nginx 部署到我的站點上。
關于“如何基于Python繪制一個摸魚倒計時界面”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。