做个课程表吧(三)
事實上前兩個版本的界面還是不能讓人滿意,接下來我們來用pygame來為課程表優化界面吧。
文章目錄
- 保存課程表數據
- 繪制課程表
- 初始化窗口
- 繪制課程表的背景
- 繪制課程表小格子
- 定義課程格子類
- 判斷課程是否符合條件
- 繪制小格子
- 繪制屏幕
保存課程表數據
我們把數據保存在外部文件上,方便多次修改于調用。
用data.json來保存開始的時間,和數據中保存數據中保存名字、周等的鍵名。
{"start": [2020, 2, 20],"book": {"name":"kcmc","teacher":"xm","week": "zcd","part": "jcor","weekday": "xqjmc","address": "cdmc"} }用class.json保存課程數據,這樣在不同的更新課表后不用修改代碼直接修改課程文件即可。
然后打開這兩個文件,并轉化為json。
# 用外部文件來保存鍵值對 with open("data.json", "r") as f:init = json.loads(f.read())# 保存課程數據 with open("class.json", "rb") as f:class_js = f.read()js = json.loads(class_js) # 轉化為json繪制課程表
初始化窗口
定義一個970*720的窗口大小,將屏幕填充為白色。設置標題為課程表。
pygame.init() screen = pygame.display.set_mode([970, 720]) screen.fill([255, 255, 255]) pygame.display.set_caption("課程表")繪制課程表的背景
課程表的背景有
一條條顏色漸變的方塊(區分不同節課)
一塊顯示當前星期幾的方塊
在最上面顯示星期
顯示的結果為:
繪制課程表小格子
定義課程格子類
課程的小格子根據課程時間長短確認
定義一個課程格子類
其中輸入為:
課程格子的顏色隨機,文本根據換行符排列。
最后用一個精靈組來保存每個課程格子。
# 課程表里的每個格子 class Class_list(pygame.sprite.Sprite):def __init__(self, text, weekday, start, end):# 繼承super().__init__()# 分割文本self.text = text.split("\n")self.weekday = weekday# 設置控件的大小self.image = pygame.Surface((125, 80*(end-start)))self.r, self.g, self.b = random.randint(0, 254), random.randint(0, 254), random.randint(0, 254)self.image.fill([self.r, self.g, self.b])self.image.set_alpha(200) # 透明化# 設置控件的位置self.rect = pygame.Rect((130*weekday + 55, 45*start), self.image.get_size())# 繪制字體self.font()def font(self):# 定義一個字體my_font = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", 15)# 如果背景為淺色則前景為深色if 0.21 * self.r + 0.72 * self.g + 0.07 * self.b > 200:color = [0, 0, 0]else:color = [255, 255, 255]n = 0# 每行打印一句話for i in self.text:text = my_font.render(i, True, color, [self.r, self.g, self.b])self.image.blit(text, (0, n*20))n += 1 class_box = pygame.sprite.Group()判斷課程是否符合條件
同上一篇博客。
for course in js["kbList"]:scr = "{}\n講師 {}\n周 {}\n地點 {}".format(course[key["name"]], course[key["teacher"]], course[key["week"]], course[key["address"]])week = course[key["week"]]# 判斷課程是否是單雙周的課程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: # 判斷該課程是否是當前周的課程# 根據節來優化顯示效果read_class(course, key)繪制小格子
如果判斷正確,就繪制課程小格子。輸入的內容為課程的數據。
def read_class(course):scr = "{}\n講師 {}\n周 {}\n地點 {}".format(course[key["name"]], course[key["teacher"]], course[key["week"]], course[key["address"]]) # 要顯示的課程信息part = course[key["part"]]part = part.split("-")start_part, end_part = eval(part[0]), eval(part[-1])# 確認文本的位置x = weekday.index(course[key["weekday"]])li = Class_list(scr, x, start_part, end_part)class_box.add(li)繪制屏幕
把課程格子繪制在屏幕上,最后更新屏幕。
class_box.draw(screen) pygame.display.update() while True:for event in pygame.event.get():if event.type == pygame.QUIT:# 退出游戲pygame.quit()break最后的顯示效果為:
我們的課程表就做好啦!
總結
- 上一篇: 日常提醒(delphi源码)
- 下一篇: 冰河木马简易使用 ——病毒木马 003