做个课程表吧(二)

文章目录

  • 确认当前时间
    • 初始化时间
    • 计算当前周数
  • 绘制当前周
    • 判断是否是当前周的课程
    • 放置文本控件
  • 全部代码

我们想要根据当前第几周显示课程表。

确认当前时间

初始化时间

首先我们要确认一个学期的开始。我们设置一个日期。如果这个日期是星期天那么他就是一个学期的开始,如果不是,那么就变更这一天到最近的周日。

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张图片

可以看到,有的课程分单双周,所以要分别加以判断。

具体做法是,

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

输出结果为

做个课程表吧(二)_第2张图片

那么我们就首先根据“-”把文本分隔开,然后取第一个和最后一个的数据,第一个数据确认了这节课所处的位置的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()  # 进入消息循环

最后的结果为

做个课程表吧(二)_第3张图片

全部代码

# -*- 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()  # 进入消息循环

你可能感兴趣的:(python)