我們想要根據當前第幾周顯示課程表。
確認當前時間
初始化時間
首先我們要確認一個學期的開始。我們設置一個日期。如果這個日期是星期天那麼他就是一個學期的開始,如果不是,那麼就變更這一天到最近的週日。
import datetime
# 確認開始的日期 年/月/日
init_year = 2020
init_mouth = 2
init_day = 20
# 如果開始的一天不是週日,則將開始的日期變爲週日
if not datetime.datetime(init_year, init_mouth, init_day).strftime("%w") == 0:
init_day -= eval(datetime.datetime(init_year, init_mouth, init_day).strftime("%w"))
計算當前週數
計算當前日期於初始化時間直接差了多少天,然後除以7取餘。結果從一開始,在weeks上面加個1.
# 初始化的時間
init_date = datetime.datetime(init_year, init_mouth, init_day)
# 現在的時間
now_date = datetime.datetime.today()
# 間隔的天數
days = (now_date - init_date).days
# 間隔的週數,第一週爲1
weeks = int(days / 7) + 1
繪製當前周
判斷是否是當前周的課程
首先我們打印下保存週數據的字符串
print(course["zcd"])
輸出結果爲
可以看到,有的課程分單雙週,所以要分別加以判斷。
具體做法是,
- 判斷“單”、“雙”是否在字符串裏,如果在的話,先剔除“周(單)”、“周(雙)”,不在的話直接剔除“周”。
- 用“-”把字符串分隔開,取第一個爲開始周,最後一個爲結束周(因爲開始周結束周可能是同一個!)。判斷當前周是否在開始周於結束周之內。
- 如果是單雙週的話還要判斷除以二的餘數。
week = course["zcd"]
# 判斷課程是否是單雙週的課程
if "單" in week:
week = week.replace("周(單)", "")
week = week.split("-")
# 開始周/結束周
start_week, end_week = eval(week[0]), eval(week[-1])
if weeks % 2 == 1: # 判斷是否是單週
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
[放置文本控件]
elif "雙" in week:
week = week.replace("周(雙)", "")
week = week.split("-")
# 開始周/結束周
start_week, end_week = eval(week[0]), eval(week[-1])
if weeks % 2 == 0: # 判斷是否是雙週
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
[放置文本控件]
else:
week = week.replace("周", "")
week = week.split("-")
# 開始周/結束周
start_week, end_week = eval(week[0]), eval(week[-1])
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
[放置文本控件]
以上判斷都成立後就可以放置文本控件了。
放置文本控件
首先我們輸出一下保存節數的字符串。
print(course["jcor"])
輸出結果爲
那麼我們就首先根據“-”把文本分隔開,然後取第一個和最後一個的數據,第一個數據確認了這節課所處的位置的y軸(一天的課不可能重疊),然後用星期來確認x軸
# 根據節來優化顯示效果
part = course["jcor"]
part = part.split("-")
start_part, end_part = eval(part[0]), eval(part[-1])
# 確認文本的位置
x = weekday.index(course["xqjmc"])
text = Text(top, width=30, height=3 * (end_part - start_part + 1)) # 創建一個文本控件
text.place(x=x * 215 + 10, y=start_part * 40 + 20) # 在屏幕上放置文本控件
text.insert(INSERT, scr) # 在控件上放置文本
最後進入消息循環。
top.mainloop() # 進入消息循環
最後的結果爲
全部代碼
# -*- coding:GBK -*- # 文件編碼
import datetime
import json
from tkinter import *
# 確認開始的日期 年/月/日
init_year = 2020
init_mouth = 2
init_day = 20
# 如果開始的一天不是週日,則將開始的日期變爲週日
if not datetime.datetime(init_year, init_mouth, init_day).strftime("%w") == 0:
init_day -= eval(datetime.datetime(init_year, init_mouth, init_day).strftime("%w"))
# 初始化的時間
init_date = datetime.datetime(init_year, init_mouth, init_day)
# 現在的時間
now_date = datetime.datetime.today()
# 間隔的天數
days = (now_date - init_date).days
# 間隔的週數,第一週爲1
weeks = int(days / 7) + 1
class_js = '''[數據]'''
js = json.loads(class_js) # 轉化爲json
weekday = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
y = {}
top = Tk() # 創建一個窗體
top.geometry("1100x600+200+50") # 改變窗體的大小
for course in js["kbList"]:
scr = "課程名:\n{}\n講師:{}\n周:{}\n節:{}".format(
course["kcmc"], course["xm"], course["zcd"], course["jcor"])
week = course["zcd"]
# 判斷課程是否是單雙週的課程
if "單" in week:
week = week.replace("周(單)", "")
week = week.split("-")
# 開始周/結束周
start_week, end_week = eval(week[0]), eval(week[-1])
if weeks % 2 == 1: # 判斷是否是單週
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
# 根據節來優化顯示效果
part = course["jcor"]
part = part.split("-")
start_part, end_part = eval(part[0]), eval(part[-1])
# 確認文本的位置
x = weekday.index(course["xqjmc"])
text = Text(top, width=30, height=3 * (end_part - start_part + 1)) # 創建一個文本控件
text.place(x=x * 215 + 10, y=start_part * 40 + 20) # 在屏幕上放置文本控件
text.insert(INSERT, scr) # 在控件上放置文本
elif "雙" in week:
week = week.replace("周(雙)", "")
week = week.split("-")
# 開始周/結束周
start_week, end_week = eval(week[0]), eval(week[-1])
if weeks % 2 == 0: # 判斷是否是雙週
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
# 根據節來優化顯示效果
part = course["jcor"]
part = part.split("-")
start_part, end_part = eval(part[0]), eval(part[-1])
# 確認文本的位置
x = weekday.index(course["xqjmc"])
text = Text(top, width=30, height=3 * (end_part - start_part + 1)) # 創建一個文本控件
text.place(x=x * 215 + 10, y=start_part * 40 + 20) # 在屏幕上放置文本控件
text.insert(INSERT, scr) # 在控件上放置文本
else:
week = week.replace("周", "")
week = week.split("-")
# 開始周/結束周
start_week, end_week = eval(week[0]), eval(week[-1])
if start_week <= weeks <= end_week: # 判斷該課程是否是當前周的課程
# 根據節來優化顯示效果
part = course["jcor"]
part = part.split("-")
start_part, end_part = eval(part[0]), eval(part[-1])
# 確認文本的位置
x = weekday.index(course["xqjmc"])
text = Text(top, width=30, height=3*(end_part - start_part +1)) # 創建一個文本控件
text.place(x=x * 215 + 10, y=start_part * 40 + 20) # 在屏幕上放置文本控件
text.insert(INSERT, scr) # 在控件上放置文本
top.mainloop() # 進入消息循環