日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全自动生成、设置课表壁纸【完结】

發布時間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全自动生成、设置课表壁纸【完结】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 0、來由
  • 1、設計、實現思路
    • 1-1 課表數據文檔設計
    • 1-2 解析獲取周課表
    • 1-3 獲取當前周數
    • 1-4 繪制周課表蒙版、合并背景壁紙
    • 1-5 調用接口更換壁紙
    • 1-6 設置定時任務
  • 2、總結
    • 2-1 用到的關鍵技術
    • 2-2 不規范、不足之處、改進方向


0、來由

  • 去官網查課表太慢太麻煩
  • 在手機上留截圖看屏幕小(主要那段時間看電腦多)
  • 電腦上存截圖也得找
  • 那時候還沒發現小愛自帶的課表(也可能自動導入功能還沒有)

??于是,就有了這個想法,之前也實現過(P好每周的課表蒙版圖,存起來,然后寫個腳本把課表蒙版跟壁紙合并,然后調用接口更換壁紙)文章考古-點這里。但是P圖畢竟費時間,想要修改也比較費勁,也就自己折騰自己。

后來就有了新想法:

  • 根據課表數據,
  • 自動繪制課表蒙版,
  • 自動貼合背景,
  • 自動換壁紙。

1、設計、實現思路

1-1 課表數據文檔設計

??將學期課表按一定規則,存儲為文本文件,然后程序讀取文件,根據當前時間與設定好的學期開始時間計算出當前周數,并設置學期總周數,超過則不顯示課表。

當時編程還不是很規范,許多配置參數都只寫死到代碼中,要修改都只能到代碼中找,很不方便。比如:

  • 學期開始時間
  • 總周數
  • 壁紙文件夾路路徑
  • 課表文件路徑
  • 課表位置偏移量
  • 。。。

其實,可將這些參數,同課表數據一樣,抽離出來作為配置項,通過配置文件獲取,從而就大大方便了定制化。

學期課表中,需要存儲一些必要的信息項:

  • 課程名稱。為了方便顯示,盡量簡寫
  • 課程教室。
  • 課程時間。也可以記錄為:當天的第幾節課
  • 課程跨度。課程的開課周數,如[1, 3-6, 10] 表示1周3-6周10周有課。

??根據上述這些信息,就可以完整提取出每一周的課表。根據一些實際情況,做出一些調整:將教室、課程簡寫合并為課程名稱;于是,設置一個wks的列表表示周數,如wks[1:5]+wks[8:9] 表示: 1-4周+第8周。
??鑒于Python有個強悍的函數eval(),那就直接把學期課表按照Python列表的格式設計,讀取的時候直接對接就行;學期課表設計為一個含有五個元素的文檔,每個元素為存儲周一到周五中一天的課程信息;每個元素由六個列表單元構成,表示一天中的六節課(上午、下午、晚上各兩節);而每個最小單元,也就是每節課,是一個二元列表(或是元組),第一個元素是設計后的 課表名稱 如:B211大物,第二個元素為課程跨度,如:wks[1:5]+wks[8:9] 。

# 學期課表示例 [ # 周一課程[('105射頻', wks[1:6]+wks[7:12])],[('419微測', wks[4:6]+wks[7:13])],[],[('407微波', wks[3:6]+wks[7:19])],[('317信完', wks[1:6]+wks[7:14])],[] ]; [ # 周二課程[('305微原', wks[1:6]+wks[7:11]+wks[12:15])],[('114數電', wks[1:4])],[],[('418隨機', wks[1:6]+wks[7:11]+wks[12:13])],[('114智能', wks[1:6]+wks[7:11]+wks[12:15])],[] ]; [ # 周三課程[('105射頻', wks[1:6]+wks[7:12])],[('211專業', wks[8:10])],[],[('211形政', wks[15:17])],[],[] ]; [ # 周四課程[('305微原', wks[1:5]+wks[7:15]+wks[12:15])],[('219編程', wks[1:6]+wks[7:10]), ('105工概', wks[10:18])],[],[('418隨機', wks[1:5]+wks[7:13])],[],[] ]; [ # 周五課程[('407微波', wks[3:6]+wks[7:17])],[],[],[('518學導', wks[7:8]+wks[15:16])],[('onl學導', wks[1:2]+wks[11:12])],[], ];

1-2 解析獲取周課表

??根據學期課表的設計,便可以逆向解析到周課表。大致思路為:獲取到學期課表列表后,循環遍歷五天的課表信息,再遍歷每天的課程信息,如果當前周數存在于當前課程跨度中,那么向周課表列表中加入該課程,否則置入空字符串表示沒課。最終得到周課表。

  • 重要信息:
    • 當前周數
    • 學期課表
# 獲取此周課表 def getnow_cs(now_wk, cs_path):'''# now_wk: 當前周數# cs_path: 課表文件地址'''# 臨時周課表路徑path = op.join(op.split(cs_path)[0], 'tem_cls')# 如果已經生成過本周課表txt 那么讀取后直接返回,否則執行后續if op.exists(c_path := op.join(path, f'{now_wk}周課表.txt')):f = open(c_path, 'r', encoding='utf8')if len(f.read()) > 20:with open(c_path, 'r', encoding='utf8') as f:now_cs = list(map(eval, f.read().split('\n')[:-1]))f.close()return now_csclss = [op.join(path, name) for name in os.listdir(path)]# 刪除過時的周課表for k in clss:os.remove(k)now_cs = [[] for i in range(5)]f = open(op.join(path, f'{now_wk}周課表.txt'), 'a', encoding='utf8')for wk in range(5):# cls 代表單天的課程列表for cls in getall_cs(cs_path)[wk]:flag = 1# cl 代表每一節課for cl in cls:# 如果當前周在當前循環課程的 周跨度中# 將該課程添加到改周課表對應位置if now_wk in cl[1]:now_cs[wk].append(cl[0])flag = 0# flag = 1 表示當節課沒有課程安排# 那么該位置添入 空字符串 占位if flag:now_cs[wk].append('')f.write(str(now_cs[wk]) + '\n')f.close()return now_cs# 獲取學期課表 傳入學期課表路徑 def getall_cs(cs_path):# 周數列表,最多應該不會超過 23 周wks = [i for i in range(23)]with open(cs_path, 'r', encoding='utf8') as f:# eval 將每天課表的字符串數據轉換為 列表;# split 規則參照 1-1 的課表文檔lh = list(map(eval, f.read().split(';\n')[:-1]))f.close()return lh

1-3 獲取當前周數

先睡了,下次更新…

# 獲取周數 # 傳入第一個周 周一的日期 # 返回:當前周數 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_id

1-4 繪制周課表蒙版、合并背景壁紙

生成課表蒙版+合并背景壁紙

# 制作、存儲壁紙 # 傳入本周課表、圖片路徑、輸出路徑 # 最終函數保存一課表圖片文件 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' # 節數顏色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 # 控制標題組上下移動# 打開圖片--轉為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 透明度調節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)# 課程 時間點 繪制 節數xx, yy = x0+3, 1080-(4*font_size+3*dy)+25 + ddy # 節數起始坐標 !!-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 == '午休':# 先獲取午休兩線的坐標參數 --先不畫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# 課表內容繪制+周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遍歷每一節課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 調用接口更換壁紙

先睡了,下次更新…

# 換壁紙 具體 函數 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)# 這里想辦法搞一搞 周數大于18 或者 不想顯示課表(判斷某個文件在不在)if (img_id > all_wek) or (op.exists(flag)): # 超過總周數就不貼課表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()

定時任務

那么問題來了,代碼是寫好了,說好的自動換壁紙呢??!代碼寫好了就會自己動 運行? 不急,還有最后的操作,跟我一步一步來

  • 首先在開始菜單搜索 任務計劃程序,點擊進入,如下圖:
  • 然后點擊右上角創建基本任務
  • 起個名稱,下一步
  • 選擇 每天 ->下一步
  • 這里設置一下,然后下一步
  • 直接下一步
  • 這里需要注意了
    程序腳本|就只用填 python.exe
    —|—
    添加參數|填源代碼的地址【例如:C:\users\lalala\desktop\ch_wallpaper.py ]
    起始于|填的是你Python.exe的安裝目錄【例如:C:\Program Files\Python38\Python38】
  • 然后回到主界面,找到剛添加好的任務,點擊屬性,修改一下設置
    最后,如果還是不能每天運行的話,可以參考我的暴保守做法,修改觸發器,讓它每次登錄都運行一下

2、總結

2-1 用到的關鍵技術

  • Python eval() :從文件獲取周課表數據列表
  • Python time 庫:時間處理
  • Python os 庫:路徑、文件處理
  • Python Pillow 庫:圖像處理
  • Python Windows接口 更換桌面壁紙

2-2 不規范、不足之處、改進方向

  • 大部分參數與代碼耦合度太高,調參是個大問題
  • 配置文件功能簡單,可以發揮更多作用:將更多參數配置遷移到配置文件中,代碼打包后便可以只修改配置文件而定制程序。
  • 配置文件按可以考慮采用JSON YAML等
  • 可以編寫圖形化界面導入學期課表 或者 使用爬蟲到網站直接爬取學期課表。

總結

以上是生活随笔為你收集整理的全自动生成、设置课表壁纸【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。