全自动生成、设置课表壁纸【完结】
文章目錄
- 0、來由
- 1、設計、實現(xiàn)思路
- 1-1 課表數(shù)據(jù)文檔設計
- 1-2 解析獲取周課表
- 1-3 獲取當前周數(shù)
- 1-4 繪制周課表蒙版、合并背景壁紙
- 1-5 調(diào)用接口更換壁紙
- 1-6 設置定時任務
 
- 2、總結(jié)
- 2-1 用到的關(guān)鍵技術(shù)
- 2-2 不規(guī)范、不足之處、改進方向
 
0、來由
- 去官網(wǎng)查課表太慢太麻煩
- 在手機上留截圖看屏幕小(主要那段時間看電腦多)
- 電腦上存截圖也得找
- 那時候還沒發(fā)現(xiàn)小愛自帶的課表(也可能自動導入功能還沒有)
??于是,就有了這個想法,之前也實現(xiàn)過(P好每周的課表蒙版圖,存起來,然后寫個腳本把課表蒙版跟壁紙合并,然后調(diào)用接口更換壁紙)文章考古-點這里。但是P圖畢竟費時間,想要修改也比較費勁,也就自己折騰自己。
后來就有了新想法:
- 根據(jù)課表數(shù)據(jù),
- 自動繪制課表蒙版,
- 自動貼合背景,
- 自動換壁紙。
1、設計、實現(xiàn)思路
1-1 課表數(shù)據(jù)文檔設計
??將學期課表按一定規(guī)則,存儲為文本文件,然后程序讀取文件,根據(jù)當前時間與設定好的學期開始時間計算出當前周數(shù),并設置學期總周數(shù),超過則不顯示課表。
當時編程還不是很規(guī)范,許多配置參數(shù)都只寫死到代碼中,要修改都只能到代碼中找,很不方便。比如:
- 學期開始時間
- 總周數(shù)
- 壁紙文件夾路路徑
- 課表文件路徑
- 課表位置偏移量
- 。。。
其實,可將這些參數(shù),同課表數(shù)據(jù)一樣,抽離出來作為配置項,通過配置文件獲取,從而就大大方便了定制化。
學期課表中,需要存儲一些必要的信息項:
- 課程名稱。為了方便顯示,盡量簡寫
- 課程教室。
- 課程時間。也可以記錄為:當天的第幾節(jié)課
- 課程跨度。課程的開課周數(shù),如[1, 3-6, 10] 表示1周,3-6周,10周有課。
??根據(jù)上述這些信息,就可以完整提取出每一周的課表。根據(jù)一些實際情況,做出一些調(diào)整:將教室、課程簡寫合并為課程名稱;于是,設置一個wks的列表表示周數(shù),如wks[1:5]+wks[8:9] 表示: 1-4周+第8周。
 ??鑒于Python有個強悍的函數(shù)eval(),那就直接把學期課表按照Python列表的格式設計,讀取的時候直接對接就行;學期課表設計為一個含有五個元素的文檔,每個元素為存儲周一到周五中一天的課程信息;每個元素由六個列表單元構(gòu)成,表示一天中的六節(jié)課(上午、下午、晚上各兩節(jié));而每個最小單元,也就是每節(jié)課,是一個二元列表(或是元組),第一個元素是設計后的 課表名稱 如:B211大物,第二個元素為課程跨度,如:wks[1:5]+wks[8:9] 。
1-2 解析獲取周課表
??根據(jù)學期課表的設計,便可以逆向解析到周課表。大致思路為:獲取到學期課表列表后,循環(huán)遍歷五天的課表信息,再遍歷每天的課程信息,如果當前周數(shù)存在于當前課程跨度中,那么向周課表列表中加入該課程,否則置入空字符串表示沒課。最終得到周課表。
- 重要信息: - 當前周數(shù)
- 學期課表
 
1-3 獲取當前周數(shù)
先睡了,下次更新…
# 獲取周數(shù) # 傳入第一個周 周一的日期 # 返回:當前周數(shù) def get_imgid(start_time='2020 8 31'):#start_time = '2020 8 31'start = time.strptime(start_time, '%Y %m %d')start_days = int(time.strftime('%j', start))now_days = int(time.strftime('%j', time.localtime()))img_id = 1 + (now_days - start_days)//7return img_id1-4 繪制周課表蒙版、合并背景壁紙
生成課表蒙版+合并背景壁紙
# 制作、存儲壁紙 # 傳入本周課表、圖片路徑、輸出路徑 # 最終函數(shù)保存一課表圖片文件 def get_wap(now_cs, img_path, out_path):now_wk = op.split(out_path)[-1].split('周')[0][1:]path = img_pathdays = ['周一', '周二', '周三', '周四', '周五']times = ['1-2', '3-4', '午休', '5-6', '7-8', '晚']color = 'black' # 課顏色tim_color = 'crimson' # 節(jié)數(shù)顏色week_color = 'blueviolet' # 周N顏色wek_color = 'azure' # N周顏色color0 = 'lightgrey' # 矩形填充顏色ret_color = None # 矩形圖層顏色alpha = .6line_color = 'darkorange' # 豎線顏色xline_color = 'turquoise' # 橫線顏色width = 2 # 線寬font_size = 40 # 字體大小font = ImageFont.truetype(r'c:\windows\fonts\simkai.TTF', font_size)font1 = ImageFont.truetype(r'c:\windows\fonts\simkai.ttf', font_size+2) # 字體背景color1 = 'grey' # 字體背景顏色wx_font = ImageFont.truetype(r'c:\windows\fonts\simsun.ttc', 31) # 午休# 橫豎排間隔dy = (font_size*1.2)//1dx = (font_size*3.78)//1ddy = 35 # 控制整體上下移動dyy = 6 # 控制標題組上下移動# 打開圖片--轉(zhuǎn)為RGBA模式im = Image.open(path).convert('RGB')# 圓角矩形底色newi = Image.new('RGB', (1920, 1080))dd = ImageDraw.Draw(newi)x0, y0 = 4, 1080-(4*font_size+4*dy)-24 + ddy # 起始坐標 !!-1r = 34 # 圓角半徑w, h = 817, 1080-y0 # 矩形框尺寸'''Rounds''' # 四個角先畫4個圓dd.ellipse((x0, y0, x0 + r, y0 + r), fill=color0)dd.ellipse((x0 + w - r, y0, x0 + w, y0 + r), fill=color0)dd.ellipse((x0, y0 + h - r, x0 + r, y0 + h), fill=color0)dd.ellipse((x0 + w - r, y0 + h - r, x0 + w, y0 + h), fill=color0)'''rec.s''' # 兩個方框相切dd.rectangle((x0 + r / 2, y0, x0 + w - (r / 2), y0 + h), fill=color0)dd.rectangle((x0, y0 + r / 2, x0 + w, y0 + h - (r / 2)), fill=color0)# 遮罩, alpha 透明度調(diào)節(jié)im1 = Image.blend(newi, im, alpha=alpha)im.close()newi.close()# 獲得帶有底矩形框的背景 draw/imdraw = ImageDraw.Draw(im1)# '第幾周' 字樣繪制draw.text((x0+w//2.5, y0+8-dyy), f'第{now_wk}周', font=font, fill=wek_color)draw.line((x0, y0+dy-dyy, w+x0, y0+dy-dyy), fill='gold', width=width+1)# 課程 時間點 繪制 節(jié)數(shù)xx, yy = x0+3, 1080-(4*font_size+3*dy)+25 + ddy # 節(jié)數(shù)起始坐標 !!-2draw.line((xx + font_size*1.82//1-4, yy-4, w+x0, yy-4), fill=xline_color, width=width) # 分割線 周下邊for tim in times:if tim == '午休':# 先獲取午休兩線的坐標參數(shù) --先不畫wx_y1, wx_y2 = yy+6, yy+dy-22draw.text((x0, yy+2), tim, font=wx_font, fill='lawngreen')else:if tim=='晚':draw.text((xx+10, yy-12), tim, font=font, fill=tim_color)else:draw.text((xx, yy), tim, font=font, fill=tim_color)if tim != '3-4' and tim != '晚':# 橫線draw.line((xx + font_size*1.82//1-4, yy+dy-8, w+x0, yy+dy-8), fill=xline_color, width=2)if times.index(tim) == 2 or times.index(tim) == 1:yy += dy-15else:yy += dy# 課表內(nèi)容繪制+周Nx = xx + font_size*1.82//1 # 周+課 起始坐標 !!-3day = 0for i_cls in now_cs:y = 1080-(4*font_size+4*dy)+25 + ddy # 周+課 起始坐標 !!-3draw.text((x + 30, y), days[day], font=font1, fill=color1) # 星期draw.text((x+30, y), days[day], font=font, fill=week_color) # 星期day += 1# 豎線draw.line((x-.045*dx//1, y+30, x-.045*dx//1, y+h-64), fill=line_color, width=width)cnt = 0for cl in i_cls:if cnt == 2 or cnt == 3:y += dy - 15elif cnt == 5:y += dy - 10else:y += dyif cl:draw.text((x-2, y-1), cl, font=font1, fill=color1)draw.text((x, y), cl, font=font, fill=color) # 周n遍歷每一節(jié)課cnt += 1x += dx# 午休兩根線draw.line((xx + font_size*1.82//1-4, wx_y1, w+x0, wx_y1), fill='red', width=width)draw.line((xx + font_size*1.82//1-4, wx_y2, w+x0, wx_y2), fill='red', width=width)im1.save(out_path, quality=100)1-5 調(diào)用接口更換壁紙
先睡了,下次更新…
# 換壁紙 具體 函數(shù) def setWallpaper(image_path):# 這是剽竊的,有時間研究一下啦key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)win32api.RegSetValueEx(key, "WallpaperStyle", 0, win32con.REG_SZ, "2")win32api.RegSetValueEx(key, "TileWallpaper", 0, win32con.REG_SZ, "0")win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, image_path, 1 + 2)# 換壁紙 框架 def setWallPaperBMP(imagePath):bmpImage = Image.open(imagePath)newPath = imagePath.replace('.jpg', '.bmp')bmpImage.save(newPath, "BMP")setWallpaper(newPath) def ch_wallpaper(img_id, all_wek=18):test = 1if test:root_path = r'c:\wallp\Schedule'else:root_path = os.getcwd()bgs_path = op.join(root_path, 'bg') # 壁紙路徑cs_path = op.join(root_path, 'cls.txt') # 總課表路徑to_path = op.join(root_path, 'tem') # 課表背景路徑flag = op.join(root_path, r'flag\nshow')bg_list = [op.join(bgs_path, name) for name in os.listdir(bgs_path)]bg_path = random.choice(bg_list)while not bg_path.endswith('.jpg'):bg_path = random.choice(bg_list)# 每次運行都要刪除一遍文件 -- 課表圖片if len(lst := os.listdir(to_path)):tems = [op.join(to_path, name) for name in lst]for tem in tems:os.remove(tem)# 這里想辦法搞一搞 周數(shù)大于18 或者 不想顯示課表(判斷某個文件在不在)if (img_id > all_wek) or (op.exists(flag)): # 超過總周數(shù)就不貼課表setWallpaper(bg_path)else:if img_id <= 0:img_id = 1img_name = f'第{img_id}周.png'out_img = op.join(to_path, img_name)get_wap(now_cs=getnow_cs(img_id, cs_path), img_path=bg_path, out_path=out_img)if not op.exists(out_img):return NonesetWallpaper(out_img)1-6 設置定時任務
先運行試試:
if __name__ == '__main__':start_time = '2022 4 30'screen_size = (1920, 1080)all_wek = 18img_id = get_imgid(start_time)ch_wallpaper(img_id, all_wek=all_wek)sys.exit()定時任務
那么問題來了,代碼是寫好了,說好的自動換壁紙呢??!代碼寫好了就會自己動 運行? 不急,還有最后的操作,跟我一步一步來
- 首先在開始菜單搜索 任務計劃程序,點擊進入,如下圖:
 
- 然后點擊右上角創(chuàng)建基本任務
 
- 起個名稱,下一步
 
- 選擇 每天 ->下一步
 
- 這里設置一下,然后下一步
- 直接下一步
- 這里需要注意了
 程序腳本|就只用填 python.exe
 —|—
 添加參數(shù)|填源代碼的地址【例如:C:\users\lalala\desktop\ch_wallpaper.py ]
 起始于|填的是你Python.exe的安裝目錄【例如:C:\Program Files\Python38\Python38】
- 然后回到主界面,找到剛添加好的任務,點擊屬性,修改一下設置
 最后,如果還是不能每天運行的話,可以參考我的暴保守做法,修改觸發(fā)器,讓它每次登錄都運行一下
2、總結(jié)
2-1 用到的關(guān)鍵技術(shù)
- Python eval() :從文件獲取周課表數(shù)據(jù)列表
- Python time 庫:時間處理
- Python os 庫:路徑、文件處理
- Python Pillow 庫:圖像處理
- Python Windows接口 更換桌面壁紙
2-2 不規(guī)范、不足之處、改進方向
- 大部分參數(shù)與代碼耦合度太高,調(diào)參是個大問題
- 配置文件功能簡單,可以發(fā)揮更多作用:將更多參數(shù)配置遷移到配置文件中,代碼打包后便可以只修改配置文件而定制程序。
- 配置文件按可以考慮采用JSON YAML等
- 可以編寫圖形化界面導入學期課表 或者 使用爬蟲到網(wǎng)站直接爬取學期課表。
總結(jié)
以上是生活随笔為你收集整理的全自动生成、设置课表壁纸【完结】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 动态壁纸制作工具哪个好用
- 下一篇: android动态壁纸的制作
