做個課程表吧(二)


我們想要根據當前第幾周顯示課程表。

確認當前時間

初始化時間

首先我們要確認一個學期的開始。我們設置一個日期。如果這個日期是星期天那麼他就是一個學期的開始,如果不是,那麼就變更這一天到最近的週日。

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"])

輸出結果爲

可以看到,有的課程分單雙週,所以要分別加以判斷。

具體做法是,

  1. 判斷“單”、“雙”是否在字符串裏,如果在的話,先剔除“周(單)”、“周(雙)”,不在的話直接剔除“周”。
  2. 用“-”把字符串分隔開,取第一個爲開始周,最後一個爲結束周(因爲開始周結束周可能是同一個!)。判斷當前周是否在開始周於結束周之內。
  3. 如果是單雙週的話還要判斷除以二的餘數。
	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()  # 進入消息循環
發佈了8 篇原創文章 · 獲贊 0 · 訪問量 1688
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章