From 02fb994f871d183654307cd1d9f240c4e44e87ea Mon Sep 17 00:00:00 2001 From: people Date: Fri, 27 Oct 2023 21:09:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E9=80=89=E4=BA=BA-tk=20-=20=E4=BD=9C=E4=B8=9A=E7=89=88-s.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 随机选人-tk - 作业版-s.py | 2448 ++++++++++++++++++------------------- 1 file changed, 1224 insertions(+), 1224 deletions(-) diff --git a/随机选人-tk - 作业版-s.py b/随机选人-tk - 作业版-s.py index 4ce6079..7e65490 100644 --- a/随机选人-tk - 作业版-s.py +++ b/随机选人-tk - 作业版-s.py @@ -1,1225 +1,1225 @@ -''' -亲爱的syj: -你可能在这里看到一些匪夷所思的代码,因为有些已经没用的功能,还没来得及删。 -bugs -“设置”是新加的内容,但问题很多,你可以试试。 -“倒计时”的结束时间必须在今天,如果结束时间是第二天会立刻停止,知道原因,但没来得及改。 -“查看并复制”如果一项作业太长,就会显示不全,也知道原因,但懒得改(毕竟可以看word)。 -“查看word”时,如果这个文档正在使用,就会卡白屏,能改,但还没改。 -***“屏蔽任务管理器”模块不知什么原因,在Windows 7上不起作用,但Windows 11可以。(马上期中了,希望火速把这问题改了,要不然就会有一堆人把我程序一关,然后用钉钉查我成绩)*** -虽然bug一堆,但我打算先把留作业的模块的按钮中的文字用标志代替,已经把“确定并保存”按钮改成了标志,但改圆角时失败了。 -移除ttkbootstrap虽然能变成圆角,但太丑了,所以后来又把ttkbootstrap请回来了。 -''' -''' - * _ooOoo_ - * o8888888o - * 88" . "88 - * (| -_- |) - * O\ = /O - * ____/`---'\____ - * . ' \\| |// `. - * / \\||| : |||// \ - * / _||||| -:- |||||- \ - * | | \\\ - /// | | - * | \_| ''\---/'' | | - * \ .-\__ `-` ___/-. / - * ___`. .' /--.--\ `. . __ - * ."" '< `.___\_<|>_/___.' >'"". - * | | : `- \`.;`\ _ /`;.`/ - ` : | | - * \ \ `-. \_ __\ /__ _/ .-` / / - * ======`-.____`-.___\_____/___.-`____.-'====== - * `=---=' - * - * ............................................. - * 万分感谢 - ''' -from threading import Thread -from tkinter import * -from arcade import load_sound,play_sound,stop_sound -import random,tkinter,time,xlrd,datetime,logging,hashlib,os,shutil,pygetwindow,pyperclip -from ttkbootstrap import Style -from tkinter import ttk -from docx import Document -from tkinter import messagebox -from PIL import Image, ImageTk, ImageDraw -def check_pwd(pwd): - global password - password=False - try: - with open('support/config.ini') as v: - for x in v.readlines(): - if 'pwd:' in x: - break - except: - on_button_click('没有找到密码文件','') - pwd='pwd:'+pwd - if pwd==x: - password=True - return True - else: - on_button_click('请检查密码','') - return False -def loading(): - global fin,a,root,screen_width,ll,back,back_photo,up_photo,down_photo,stop_photo,star,star_photo,bigback_photo,paus_photo,cross_photo,speed,save_and_continue_photo,continued_photo - fin=False - style = Style(theme='cosmo') - root = style.master - draggable_window = DraggableWindow(root) - content_frame = ttk.Frame(root) - - screen_width = root.winfo_screenwidth() - root.resizable(0, 0) - root.overrideredirect(1) - back = Image.open("support/back.png") - smallback = back.resize((30, 30)) - back_photo = ImageTk.PhotoImage(smallback) - bigback = Image.open("support/bigback.png") - bigback= bigback.resize((40, 40)) - bigback_photo=ImageTk.PhotoImage(bigback) - up = Image.open("support/up.png") - up = up.resize((40, 40)) - up_photo = ImageTk.PhotoImage(up) - down = Image.open("support/down.png") - down = down.resize((40, 40)) - down_photo = ImageTk.PhotoImage(down) - stop = Image.open("support/stop.png") - stop = stop.resize((40, 40)) - stop_photo = ImageTk.PhotoImage(stop) - star = Image.open("support/star.png") - star = star.resize((40, 40)) - star_photo = ImageTk.PhotoImage(star) - paus = Image.open("support/paus.png") - paus = paus.resize((40, 40)) - paus_photo = ImageTk.PhotoImage(paus) - cross = Image.open("support/cross.png") - cross = cross.resize((20, 20)) - cross_photo = ImageTk.PhotoImage(cross) - save_and_continue = Image.open("support/save_and_continue.png") - save_and_continue = save_and_continue.resize((80, 40)) - save_and_continue_photo = ImageTk.PhotoImage(save_and_continue) - continued = Image.open("support/continue.png") - continued = continued.resize((20, 20)) - continued_photo = ImageTk.PhotoImage(continued) - for x in range(75): - win_width = (4*x)+201 - win_height = (4*x)+1 - win_x = root.winfo_screenwidth() // 2 - win_width // 2 - win_y = root.winfo_screenheight() // 2 - win_height // 2 - root.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) - root.update() - log('正在清理文件','info') - while fin==False: - c = tkinter.Label(text=ll, font=('宋体')) - c.place(relx=0.5, rely=0.8, anchor='center') - time.sleep(0.08) - root.update_idletasks() - root.update() - c.destroy() - else: - try: - c.destroy() - except: - pass - k = tkinter.Label(text='本次共清理了\n' + str(a) + '个文件', font=('宋体', 48)) - log('本次共清理了' + str(a) + '个文件','info') - k.place(relx=0.5, rely=0.5, anchor='center') - root.after(3000, lambda: schedule('fromclean')) - root.mainloop() -def log(content,rate): - if rate=='info': - logging.info(content) - elif rate=='warning': - logging.warning(content) - elif rate=='error': - logging.error(content) - with open('support/config.ini','a+') as f: - a=f.readlines() - for x in range(len(a)): - if '日志处理后sha256' in a[x]: - del f.readlines()[x] - f.write('日志处理后sha256:'+file_sha256(r'support/journal.log')) -def on_button_click(content,pppp): - wait_window = tkinter.Toplevel(root) - wait_window.wm_attributes('-topmost', 1) - win_width = 400 - win_height = 300 - wait_window.overrideredirect(1) - win_x = screen_width - win_width - win_y = wait_window.winfo_screenheight() // 2 - win_height // 2 - wait_window.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) - p = tkinter.Label(wait_window, text=content, font=('仿宋', 24), justify='left') - p.place(rely=0.1, relx=0.5, anchor='n') - pp = tkinter.Button(wait_window, text="确定", command=wait_window.destroy, font=('宋体', 24)) - pp.place(rely=0.8, relx=0.3, anchor='center') - if pppp=='pppp': - ppp = tkinter.Entry(wait_window, width=30,show='*') - ppp.place(relx=0.5, rely=0.6, anchor='center') - pppp=tkinter.Button(wait_window,text='忽略',command=lambda:check_pwd(ppp.get()) and wait_window.destroy(),font=('宋体', 24)) - pppp.place(relx=0.6,rely=0.8,anchor='center') - wait_window.wait_window() - return True - - -class DraggableWindow: - def __init__(self, root): - self.root = root - self.root.bind("", self.start_move) - self.root.bind("", self.stop_move) - self.root.bind("", self.on_move) - self.draggable = False - self.offset = {"x": 0, "y": 0} - - def start_move(self, event): - - if isinstance(event.widget, tkinter.Button) or isinstance(event.widget, tkinter.Text): - return - self.draggable = True - self.offset["x"] = event.x - self.offset["y"] = event.y - - def stop_move(self, event): - - self.draggable = False - - def on_move(self, event): - - if isinstance(event.widget, tkinter.Button) or isinstance(event.widget, tkinter.Text) or isinstance(event.widget, tkinter.Entry): - return - if self.draggable: - x = self.root.winfo_x() + (event.x - self.offset["x"]) - y = self.root.winfo_y() + (event.y - self.offset["y"]) - self.root.geometry(f"+{x}+{y}") -photo=None -info='' -canceltopping=False -d = datetime.datetime.now() -chosed=[] -zhou=['周一','周二','周三','周四','周五','周六','周日'] -shouldnot=[] -logging.basicConfig(filename="support/journal.log", filemode="a+", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt='', level=logging.DEBUG) -def file_hash(file_path: str, hash_method) -> str: - h = hash_method() - with open(file_path, 'rb') as f: - while True: - b = f.read(8192) - if not b: - break - h.update(b) - f.close() - return h.hexdigest() -def file_sha256(file_path: str) -> str: - return file_hash(file_path, hashlib.sha256) -def check_class(): - global zhou,d - try: - excel = xlrd.open_workbook("support/时刻表.xls") - sheet = excel.sheet_by_index(0) - rows: list = sheet.row_values(0) - index = rows.index('时刻表') - listindes = sheet.col_values(index) - for x in range(1, len(listindes)): - a = listindes[x].split('-') - start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[0], '%Y-%m-%d%H:%M') - end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') - now_time = datetime.datetime.now() - if start_time < now_time < end_time: - excel = xlrd.open_workbook("support/课程表.xls") - sheet = excel.sheet_by_index(0) - rows: list = sheet.row_values(0) - index = rows.index(zhou[d.weekday()]) - listindes = sheet.col_values(index) - return listindes[x] - return False - except: - return False -def rest(): - try: - excel = xlrd.open_workbook("support/时间表.xls") - sheet = excel.sheet_by_index(0) - rows: list = sheet.row_values(0) - index = rows.index('时间表') - listindes = sheet.col_values(index) - for x in range(1, len(listindes)): - a = listindes[x].split('-') - start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[0], '%Y-%m-%d%H:%M') - end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') - now_time = datetime.datetime.now() - if start_time < now_time < end_time: - return True - return False - except: - return False -def verify_pwd(): - global password - wait_window = tkinter.Toplevel(root) - win_width = 400 - win_height = 300 - wait_window.overrideredirect(1) - win_x = screen_width - win_width - win_y = wait_window.winfo_screenheight() // 2 - win_height // 2 - wait_window.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) - p = tkinter.Label(wait_window, text="验证密码\n成功后可打开任务管理器", font=('仿宋', 24), justify='left') - p.place(rely=0.1, relx=0.5, anchor='n') - pp = tkinter.Button(wait_window, text="取消", command=wait_window.destroy, font=('宋体', 24)) - pp.place(rely=0.8, relx=0.3, anchor='center') - ppp = tkinter.Entry(wait_window, width=30, show='*') - ppp.place(relx=0.5, rely=0.6, anchor='center') - pppp = tkinter.Button(wait_window, text='验证', command=lambda: check_pwd(ppp.get()) and wait_window.destroy(), - font=('宋体', 24)) - pppp.place(relx=0.6, rely=0.8, anchor='center') - wait_window.wait_window() - if password==True: - with open('support/temp','w+') as f: - f.write('True') - - password=False - return True -def urge(): - global toplevel,pressed_f4 - time.sleep(10) - pressed_f4 = False - subj=['语文','数学','英语','物理','化学','政治'] - def do_exit(): - global pressed_f4 - if pressed_f4: - pressed_f4 = False - toplevel.destroy() - def alt_f4(event): - global pressed_f4 - pressed_f4 = True - - with open('support/info.txt','r+') as f: - for x in f.readlines(): - if '晚自习' in x: - break - a = x.split(':') - toplevel = tkinter.Toplevel() - toplevel.geometry('{}x{}+{}+{}'.format(screen_width-2, toplevel.winfo_screenheight()-2, 0, 0)) - toplevel.resizable(0, 0) - toplevel.overrideredirect(1) - toplevel.wm_attributes('-topmost', 1) - toplevel.protocol("WM_DELETE_WINDOW") - toplevel.bind('', alt_f4) - toplevel.protocol("WM_DELETE_WINDOW", do_exit) - toplevel.configure(bg='white') - toplevel.wm_attributes('-transparentcolor', 'white') - flag=True - while flag: - start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') - now_time = datetime.datetime.now() - while start_time < now_time and flag: - urg = [] - subjects = open('support/subjects', 'r').read().splitlines() - for i, subject in enumerate(subjects): - if str(d.date()) + subject in os.listdir('support/homework/') and (not subject in urg): - with open('support/homework/' + str(d.date()) + subject, 'r+') as f: - if f.readlines() != []: - pass - elif subject in subj: - urg.append(subject) - else: - if (not subject in urg) and (subject in subj): - urg.append(subject) - for btn in toplevel.place_slaves(): - btn.destroy() - for x in urg: - if z==False: - tkinter.Button(toplevel, text=x + '课代表速留作业', font=('宋体', 30)).place(relx=random.uniform(0, 1), - rely=random.uniform(0, 1)) - if urg==[]: - flag=False - toplevel.update() - time.sleep(1) - else: - delta = start_time - now_time - seconds = delta.total_seconds() - time.sleep(seconds) -z=False -def countdown(): - global speed - for btn in root.place_slaves(): - btn.destroy() - - def returnforpaused(whattime): - current_time = datetime.datetime.now().time() - current_datetime = datetime.datetime.combine(datetime.date.today(), current_time) - future_datetime = current_datetime + whattime - future_time = future_datetime.time().replace(microsecond=0) - return future_time - - def paused(whattime): - global flag,star_photo - flag = False - pause = tkinter.Button(image=star_photo, command=lambda: updated(returnforpaused(whattime)), font=('宋体', 30)) - pause.grid(column=0, row=3, sticky='nsew') - - def updated(future_time): - global starttime, flag,bigback_photo,stop_photo,paus_photo - flag = True - for child in root.grid_slaves(): - child.grid_remove() - time1 = datetime.time(int(str(future_time).split(':')[0]), int(str(future_time).split(':')[1]), - int(str(future_time).split(':')[2])) - datetime1 = datetime.datetime.combine(datetime.date.today(), time1) - current_time = datetime.datetime.now().time() - pause = tkinter.Button(image=paus_photo, command=lambda: paused( - datetime1 - datetime.datetime.combine(datetime.date.today(), current_time).replace(microsecond=0)), - font=('宋体', 30)) - pause.grid(column=0, row=3, sticky='nsew') - cancel = tkinter.Button(image=stop_photo,command=lambda: welcome(), font=('宋体', 30)) - cancel.grid(column=1, row=3, sticky='nsew') - back = tkinter.Button(image=bigback_photo,command=lambda: schedule('fromclean'), font=('宋体', 30),height=60) - back.grid(column=2, row=3, sticky='nsew') - while flag == True and datetime.datetime.now().time() <= ( - datetime.time(int(str(future_time).split(':')[0]), int(str(future_time).split(':')[1]), - int(str(future_time).split(':')[2]))): - current_time = datetime.datetime.now().time() - datetime2 = datetime.datetime.combine(datetime.date.today(), current_time) - time_difference = datetime1 - datetime2 - hours = time_difference.seconds // 3600 - minutes = (time_difference.seconds % 3600) // 60 - seconds = time_difference.seconds % 60 - tkinter.Label(text=str(hours).zfill(2), font=('宋体', 50)).grid(column=0, row=1, sticky='nsew') - tkinter.Label(text=str(minutes).zfill(2), font=('宋体', 50)).grid(column=1, row=1, sticky='nsew') - tkinter.Label(text=str(seconds).zfill(2), font=('宋体', 50)).grid(column=2, row=1, sticky='nsew') - root.update() - time.sleep(1) - else: - if flag == False: - pass - else: - finishing() - - def finishing(): - global bigback_photo - for child in root.grid_slaves(): - child.grid_remove() - tkinter.Label(text='时间到了', font=('华文行楷', 50)).grid(column=0, columnspan=3, row=1, sticky='nsew') - cancel = tkinter.Button(text='确定', command=lambda: stop_sound(player) | welcome(), font=('宋体', 30)) - cancel.grid(column=0, row=3, sticky='nsew') - back = tkinter.Button(image=bigback_photo, command=lambda: stop_sound(player) | schedule('fromclean'), font=('宋体', 30),height=60) - back.grid(column=2, row=3, sticky='nsew') - sound = load_sound("support/sound.mp3") - player = play_sound(sound) - - def start(): - remain = hour * 60 * 60 + minute * 60 + second - current_time = datetime.datetime.now().time() - current_datetime = datetime.datetime.combine(datetime.date.today(), current_time) - future_datetime = current_datetime + datetime.timedelta(seconds=remain) - future_time = future_datetime.time().replace(microsecond=0) - updated(future_time) - - def times(unit, way): - global hour, minute, second, root - if unit == 'hour': - if way == '+': - if hour >= 23: - pass - else: - hour = hour + 1 - elif way == '-': - if hour <= 0: - pass - else: - hour = hour - 1 - elif unit == 'minute': - if way == '+': - if minute >= 59 and hour < 23: - hour = hour + 1 - minute = minute % 59 - elif minute >= 59 and hour >= 23: - pass - else: - minute = minute + 1 - elif way == '-': - if minute <= 0: - pass - else: - minute = minute - 1 - elif unit == 'second': - if way == '+': - if second >= 59 and minute < 59: - minute = minute + 1 - second = second % 59 - elif second >= 59 and minute >= 59 and hour < 23: - hour = hour + 1 - second = second % 59 - minute = minute % 59 - elif second >= 59 and minute >= 59 and hour >= 23: - pass - else: - second = second + 1 - elif way == '-': - if second <= 0: - pass - else: - second = second - 1 - tkinter.Label(text=str(hour).zfill(2), font=('宋体', 50)).grid(column=0, row=1, sticky='nsew') - tkinter.Label(text=str(minute).zfill(2), font=('宋体', 50)).grid(column=1, row=1, sticky='nsew') - tkinter.Label(text=str(second).zfill(2), font=('宋体', 50)).grid(column=2, row=1, sticky='nsew') - root.update() - root.grid_rowconfigure(1, weight=1) - root.grid_columnconfigure(0, weight=1) - root.grid_columnconfigure(1, weight=1) - root.grid_columnconfigure(2, weight=1) - step_wid = (500 - root.winfo_width()) / speed - step_hei = (300 - root.winfo_height()) / speed - step_x = (root.winfo_x() - (root.winfo_screenwidth() // 2 - 500 / 2)) / speed - step_y = (root.winfo_y() - (root.winfo_screenheight() // 2 - 300 / 2)) / speed - for x in range(speed): - wid = root.winfo_width() + step_wid - hei = root.winfo_height() + step_hei - root.geometry( - '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) - root.update() - root.geometry( - '{}x{}+{}+{}'.format(500, 300, int(root.winfo_screenwidth() // 2 - 500 / 2), int(root.winfo_screenheight() // 2 - 300 / 2))) - def welcome(): - global starttime, hour, minute, second, flag,up_photo,down_photo,bigback_photo - for child in root.grid_slaves(): - child.grid_remove() - hour = 0 - minute = 0 - second = 0 - flag = False - tkinter.Button(image=up_photo, command=lambda: times('hour', '+'), font=('宋体', 30),height=60).grid(column=0, row=0, - sticky='nsew') - tkinter.Button(image=up_photo, command=lambda: times('minute', '+'), font=('宋体', 30)).grid(column=1, row=0, - sticky='nsew') - tkinter.Button(image=up_photo, command=lambda: times('second', '+'), font=('宋体', 30)).grid(column=2, row=0, - sticky='nsew') - tkinter.Button(image=down_photo, command=lambda: times('hour', '-'), font=('宋体', 30),height=60).grid(column=0, row=2, - sticky='nsew') - tkinter.Button(image=down_photo, command=lambda: times('minute', '-'), font=('宋体', 30)).grid(column=1, row=2, - sticky='nsew') - tkinter.Button(image=down_photo, command=lambda: times('second', '-'), font=('宋体', 30)).grid(column=2, row=2,sticky='nsew') - tkinter.Label(text=str(hour).zfill(2), font=('宋体', 50)).grid(column=0, row=1, sticky='nsew') - tkinter.Label(text=str(minute).zfill(2), font=('宋体', 50)).grid(column=1, row=1, sticky='nsew') - tkinter.Label(text=str(second).zfill(2), font=('宋体', 50)).grid(column=2, row=1, sticky='nsew') - starttime = tkinter.Button(image=star_photo, command=lambda: start(), font=('宋体', 30),height=60) - starttime.grid(column=0, row=3, columnspan=2, sticky='nsew') - back = tkinter.Button(image=bigback_photo, command=lambda: schedule('fromclean'), font=('宋体', 30)) - back.grid(column=2, row=3, sticky='nsew') - root.mainloop() - welcome() -def homework(): - global z,toplevel,back_photo,speed - z=True - image = Image.open("support/smile.jpg") - photo = ImageTk.PhotoImage(image) - def look(): - global cross_photo - for child in root.grid_slaves(): - child.grid_remove() - for t in root.place_slaves(): - t.destroy() - tkinter.Button(root, image=cross_photo, command=lambda: schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') - work=[] - copylist = '' - subjects = open('support/subjects', 'r').read().splitlines() - for i, subject in enumerate(subjects): - if str(d.date()) + subject in os.listdir('support/homework/'): - with open('support/homework/' + str(d.date()) + subject, 'r+') as f: - work.append(subject+':') - copylist = copylist + subject - l=1 - for x in f.readlines(): - work.append(x) - copylist = copylist + str(l)+')'+ x - l=l+1 - copylist = copylist + '\n' - pyperclip.copy(copylist) - i=9 - doc = Document() - paragraph3 = doc.add_paragraph() - paragraph3.add_run(copylist) - doc.save('support/'+str(d.date())+'作业.docx') - tkinter.Message(root,text=copylist,font=('黑体', 24)).grid(column=i,row=0,pady=30,ipadx=root.winfo_width()) - - tkinter.Button(root, text='查看word',command=lambda :os.startfile(os.path.normpath('support/'+str(d.date())+'作业.docx'))).place(relx=0,rely=1,anchor='sw') - tkinter.Button(root, image=back_photo, command=lambda: choice_subject()).place(relx=0, rely=0, - anchor='nw') - - root.update() - def add_subject(a): - with open('support/subjects', 'r+') as h: - if a+'\n' in h.readlines(): - tkinter.messagebox.showwarning('已存在',a+'已存在') - h.close() - elif a == '': - return False - else: - with open('support/subjects', 'a+') as g: - g.write(str(a) + '\n') - g.close() - choice_book(a) - def add_work_write(sub,book,info): - global label_img - with open('support/homework/'+str(d.date())+sub,'a+') as f: - f.write(book+info+'\n') - pass - try: - label_img = tkinter.Label(root, image=photo, width=30, height=30) - label_img.place(relx=0,rely=1,anchor='sw') - root.update() - add_work(sub,book) - except: - pass - def delete_homework(sub,subject,book): - with open('support/homework/'+str(d.date())+sub, 'r') as file: - lines = file.readlines() - - for i, line in enumerate(lines): - if line.strip() == subject: - del lines[i] - break - - with open('support/homework/'+str(d.date())+sub, 'w') as file: - file.writelines(lines) - add_work(sub,book) - - def handle_return(event): - if event.keysym == 'Return': - return 'break' - def add_work(sub,book): - global cross_photo - for child in root.grid_slaves(): - child.grid_remove() - for t in root.place_slaves(): - t.destroy() - try: - subjects = open('support/homework/'+str(d.date())+sub, 'r+').read().splitlines() - except: - with open('support/homework/'+str(d.date())+sub, 'w+') as f: - pass - subjects = open('support/homework/'+str(d.date())+sub, 'r+').read().splitlines() - i=2 - for i, subject in enumerate(subjects): - print('到这儿了') - button = tkinter.Label(root, text=subject,justify='left',wraplength=160) - button.grid(row=i + 1, column=0, ipadx=50, pady=5,sticky='w') - button = tkinter.Button(root, image=cross_photo,command=lambda subject=subject: delete_homework(sub,subject,book)) - button.grid(row=i + 1, column=1, ipadx=1, pady=5) - print('到这儿了') - tkinter.Button(root, image=back_photo, command=lambda: choice_book(sub)).place(relx=0, rely=0, - anchor='nw') - tkinter.Label(root, text=sub+' '+book+'\n' +'请输入具体页数或题号').grid(row=0, column=0, ipadx=15, pady=10, columnspan=3) - ppp = tkinter.Text(root, width=20,height=20) - ppp.bind('', handle_return) - ppp.grid(row=i+2, column=0, ipadx=30,sticky='e',padx=10) - tkinter.Button(root, image=save_and_continue_photo, command=lambda: add_work_write(sub,book,ppp.get(1.0,END).strip()),bg='white',activebackground='white',fg='white').grid(row=i+3, - column=0, - ipadx=15, pady=10) - tkinter.Button(root, text='X', command=lambda: schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') - try: - root.after(3000,lambda :label_img.destroy()) - except: - pass - def add_book(sub,book): - with open('support/' + sub, 'r+') as f: - if book == '': - return False - elif book+'\n' in f.readlines(): - tkinter.messagebox.showwarning('已存在', book + '已存在') - else: - with open('support/' + sub, 'a+') as g: - g.write(book + '\n') - g.close() - f.close() - add_work(sub,book) - def choice_book(sub): - for child in root.grid_slaves(): - child.grid_remove() - for t in root.place_slaves(): - t.destroy() - try: - subjects = open('support/'+sub, 'r+').read().splitlines() - except: - with open('support/'+sub, 'w+') as f: - f.write('') - f.close() - subjects = open('support/' + sub, 'r+').read().splitlines() - i=2 - tkinter.Button(root, text='X', command=lambda: schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') - tkinter.Label(root, text='\n\n'+sub + '\n' + '选择或输入书名或卷名\n可将此栏目中的内容添加为常用书').grid(row=0, column=0, - ipadx=15, - pady=10, - columnspan=3) - for i, subject in enumerate(subjects): - button = tkinter.Button(root, text=subject, - command=lambda subject=subject: add_work(sub,subject)) - button.grid(row=i + 1, column=0, ipadx=15, pady=10, columnspan=3) - tkinter.Button(root, image=back_photo, command=lambda: choice_subject()).place(relx=0, rely=0, - anchor='nw') - ppp = tkinter.Entry(root, width=10) - ppp.grid(row=i + 2, column=0, ipadx=15,columnspan=3) - tkinter.Button(root, text='确定并保存为常用书', command=lambda: add_book(sub,ppp.get())).grid(row=i + 3, column=0, - ipadx=15, pady=10,columnspan=3) - tkinter.Button(root, text='确定', command=lambda: add_work(sub,ppp.get())).grid(row=i + 4, - column=0, - ipadx=15, pady=10,columnspan=3) - root.update() - pass - def window_close_handle(): - global z,toplevel - z=False - root.destroy() - try: - toplevel.overrideredirect(1) - except: - pass - for x in root.place_slaves(): - x.place_forget() - root.title('添加作业') - root.protocol('WM_DELETE_WINDOW', window_close_handle) - root.update() - win_width = 300 - win_height = 800 - step_wid=(300-root.winfo_width())/speed - step_hei=(800-root.winfo_height())/speed - win_x = screen_width - win_width - win_y = root.winfo_screenheight() // 2 - win_height // 2 - step_x = ((screen_width - win_width) - root.winfo_x()) / speed - step_y = ((root.winfo_screenheight() // 2 - win_height // 2) - root.winfo_y()) / speed - for x in range(speed): - wid=root.winfo_width()+step_wid - hei=root.winfo_height()+step_hei - root.geometry('{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x()+step_x), int(root.winfo_y()+step_y))) - root.update() - root.winfo_x(), root.winfo_y(), root.winfo_width(), root.winfo_height() - i = 2 - j = 0.2 - - def choice_subject(): - root.grid_rowconfigure(1, weight=0) - root.grid_columnconfigure(0, weight=0) - root.grid_columnconfigure(1, weight=0) - root.grid_columnconfigure(2, weight=0) - global z - for child in root.grid_slaves(): - child.grid_remove() - for t in root.place_slaves(): - t.destroy() - tkinter.Button(root, text='X', command=lambda :schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') - subjects = open('support/subjects', 'r').read().splitlines() - for i, subject in enumerate(subjects): - tkinter.Label(root, text='请选择科目').grid(row=0, column=0, ipadx=15, pady=10, columnspan=2) - button = tkinter.Button(root, text=subject, - command=lambda subject=subject: choice_book(subject)) - button.grid(row=i + 1, column=0, ipadx=15, pady=10, columnspan=2) - ppp = tkinter.Entry(root, width=10) - ppp.grid(row=i + 2, column=0, ipadx=15) - tkinter.Button(root, text='下一项(自动保存)', command=lambda: add_subject(ppp.get())).grid(row=i + 2, column=1, - ipadx=15, pady=10) - tkinter.Button(root, text='查看并复制', command=lambda: look()).place(relx=1, rely=1, anchor='se') - root.update() - choice_subject() -def settings(): - global speed - for btn in root.place_slaves(): - btn.destroy() - for x in root.grid_slaves(): - x.grid_remove() - def speed(x): - global speed - speed=int(x) - print(speed) - print(speed) - tkinter.Label(root, text='动画速度').grid(row=0, column=0) - spe=tkinter.Entry(root, width=30) - spe.grid(row=0, column=1) - tkinter.Button(root, text='确定', command=lambda: speed(spe.get())).grid(row=0, column=2) - tkinter.Button(root, text='X', command=lambda: schedule('fromchoice')).place(relx=1, rely=0, anchor='ne') -def choice(fromwhere): - global info,canceltopping,zhou,h,d,photo,label_img,chosed,shouldnot,password,speed - root.wm_attributes('-topmost', 1) - top.destroy() - for btn in root.place_slaves(): - btn.destroy() - for x in root.grid_slaves(): - x.grid_remove() - if not check_class(): - now='1' - else: - now=check_class() - root.overrideredirect(1) - if fromwhere=='fromschedule': - step_wid = (400 - root.winfo_width()) / speed - step_hei = (root.winfo_height() - 300) / speed - win_width = 400 - win_height = 300 - win_x = screen_width - win_width - win_y = root.winfo_screenheight() // 2 - win_height // 2 - step_x = ((screen_width - win_width) - root.winfo_x()) / speed - step_y = ((root.winfo_screenheight() // 2 - win_height // 2)-root.winfo_y()) / speed - for x in range(speed): - wid = root.winfo_width() + step_wid - hei = root.winfo_height() - step_hei - root.geometry( - '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() + step_x), int(root.winfo_y() + step_y))) - root.update() - root.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) - elif fromwhere=='fromtab': - step_wid = (400 - root.winfo_width()) / speed - step_hei = (root.winfo_height() - 300) / speed - step_x = root.winfo_x()/ speed - step_y = root.winfo_y()/ speed - for x in range(speed): - wid = root.winfo_width() + step_wid - hei = root.winfo_height() - step_hei - root.geometry( - '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) - root.update() - root.geometry('{}x{}+{}+{}'.format(400, 300, 0, 0)) - root.update() - root.title('随机选人') - global list - list = [] - status = '开始' - back = tkinter.Button(text='返回', command=lambda: schedule('fromchoice')) - back.place(relx=1, rely=0, anchor='ne') - verify = tkinter.Button(text='倒计时', command=lambda: countdown()) - verify.place(relx=0, rely=0, anchor='nw') - set = tkinter.Button(text='设置', command=lambda: settings()) - set.place(relx=0.5, rely=0, anchor='n') - root.update() - inn = tkinter.Label(text='正在处理……') - inn.place(relx=0.5, rely=0.5, anchor='center') - with open('support/record.txt','r') as k: - for re in k.readlines(): - if not re.strip('\n') in chosed: - chosed.append(re.strip('\n')) - k.close() - try: - try: - with open('support/' + now + '.txt', 'r') as f: - inf = tkinter.Label( - text='正在使用人名单:'+now) - inf.place(relx=0.5, rely=0.6, anchor='center') - for x in f.readlines(): - x = x.strip('\n') - list.append(x) - info = str(len(list)) - f.close() - except: - with open('support/1.txt', 'r') as f: - inf = tkinter.Label( - text='正在使用全体人名单') - inf.place(relx=0.5, rely=0.6, anchor='center') - for x in f.readlines(): - x = x.strip('\n') - list.append(x) - info = str(len(list)) - f.close() - with open('support/journal.log') as c: - jour=[] - for x in c.readlines(): - jour.append(x) - c.close() - for x in range(len(jour) - 1, -1, -1): - if '当前有' in jour[x]: - file_name =jour[x].split('当前有')[1] - episode_name = file_name.split('人')[0] - break - for y in range(len(jour)-1,-1,-1): - if '人名单sha256:' in jour[y]: - fi=jour[y].split('sha256:') - break - zz=file_sha256(r'support/1.txt')+'\n' - try: - try: - if zz != fi[1]: - if rest(): - on_button_click('人名单文件的sha256值\n与上次不一致。\n请确认人名单是否被篡改。\n按确定以继续。', - '') - elif not rest(): - on_button_click('人名单文件的sha256值\n与上次不一致。\n请确认人名单是否被篡改。\n按确定以继续。', - 'pppp') - else: - password = True - except: - log('人名单sha256:' + file_sha256(r'support/1.txt'),'info') - password=True - except: - pass - if (rest()) or (not rest() and password==True): - log('人名单sha256:'+file_sha256(r'support/1.txt'),'info') - log('当前有' + str(len(list)) + '人','info') - password=False - except Exception as e: - on_button_click('没有找到人名单文件或因\n'+str(e),'') - log('人名单文件不存在','info') - schedule('fromchoice') - root.quit() - try: - for z in range(len(jour)-1,-1,-1): - if '操作后sha256:' in jour[z]: - ooo=(jour[z].split('sha256:'))[1] - break - sha=file_sha256(r'support/record.txt')+'\n' - try: - if ooo != sha: - if rest(): - on_button_click('抽中记录的sha256值\n与上次不一致。\n请确认记录是否被篡改。\n按确定以继续。', '') - elif not rest(): - on_button_click('抽中记录的sha256值\n与上次不一致。\n请确认记录是否被篡改。\n按确定以继续。','pppp') - else: - password=True - if (rest()) or (not rest() and password == True): - log('操作后sha256:' + file_sha256(r'support/record.txt'),'info') - password = False - except: - pass - except: - pass - try: - with open('support/config.ini','r+') as file: - for z in file.readlines(): - if '日志处理后sha256:' in jour[z]: - jourlog = (jour[z].split('sha256:'))[1] - break - sha = file_sha256(r'support/journal.log') + '\n' - try: - if jourlog != sha: - if rest(): - on_button_click('日志的sha256值\n与程序自动操作的不一致。\n请确认记录是否被篡改。\n按确定以继续。', - '') - elif not rest(): - on_button_click('日志的sha256值\n与程序自动操作的不一致。\n请确认记录是否被篡改。\n按确定以继续。', - 'pppp') - else: - password = True - if (rest()) or (not rest() and password == True): - log('', 'info') - password = False - except: - pass - except: - pass - try: - if int(episode_name) != len(list): - on_button_click('人名单中的人数\n与上次运行时不一致,\n请检查人名单是否被篡改。\n按确定以继续。','') - for i in set(list): - if list.count(i) > 1: - if on_button_click('在人名单文件中,'+i+'出现了'+str(list.count(i))+'次,\n请检查人名单是否被篡改。\n重复的元素将会引发程序错误,\n在删除重复的元素之前请勿运行此模块。\n按确定以退出。',''): - schedule('fromchoice') - elif i in shouldnot: - on_button_click('人名单中出现不该出现的\n"'+i+'",\n请检查人名单是否被篡改。\n按确定以继续。','') - except: - pass - def stop(r): - global flag, status, list, info, a, chosed, inf - flag = True - status = '开始' - if not rest(): - inf = tkinter.Label( - text='当前有' + info + '人。\n现在处于下课时间,\n抽到的人将不会添加到已抽中列表。') - else: - chosed.append(r) - log('本次抽中' + r,'info') - with open('support/record.txt','a+') as p: - p.write(r+'\n') - p.close() - log('操作后sha256:'+file_sha256(r'support/record.txt'),'info') - inf = tkinter.Label( - text='当前有' + info + '人。历史上已抽中' + str(len(chosed)) + '人。\n在抽中所有人前,抽中的人不会再次出现。') - inf.place(relx=0.5, rely=0.6, anchor='center') - start = tkinter.Button(text=status, command=lambda: main(), font=('宋体', 24), width=20) - start.place(relx=0.5, rely=0.8, anchor='center') - def main(): - global flag, root, list, status, info, a, chosed, inf - try: - inf.destroy() - except: - pass - flag = False - status = '就你了' - start = tkinter.Button(text=status, command=lambda: stop(list[r]), font=('宋体', 24), width=20) - start.place(relx=0.5, rely=0.8, anchor='center') - while not flag: - r = random.randint(0, len(list) - 1) - if len(chosed) == len(list): - chosed.clear() - with open('support/record.txt','a+')as g: - g.truncate(0) - g.close() - log('操作后sha256:' + file_sha256(r'support/record.txt'),'info') - if list[r] not in chosed: - try: - a.destroy() - except: - pass - a = tkinter.Label(text=list[r], width=30, font=('华文行楷', 72)) - a.place(relx=0.5, rely=0.35, anchor='center') - root.update() - time.sleep(0.01) - - flag = False - status = '开始' - inn.destroy() - a = tkinter.Label(text='保持紧张', width=30, font=('华文行楷', 72)) - a.place(relx=0.5, rely=0.35, anchor='center') - start = tkinter.Button(text=status, command=lambda: main(), font=('宋体', 24), width=20) - start.place(relx=0.5, rely=0.8, anchor='center') -def check_resttime(): - global zhou, d - try: - excel = xlrd.open_workbook("support/时刻表.xls") - sheet = excel.sheet_by_index(0) - rows: list = sheet.row_values(0) - index = rows.index('时刻表') - listindes = sheet.col_values(index) - for x in range(1, len(listindes)): - a = listindes[x].split('-') - start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[0], '%Y-%m-%d%H:%M') - end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') - now_time = datetime.datetime.now() - if start_time < now_time < end_time: - delta = end_time - now_time - seconds = delta.total_seconds() - return int(seconds) - return 2400 - except: - return 2400 -def schedule(fr): - global thu,other,zhou,d,canceltopping,photo,label_img,lose,hh,h,no,top,z,speed - root.wm_attributes('-topmost', 0) - z = False - for btn in root.place_slaves(): - btn.destroy() - for btn in root.grid_slaves(): - btn.grid_remove() - if lose==[]: - pass - else: - a='缺少关键组件:\n' - for x in lose: - a=a+x+'\n' - on_button_click(a,'') - lose=[] - if fr=='fromclean': - step_wid = (50 - root.winfo_width()) / speed - step_hei = (500 - root.winfo_height()) / speed - step_x = (root.winfo_x() - (screen_width)) / speed - step_y = ((root.winfo_y() - root.winfo_screenheight() / 2) + 250) / speed - - - for x in range(speed): - wid = root.winfo_width() + step_wid - hei = root.winfo_height() + step_hei - root.geometry( - '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) - root.update() - root.geometry( - '{}x{}+{}+{}'.format(50, 500, screen_width - 50, root.winfo_screenheight() // 2 - 500 // 2)) - elif fr=='fromchoice': - step_wid = (50 - root.winfo_width()) / speed - step_hei = (500 - root.winfo_height()) / speed - step_x = (root.winfo_x() - (screen_width)) / speed - step_y = ((root.winfo_y() - root.winfo_screenheight() / 2) + 250) / speed - - - for x in range(speed): - wid = root.winfo_width() + step_wid - hei = root.winfo_height() + step_hei - root.geometry( - '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) - root.update() - root.geometry( - '{}x{}+{}+{}'.format(50, 500, screen_width - 50, root.winfo_screenheight() // 2 - 500 // 2)) - elif fr=='fromhomework': - step_wid = (50 - root.winfo_width()) / speed - step_hei = (500 - root.winfo_height()) / speed - step_x = (root.winfo_x()-(screen_width)) / speed - step_y = ((root.winfo_y() - root.winfo_screenheight() / 2)+250) / speed - - - for x in range(speed): - wid = root.winfo_width() + step_wid - hei = root.winfo_height() + step_hei - root.geometry( - '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) - root.update() - root.geometry( - '{}x{}+{}+{}'.format(50, 500, screen_width - 50,root.winfo_screenheight() // 2 - 500 // 2)) - root.update() - root.title('课程表') - root.resizable(0, 0) - root.overrideredirect(1) - try: - excel = xlrd.open_workbook("support/课程表.xls") - sheet = excel.sheet_by_index(0) - rows: list = sheet.row_values(0) - index = rows.index(zhou[d.weekday()]) - listindes = sheet.col_values(index) - except: - on_button_click('请确认课程表文件\n存在且格式正确','') - log('课程表文件不存在','error') - root.quit() - - g=0.113 - if len(listindes)==9: - for i in range(1, len(listindes)): - if '/' not in listindes[i]: - zxs = tkinter.Label(text=listindes[i][0], width=15, font=('华文行楷', 40)) - else: - zxs = tkinter.Label(text=listindes[i], width=15, font=('华文行楷', 20)) - zxs.place(relx=0.5, rely=g, anchor='center') - g = g + 0.113 - elif len(listindes)==10: - for i in range(1, len(listindes)): - if '/' not in listindes[i]: - zxs = tkinter.Label(text=listindes[i][0], width=15, font=('华文行楷', 40)) - else: - zxs = tkinter.Label(text=listindes[i], width=15, font=('华文行楷', 20)) - zxs.place(relx=0.5, rely=g, anchor='center') - g = g + 0.093 - else: - for i in range(1, len(listindes)): - if '/' not in listindes[i]: - zxs = tkinter.Label(text=listindes[i][0], width=15, font=('华文行楷', 40)) - else: - zxs = tkinter.Label(text=listindes[i], width=15, font=('华文行楷', 20)) - zxs.place(relx=0.5, rely=g, anchor='center') - g = g + 0.106 - listindes.clear() - y = tkinter.Button(text=zhou[d.weekday()], width=15, command=lambda :choice('fromschedule')) - y.place(relx=0.5, rely=1, anchor='s') - global h - h = tkinter.Button(text='添加作业', command=lambda: homework()) - h.place(relx=0.5, rely=0, anchor='n') - top=tkinter.Toplevel() - top.resizable(0, 0) - top.overrideredirect(1) - top.wm_attributes('-topmost', 1) - top.attributes('-alpha', 0.5) - btn=tkinter.Button(top,text='点名器',command=lambda :choice('fromtab'),font=('宋体',8)) - btn.place(relx=0,rely=0,anchor='nw') - root.update_idletasks() - - btn_width = btn.winfo_width() - btn_height = btn.winfo_height() - - top.geometry("{}x{}".format(btn_width, btn_height)) - root.wm_attributes('-topmost', 0) - root.mainloop() -def clean(): - global fin,a,ll,lose - ll='正在清理文件' - fin=False - a = 0 - current_dir = os.getcwd() - uncommon_dir = os.path.join(current_dir, '不常用的文件') - if not os.path.exists(uncommon_dir): - os.mkdir(uncommon_dir) - one_week_ago = datetime.datetime.now() - datetime.timedelta(days=7) - for filename in os.listdir(current_dir): - filepath = os.path.join(current_dir, filename) - ll='检查'+filepath - ll=filename - if filename == '不常用的文件': - ll = '跳过' + filename - elif filename == '文件归档.py' or filename=='loading.gif' or filename=='smile.jpg' or filename=='课程表.xls' or filename=='时间表.xls' or filename=='1.txt' or filename=='journal.log' or filename=='record.txt'or os.path.isdir(filepath) == 'support' or filename.endswith('.exe') or filename.endswith('.lnk') or filename.endswith('.ini') or ('nodelete' in filename) or ('support' in filename): - ll='跳过'+filename - elif os.path.getmtime(filepath) < one_week_ago.timestamp(): - ll='移动'+filename - try: - shutil.move(filepath, os.path.join(uncommon_dir, filename)) - log('移动了'+filename,'info') - except Exception as e: - log('移动'+str(filename)+'失败,因为'+str(e),'warning') - a = a + 1 - else: - ll=filename+'未到过期时间' - ll='正在检查程序组件' - x=os.listdir('support') - list=['smile.jpg','temp.txt','课程表.xls','时间表.xls','时刻表.xls','1.txt','journal.log','record.txt','config.ini'] - lose=[] - for y in list: - ll='检查'+y - if y in x: - ll='存在'+y - else: - ll='缺少'+y - lose.append(y) - fin=True -def report(): - pass -def ver(): - with open('support/temp.txt') as f: - for x in f.readlines(): - f.seek(0) - if x=='True': - '检测到了True' - return True - return False -def taskmgr(): - windows = pygetwindow.getAllTitles() - for window_title in windows: - try: - window = pygetwindow.getWindowsWithTitle(window_title)[0] - except Exception as e: - log(str(e)+'line 849', 'error') - try: - if window.title == 'Windows 任务管理器' or window.title == '任务管理器' or window.title == 'Windows任务管理器': - tsk = tkinter.Toplevel() - tsk.overrideredirect(1) - tsk.wm_attributes('-topmost', 1) - leb = tkinter.Message(tsk, - text='禁止使用任务管理器,如需使用,请在随机选人模块中验证密码,成功后窗口自动消失(有效期3分钟)。如无密码,关闭任务管理器窗口后此窗口自动消失。此程序无权限关闭任务管理器窗口,请自行在任务栏关闭。', - font=('仿宋', 24)) - leb.place(relx=0.5, rely=0.5, anchor='center') - while not ver(): - try: - tsk.geometry('{}x{}+{}+{}'.format(window.width, window.height, window.left, window.top)) - tsk.update() - time.sleep(0.1) - except: - root.destroy() - break - else: - try: - tsk.destroy() - time.sleep(180) - except: - pass - except Exception as e: - log(str(e)+'line 874', 'error') - time.sleep(1) -def check_score(): - while 1: - if not rest(): - windows = pygetwindow.getAllTitles() - for window_title in windows: - try: - window = pygetwindow.getWindowsWithTitle(window_title)[0] - except Exception as e: - log(e,'error') - try: - if window.title == '成绩单': - window.close() - elif window.title =='任务管理器' or window.title == '任务管理器' or window.title == 'Windows任务管理器': - try: - if t5.isAlive(): - pass - else: - t5 = Thread(target=taskmgr) - t5.start() - except: - t5 = Thread(target=taskmgr) - t5.start() - except Exception as e: - log(str(e)+'line 899', 'error') - time.sleep(0.3) - else: - time.sleep(check_resttime()) -speed=50 -t1 = Thread(target=clean, args=()) -t2 = Thread(target=loading) -t4 = Thread(target=check_score) -t5 = Thread(target=urge) -t1.start() -t2.start() -t4.start() +''' +亲爱的syj: +你可能在这里看到一些匪夷所思的代码,因为有些已经没用的功能,还没来得及删。 +bugs +“设置”是新加的内容,但问题很多,你可以试试。 +“倒计时”的结束时间必须在今天,如果结束时间是第二天会立刻停止,知道原因,但没来得及改。 +“查看并复制”如果一项作业太长,就会显示不全,也知道原因,但懒得改(毕竟可以看word)。 +“查看word”时,如果这个文档正在使用,就会卡白屏,能改,但还没改。 +***“屏蔽任务管理器”模块不知什么原因,在Windows 7上不起作用,但Windows 11可以。(马上期中了,希望火速把这问题改了,要不然就会有一堆人把我程序一关,然后用钉钉查我成绩)*** +虽然bug一堆,但我打算先把留作业的模块的按钮中的文字用标志代替,已经把“确定并保存”按钮改成了标志,但改圆角时失败了。 +移除ttkbootstrap虽然能变成圆角,但太丑了,所以后来又把ttkbootstrap请回来了。 +''' +''' + * _ooOoo_ + * o8888888o + * 88" . "88 + * (| -_- |) + * O\ = /O + * ____/`---'\____ + * . ' \\| |// `. + * / \\||| : |||// \ + * / _||||| -:- |||||- \ + * | | \\\ - /// | | + * | \_| ''\---/'' | | + * \ .-\__ `-` ___/-. / + * ___`. .' /--.--\ `. . __ + * ."" '< `.___\_<|>_/___.' >'"". + * | | : `- \`.;`\ _ /`;.`/ - ` : | | + * \ \ `-. \_ __\ /__ _/ .-` / / + * ======`-.____`-.___\_____/___.-`____.-'====== + * `=---=' + * + * ............................................. + * 万分感谢 + ''' +from threading import Thread +from tkinter import * +from arcade import load_sound,play_sound,stop_sound +import random,tkinter,time,xlrd,datetime,logging,hashlib,os,shutil,pygetwindow,pyperclip +from ttkbootstrap import Style +from tkinter import ttk +from docx import Document +from tkinter import messagebox +from PIL import Image, ImageTk, ImageDraw +def check_pwd(pwd): + global password + password=False + try: + with open('support/config.ini') as v: + for x in v.readlines(): + if 'pwd:' in x: + break + except: + on_button_click('没有找到密码文件','') + pwd='pwd:'+pwd + if pwd==x: + password=True + return True + else: + on_button_click('请检查密码','') + return False +def loading(): + global fin,a,root,screen_width,ll,back,back_photo,up_photo,down_photo,stop_photo,star,star_photo,bigback_photo,paus_photo,cross_photo,speed,save_and_continue_photo,continued_photo + fin=False + style = Style(theme='cosmo') + root = style.master + draggable_window = DraggableWindow(root) + content_frame = ttk.Frame(root) + + screen_width = root.winfo_screenwidth() + root.resizable(0, 0) + root.overrideredirect(1) + back = Image.open("support/back.png") + smallback = back.resize((30, 30)) + back_photo = ImageTk.PhotoImage(smallback) + bigback = Image.open("support/bigback.png") + bigback= bigback.resize((40, 40)) + bigback_photo=ImageTk.PhotoImage(bigback) + up = Image.open("support/up.png") + up = up.resize((40, 40)) + up_photo = ImageTk.PhotoImage(up) + down = Image.open("support/down.png") + down = down.resize((40, 40)) + down_photo = ImageTk.PhotoImage(down) + stop = Image.open("support/stop.png") + stop = stop.resize((40, 40)) + stop_photo = ImageTk.PhotoImage(stop) + star = Image.open("support/star.png") + star = star.resize((40, 40)) + star_photo = ImageTk.PhotoImage(star) + paus = Image.open("support/paus.png") + paus = paus.resize((40, 40)) + paus_photo = ImageTk.PhotoImage(paus) + cross = Image.open("support/cross.png") + cross = cross.resize((20, 20)) + cross_photo = ImageTk.PhotoImage(cross) + save_and_continue = Image.open("support/save_and_continue.png") + save_and_continue = save_and_continue.resize((80, 40)) + save_and_continue_photo = ImageTk.PhotoImage(save_and_continue) + continued = Image.open("support/continue.png") + continued = continued.resize((20, 20)) + continued_photo = ImageTk.PhotoImage(continued) + for x in range(75): + win_width = (4*x)+201 + win_height = (4*x)+1 + win_x = root.winfo_screenwidth() // 2 - win_width // 2 + win_y = root.winfo_screenheight() // 2 - win_height // 2 + root.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) + root.update() + log('正在清理文件','info') + while fin==False: + c = tkinter.Label(text=ll, font=('宋体')) + c.place(relx=0.5, rely=0.8, anchor='center') + time.sleep(0.08) + root.update_idletasks() + root.update() + c.destroy() + else: + try: + c.destroy() + except: + pass + k = tkinter.Label(text='本次共清理了\n' + str(a) + '个文件', font=('宋体', 48)) + log('本次共清理了' + str(a) + '个文件','info') + k.place(relx=0.5, rely=0.5, anchor='center') + root.after(3000, lambda: schedule('fromclean')) + root.mainloop() +def log(content,rate): + if rate=='info': + logging.info(content) + elif rate=='warning': + logging.warning(content) + elif rate=='error': + logging.error(content) + with open('support/config.ini','a+') as f: + a=f.readlines() + for x in range(len(a)): + if '日志处理后sha256' in a[x]: + del f.readlines()[x] + f.write('日志处理后sha256:'+file_sha256(r'support/journal.log')) +def on_button_click(content,pppp): + wait_window = tkinter.Toplevel(root) + wait_window.wm_attributes('-topmost', 1) + win_width = 400 + win_height = 300 + wait_window.overrideredirect(1) + win_x = screen_width - win_width + win_y = wait_window.winfo_screenheight() // 2 - win_height // 2 + wait_window.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) + p = tkinter.Label(wait_window, text=content, font=('仿宋', 24), justify='left') + p.place(rely=0.1, relx=0.5, anchor='n') + pp = tkinter.Button(wait_window, text="确定", command=wait_window.destroy, font=('宋体', 24)) + pp.place(rely=0.8, relx=0.3, anchor='center') + if pppp=='pppp': + ppp = tkinter.Entry(wait_window, width=30,show='*') + ppp.place(relx=0.5, rely=0.6, anchor='center') + pppp=tkinter.Button(wait_window,text='忽略',command=lambda:check_pwd(ppp.get()) and wait_window.destroy(),font=('宋体', 24)) + pppp.place(relx=0.6,rely=0.8,anchor='center') + wait_window.wait_window() + return True + + +class DraggableWindow: + def __init__(self, root): + self.root = root + self.root.bind("", self.start_move) + self.root.bind("", self.stop_move) + self.root.bind("", self.on_move) + self.draggable = False + self.offset = {"x": 0, "y": 0} + + def start_move(self, event): + + if isinstance(event.widget, tkinter.Button) or isinstance(event.widget, tkinter.Text): + return + self.draggable = True + self.offset["x"] = event.x + self.offset["y"] = event.y + + def stop_move(self, event): + + self.draggable = False + + def on_move(self, event): + + if isinstance(event.widget, tkinter.Button) or isinstance(event.widget, tkinter.Text) or isinstance(event.widget, tkinter.Entry): + return + if self.draggable: + x = self.root.winfo_x() + (event.x - self.offset["x"]) + y = self.root.winfo_y() + (event.y - self.offset["y"]) + self.root.geometry(f"+{x}+{y}") +photo=None +info='' +canceltopping=False +d = datetime.datetime.now() +chosed=[] +zhou=['周一','周二','周三','周四','周五','周六','周日'] +shouldnot=[] +logging.basicConfig(filename="support/journal.log", filemode="a+", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt='', level=logging.DEBUG) +def file_hash(file_path: str, hash_method) -> str: + h = hash_method() + with open(file_path, 'rb') as f: + while True: + b = f.read(8192) + if not b: + break + h.update(b) + f.close() + return h.hexdigest() +def file_sha256(file_path: str) -> str: + return file_hash(file_path, hashlib.sha256) +def check_class(): + global zhou,d + try: + excel = xlrd.open_workbook("support/时刻表.xls") + sheet = excel.sheet_by_index(0) + rows: list = sheet.row_values(0) + index = rows.index('时刻表') + listindes = sheet.col_values(index) + for x in range(1, len(listindes)): + a = listindes[x].split('-') + start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[0], '%Y-%m-%d%H:%M') + end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') + now_time = datetime.datetime.now() + if start_time < now_time < end_time: + excel = xlrd.open_workbook("support/课程表.xls") + sheet = excel.sheet_by_index(0) + rows: list = sheet.row_values(0) + index = rows.index(zhou[d.weekday()]) + listindes = sheet.col_values(index) + return listindes[x] + return False + except: + return False +def rest(): + try: + excel = xlrd.open_workbook("support/时间表.xls") + sheet = excel.sheet_by_index(0) + rows: list = sheet.row_values(0) + index = rows.index('时间表') + listindes = sheet.col_values(index) + for x in range(1, len(listindes)): + a = listindes[x].split('-') + start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[0], '%Y-%m-%d%H:%M') + end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') + now_time = datetime.datetime.now() + if start_time < now_time < end_time: + return True + return False + except: + return False +def verify_pwd(): + global password + wait_window = tkinter.Toplevel(root) + win_width = 400 + win_height = 300 + wait_window.overrideredirect(1) + win_x = screen_width - win_width + win_y = wait_window.winfo_screenheight() // 2 - win_height // 2 + wait_window.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) + p = tkinter.Label(wait_window, text="验证密码\n成功后可打开任务管理器", font=('仿宋', 24), justify='left') + p.place(rely=0.1, relx=0.5, anchor='n') + pp = tkinter.Button(wait_window, text="取消", command=wait_window.destroy, font=('宋体', 24)) + pp.place(rely=0.8, relx=0.3, anchor='center') + ppp = tkinter.Entry(wait_window, width=30, show='*') + ppp.place(relx=0.5, rely=0.6, anchor='center') + pppp = tkinter.Button(wait_window, text='验证', command=lambda: check_pwd(ppp.get()) and wait_window.destroy(), + font=('宋体', 24)) + pppp.place(relx=0.6, rely=0.8, anchor='center') + wait_window.wait_window() + if password==True: + with open('support/temp','w+') as f: + f.write('True') + + password=False + return True +def urge(): + global toplevel,pressed_f4 + time.sleep(10) + pressed_f4 = False + subj=['语文','数学','英语','物理','化学','政治'] + def do_exit(): + global pressed_f4 + if pressed_f4: + pressed_f4 = False + toplevel.destroy() + def alt_f4(event): + global pressed_f4 + pressed_f4 = True + + with open('support/info.txt','r+') as f: + for x in f.readlines(): + if '晚自习' in x: + break + a = x.split(':') + toplevel = tkinter.Toplevel() + toplevel.geometry('{}x{}+{}+{}'.format(screen_width-2, toplevel.winfo_screenheight()-2, 0, 0)) + toplevel.resizable(0, 0) + toplevel.overrideredirect(1) + toplevel.wm_attributes('-topmost', 1) + toplevel.protocol("WM_DELETE_WINDOW") + toplevel.bind('', alt_f4) + toplevel.protocol("WM_DELETE_WINDOW", do_exit) + toplevel.configure(bg='white') + toplevel.wm_attributes('-transparentcolor', 'white') + flag=True + while flag: + start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') + now_time = datetime.datetime.now() + while start_time < now_time and flag: + urg = [] + subjects = open('support/subjects', 'r').read().splitlines() + for i, subject in enumerate(subjects): + if str(d.date()) + subject in os.listdir('support/homework/') and (not subject in urg): + with open('support/homework/' + str(d.date()) + subject, 'r+') as f: + if f.readlines() != []: + pass + elif subject in subj: + urg.append(subject) + else: + if (not subject in urg) and (subject in subj): + urg.append(subject) + for btn in toplevel.place_slaves(): + btn.destroy() + for x in urg: + if z==False: + tkinter.Button(toplevel, text=x + '课代表速留作业', font=('宋体', 30)).place(relx=random.uniform(0, 1), + rely=random.uniform(0, 1)) + if urg==[]: + flag=False + toplevel.update() + time.sleep(1) + else: + delta = start_time - now_time + seconds = delta.total_seconds() + time.sleep(seconds) +z=False +def countdown(): + global speed + for btn in root.place_slaves(): + btn.destroy() + + def returnforpaused(whattime): + current_time = datetime.datetime.now().time() + current_datetime = datetime.datetime.combine(datetime.date.today(), current_time) + future_datetime = current_datetime + whattime + future_time = future_datetime.time().replace(microsecond=0) + return future_time + + def paused(whattime): + global flag,star_photo + flag = False + pause = tkinter.Button(image=star_photo, command=lambda: updated(returnforpaused(whattime)), font=('宋体', 30)) + pause.grid(column=0, row=3, sticky='nsew') + + def updated(future_time): + global starttime, flag,bigback_photo,stop_photo,paus_photo + flag = True + for child in root.grid_slaves(): + child.grid_remove() + time1 = datetime.time(int(str(future_time).split(':')[0]), int(str(future_time).split(':')[1]), + int(str(future_time).split(':')[2])) + datetime1 = datetime.datetime.combine(datetime.date.today(), time1) + current_time = datetime.datetime.now().time() + pause = tkinter.Button(image=paus_photo, command=lambda: paused( + datetime1 - datetime.datetime.combine(datetime.date.today(), current_time).replace(microsecond=0)), + font=('宋体', 30)) + pause.grid(column=0, row=3, sticky='nsew') + cancel = tkinter.Button(image=stop_photo,command=lambda: welcome(), font=('宋体', 30)) + cancel.grid(column=1, row=3, sticky='nsew') + back = tkinter.Button(image=bigback_photo,command=lambda: schedule('fromclean'), font=('宋体', 30),height=60) + back.grid(column=2, row=3, sticky='nsew') + while flag == True and datetime.datetime.now().time() <= ( + datetime.time(int(str(future_time).split(':')[0]), int(str(future_time).split(':')[1]), + int(str(future_time).split(':')[2]))): + current_time = datetime.datetime.now().time() + datetime2 = datetime.datetime.combine(datetime.date.today(), current_time) + time_difference = datetime1 - datetime2 + hours = time_difference.seconds // 3600 + minutes = (time_difference.seconds % 3600) // 60 + seconds = time_difference.seconds % 60 + tkinter.Label(text=str(hours).zfill(2), font=('宋体', 50)).grid(column=0, row=1, sticky='nsew') + tkinter.Label(text=str(minutes).zfill(2), font=('宋体', 50)).grid(column=1, row=1, sticky='nsew') + tkinter.Label(text=str(seconds).zfill(2), font=('宋体', 50)).grid(column=2, row=1, sticky='nsew') + root.update() + time.sleep(1) + else: + if flag == False: + pass + else: + finishing() + + def finishing(): + global bigback_photo + for child in root.grid_slaves(): + child.grid_remove() + tkinter.Label(text='时间到了', font=('华文行楷', 50)).grid(column=0, columnspan=3, row=1, sticky='nsew') + cancel = tkinter.Button(text='确定', command=lambda: stop_sound(player) | welcome(), font=('宋体', 30)) + cancel.grid(column=0, row=3, sticky='nsew') + back = tkinter.Button(image=bigback_photo, command=lambda: stop_sound(player) | schedule('fromclean'), font=('宋体', 30),height=60) + back.grid(column=2, row=3, sticky='nsew') + sound = load_sound("support/sound.mp3") + player = play_sound(sound) + + def start(): + remain = hour * 60 * 60 + minute * 60 + second + current_time = datetime.datetime.now().time() + current_datetime = datetime.datetime.combine(datetime.date.today(), current_time) + future_datetime = current_datetime + datetime.timedelta(seconds=remain) + future_time = future_datetime.time().replace(microsecond=0) + updated(future_time) + + def times(unit, way): + global hour, minute, second, root + if unit == 'hour': + if way == '+': + if hour >= 23: + pass + else: + hour = hour + 1 + elif way == '-': + if hour <= 0: + pass + else: + hour = hour - 1 + elif unit == 'minute': + if way == '+': + if minute >= 59 and hour < 23: + hour = hour + 1 + minute = minute % 59 + elif minute >= 59 and hour >= 23: + pass + else: + minute = minute + 1 + elif way == '-': + if minute <= 0: + pass + else: + minute = minute - 1 + elif unit == 'second': + if way == '+': + if second >= 59 and minute < 59: + minute = minute + 1 + second = second % 59 + elif second >= 59 and minute >= 59 and hour < 23: + hour = hour + 1 + second = second % 59 + minute = minute % 59 + elif second >= 59 and minute >= 59 and hour >= 23: + pass + else: + second = second + 1 + elif way == '-': + if second <= 0: + pass + else: + second = second - 1 + tkinter.Label(text=str(hour).zfill(2), font=('宋体', 50)).grid(column=0, row=1, sticky='nsew') + tkinter.Label(text=str(minute).zfill(2), font=('宋体', 50)).grid(column=1, row=1, sticky='nsew') + tkinter.Label(text=str(second).zfill(2), font=('宋体', 50)).grid(column=2, row=1, sticky='nsew') + root.update() + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, weight=1) + root.grid_columnconfigure(2, weight=1) + step_wid = (500 - root.winfo_width()) / speed + step_hei = (300 - root.winfo_height()) / speed + step_x = (root.winfo_x() - (root.winfo_screenwidth() // 2 - 500 / 2)) / speed + step_y = (root.winfo_y() - (root.winfo_screenheight() // 2 - 300 / 2)) / speed + for x in range(speed): + wid = root.winfo_width() + step_wid + hei = root.winfo_height() + step_hei + root.geometry( + '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) + root.update() + root.geometry( + '{}x{}+{}+{}'.format(500, 300, int(root.winfo_screenwidth() // 2 - 500 / 2), int(root.winfo_screenheight() // 2 - 300 / 2))) + def welcome(): + global starttime, hour, minute, second, flag,up_photo,down_photo,bigback_photo + for child in root.grid_slaves(): + child.grid_remove() + hour = 0 + minute = 0 + second = 0 + flag = False + tkinter.Button(image=up_photo, command=lambda: times('hour', '+'), font=('宋体', 30),height=60).grid(column=0, row=0, + sticky='nsew') + tkinter.Button(image=up_photo, command=lambda: times('minute', '+'), font=('宋体', 30)).grid(column=1, row=0, + sticky='nsew') + tkinter.Button(image=up_photo, command=lambda: times('second', '+'), font=('宋体', 30)).grid(column=2, row=0, + sticky='nsew') + tkinter.Button(image=down_photo, command=lambda: times('hour', '-'), font=('宋体', 30),height=60).grid(column=0, row=2, + sticky='nsew') + tkinter.Button(image=down_photo, command=lambda: times('minute', '-'), font=('宋体', 30)).grid(column=1, row=2, + sticky='nsew') + tkinter.Button(image=down_photo, command=lambda: times('second', '-'), font=('宋体', 30)).grid(column=2, row=2,sticky='nsew') + tkinter.Label(text=str(hour).zfill(2), font=('宋体', 50)).grid(column=0, row=1, sticky='nsew') + tkinter.Label(text=str(minute).zfill(2), font=('宋体', 50)).grid(column=1, row=1, sticky='nsew') + tkinter.Label(text=str(second).zfill(2), font=('宋体', 50)).grid(column=2, row=1, sticky='nsew') + starttime = tkinter.Button(image=star_photo, command=lambda: start(), font=('宋体', 30),height=60) + starttime.grid(column=0, row=3, columnspan=2, sticky='nsew') + back = tkinter.Button(image=bigback_photo, command=lambda: schedule('fromclean'), font=('宋体', 30)) + back.grid(column=2, row=3, sticky='nsew') + root.mainloop() + welcome() +def homework(): + global z,toplevel,back_photo,speed + z=True + image = Image.open("support/smile.jpg") + photo = ImageTk.PhotoImage(image) + def look(): + global cross_photo + for child in root.grid_slaves(): + child.grid_remove() + for t in root.place_slaves(): + t.destroy() + tkinter.Button(root, image=cross_photo, command=lambda: schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') + work=[] + copylist = '' + subjects = open('support/subjects', 'r').read().splitlines() + for i, subject in enumerate(subjects): + if str(d.date()) + subject in os.listdir('support/homework/'): + with open('support/homework/' + str(d.date()) + subject, 'r+') as f: + work.append(subject+':') + copylist = copylist + subject + l=1 + for x in f.readlines(): + work.append(x) + copylist = copylist + str(l)+')'+ x + l=l+1 + copylist = copylist + '\n' + pyperclip.copy(copylist) + i=9 + doc = Document() + paragraph3 = doc.add_paragraph() + paragraph3.add_run(copylist) + doc.save('support/'+str(d.date())+'作业.docx') + tkinter.Message(root,text=copylist,font=('黑体', 24)).grid(column=i,row=0,pady=30,ipadx=root.winfo_width()) + + tkinter.Button(root, text='查看word',command=lambda :os.startfile(os.path.normpath('support/'+str(d.date())+'作业.docx'))).place(relx=0,rely=1,anchor='sw') + tkinter.Button(root, image=back_photo, command=lambda: choice_subject()).place(relx=0, rely=0, + anchor='nw') + + root.update() + def add_subject(a): + with open('support/subjects', 'r+') as h: + if a+'\n' in h.readlines(): + tkinter.messagebox.showwarning('已存在',a+'已存在') + h.close() + elif a == '': + return False + else: + with open('support/subjects', 'a+') as g: + g.write(str(a) + '\n') + g.close() + choice_book(a) + def add_work_write(sub,book,info): + global label_img + with open('support/homework/'+str(d.date())+sub,'a+') as f: + f.write(book+info+'\n') + pass + try: + label_img = tkinter.Label(root, image=photo, width=30, height=30) + label_img.place(relx=0,rely=1,anchor='sw') + root.update() + add_work(sub,book) + except: + pass + def delete_homework(sub,subject,book): + with open('support/homework/'+str(d.date())+sub, 'r') as file: + lines = file.readlines() + + for i, line in enumerate(lines): + if line.strip() == subject: + del lines[i] + break + + with open('support/homework/'+str(d.date())+sub, 'w') as file: + file.writelines(lines) + add_work(sub,book) + + def handle_return(event): + if event.keysym == 'Return': + return 'break' + def add_work(sub,book): + global cross_photo + for child in root.grid_slaves(): + child.grid_remove() + for t in root.place_slaves(): + t.destroy() + try: + subjects = open('support/homework/'+str(d.date())+sub, 'r+').read().splitlines() + except: + with open('support/homework/'+str(d.date())+sub, 'w+') as f: + pass + subjects = open('support/homework/'+str(d.date())+sub, 'r+').read().splitlines() + i=2 + for i, subject in enumerate(subjects): + print('到这儿了') + button = tkinter.Label(root, text=subject,justify='left',wraplength=160) + button.grid(row=i + 1, column=0, ipadx=50, pady=5,sticky='w') + button = tkinter.Button(root, image=cross_photo,command=lambda subject=subject: delete_homework(sub,subject,book)) + button.grid(row=i + 1, column=1, ipadx=1, pady=5) + print('到这儿了') + tkinter.Button(root, image=back_photo, command=lambda: choice_book(sub)).place(relx=0, rely=0, + anchor='nw') + tkinter.Label(root, text=sub+' '+book+'\n' +'请输入具体页数或题号').grid(row=0, column=0, ipadx=15, pady=10, columnspan=3) + ppp = tkinter.Text(root, width=20,height=20) + ppp.bind('', handle_return) + ppp.grid(row=i+2, column=0, ipadx=30,sticky='e',padx=10) + tkinter.Button(root, image=save_and_continue_photo, command=lambda: add_work_write(sub,book,ppp.get(1.0,END).strip()),bg='white',activebackground='white',fg='white').grid(row=i+3, + column=0, + ipadx=15, pady=10) + tkinter.Button(root, text='X', command=lambda: schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') + try: + root.after(3000,lambda :label_img.destroy()) + except: + pass + def add_book(sub,book): + with open('support/' + sub, 'r+') as f: + if book == '': + return False + elif book+'\n' in f.readlines(): + tkinter.messagebox.showwarning('已存在', book + '已存在') + else: + with open('support/' + sub, 'a+') as g: + g.write(book + '\n') + g.close() + f.close() + add_work(sub,book) + def choice_book(sub): + for child in root.grid_slaves(): + child.grid_remove() + for t in root.place_slaves(): + t.destroy() + try: + subjects = open('support/'+sub, 'r+').read().splitlines() + except: + with open('support/'+sub, 'w+') as f: + f.write('') + f.close() + subjects = open('support/' + sub, 'r+').read().splitlines() + i=2 + tkinter.Button(root, text='X', command=lambda: schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') + tkinter.Label(root, text='\n\n'+sub + '\n' + '选择或输入书名或卷名\n可将此栏目中的内容添加为常用书').grid(row=0, column=0, + ipadx=15, + pady=10, + columnspan=3) + for i, subject in enumerate(subjects): + button = tkinter.Button(root, text=subject, + command=lambda subject=subject: add_work(sub,subject)) + button.grid(row=i + 1, column=0, ipadx=15, pady=10, columnspan=3) + tkinter.Button(root, image=back_photo, command=lambda: choice_subject()).place(relx=0, rely=0, + anchor='nw') + ppp = tkinter.Entry(root, width=10) + ppp.grid(row=i + 2, column=0, ipadx=15,columnspan=3) + tkinter.Button(root, text='确定并保存为常用书', command=lambda: add_book(sub,ppp.get())).grid(row=i + 3, column=0, + ipadx=15, pady=10,columnspan=3) + tkinter.Button(root, text='确定', command=lambda: add_work(sub,ppp.get())).grid(row=i + 4, + column=0, + ipadx=15, pady=10,columnspan=3) + root.update() + pass + def window_close_handle(): + global z,toplevel + z=False + root.destroy() + try: + toplevel.overrideredirect(1) + except: + pass + for x in root.place_slaves(): + x.place_forget() + root.title('添加作业') + root.protocol('WM_DELETE_WINDOW', window_close_handle) + root.update() + win_width = 300 + win_height = 800 + step_wid=(300-root.winfo_width())/speed + step_hei=(800-root.winfo_height())/speed + win_x = screen_width - win_width + win_y = root.winfo_screenheight() // 2 - win_height // 2 + step_x = ((screen_width - win_width) - root.winfo_x()) / speed + step_y = ((root.winfo_screenheight() // 2 - win_height // 2) - root.winfo_y()) / speed + for x in range(speed): + wid=root.winfo_width()+step_wid + hei=root.winfo_height()+step_hei + root.geometry('{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x()+step_x), int(root.winfo_y()+step_y))) + root.update() + root.winfo_x(), root.winfo_y(), root.winfo_width(), root.winfo_height() + i = 2 + j = 0.2 + + def choice_subject(): + root.grid_rowconfigure(1, weight=0) + root.grid_columnconfigure(0, weight=0) + root.grid_columnconfigure(1, weight=0) + root.grid_columnconfigure(2, weight=0) + global z + for child in root.grid_slaves(): + child.grid_remove() + for t in root.place_slaves(): + t.destroy() + tkinter.Button(root, text='X', command=lambda :schedule('fromhomework')).place(relx=1, rely=0, anchor='ne') + subjects = open('support/subjects', 'r').read().splitlines() + for i, subject in enumerate(subjects): + tkinter.Label(root, text='请选择科目').grid(row=0, column=0, ipadx=15, pady=10, columnspan=2) + button = tkinter.Button(root, text=subject, + command=lambda subject=subject: choice_book(subject)) + button.grid(row=i + 1, column=0, ipadx=15, pady=10, columnspan=2) + ppp = tkinter.Entry(root, width=10) + ppp.grid(row=i + 2, column=0, ipadx=15) + tkinter.Button(root, text='下一项(自动保存)', command=lambda: add_subject(ppp.get())).grid(row=i + 2, column=1, + ipadx=15, pady=10) + tkinter.Button(root, text='查看并复制', command=lambda: look()).place(relx=1, rely=1, anchor='se') + root.update() + choice_subject() +def settings(): + global speed + for btn in root.place_slaves(): + btn.destroy() + for x in root.grid_slaves(): + x.grid_remove() + def speed(x): + global speed + speed=int(x) + print(speed) + print(speed) + tkinter.Label(root, text='动画速度').grid(row=0, column=0) + spe=tkinter.Entry(root, width=30) + spe.grid(row=0, column=1) + tkinter.Button(root, text='确定', command=lambda: speed(spe.get())).grid(row=0, column=2) + tkinter.Button(root, text='X', command=lambda: schedule('fromchoice')).place(relx=1, rely=0, anchor='ne') +def choice(fromwhere): + global info,canceltopping,zhou,h,d,photo,label_img,chosed,shouldnot,password,speed + root.wm_attributes('-topmost', 1) + top.destroy() + for btn in root.place_slaves(): + btn.destroy() + for x in root.grid_slaves(): + x.grid_remove() + if not check_class(): + now='1' + else: + now=check_class() + root.overrideredirect(1) + if fromwhere=='fromschedule': + step_wid = (400 - root.winfo_width()) / speed + step_hei = (root.winfo_height() - 300) / speed + win_width = 400 + win_height = 300 + win_x = screen_width - win_width + win_y = root.winfo_screenheight() // 2 - win_height // 2 + step_x = ((screen_width - win_width) - root.winfo_x()) / speed + step_y = ((root.winfo_screenheight() // 2 - win_height // 2)-root.winfo_y()) / speed + for x in range(speed): + wid = root.winfo_width() + step_wid + hei = root.winfo_height() - step_hei + root.geometry( + '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() + step_x), int(root.winfo_y() + step_y))) + root.update() + root.geometry('{}x{}+{}+{}'.format(win_width, win_height, win_x, win_y)) + elif fromwhere=='fromtab': + step_wid = (400 - root.winfo_width()) / speed + step_hei = (root.winfo_height() - 300) / speed + step_x = root.winfo_x()/ speed + step_y = root.winfo_y()/ speed + for x in range(speed): + wid = root.winfo_width() + step_wid + hei = root.winfo_height() - step_hei + root.geometry( + '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) + root.update() + root.geometry('{}x{}+{}+{}'.format(400, 300, 0, 0)) + root.update() + root.title('随机选人') + global list + list = [] + status = '开始' + back = tkinter.Button(text='返回', command=lambda: schedule('fromchoice')) + back.place(relx=1, rely=0, anchor='ne') + verify = tkinter.Button(text='倒计时', command=lambda: countdown()) + verify.place(relx=0, rely=0, anchor='nw') + set = tkinter.Button(text='设置', command=lambda: settings()) + set.place(relx=0.5, rely=0, anchor='n') + root.update() + inn = tkinter.Label(text='正在处理……') + inn.place(relx=0.5, rely=0.5, anchor='center') + with open('support/record.txt','r') as k: + for re in k.readlines(): + if not re.strip('\n') in chosed: + chosed.append(re.strip('\n')) + k.close() + try: + try: + with open('support/' + now + '.txt', 'r') as f: + inf = tkinter.Label( + text='正在使用人名单:'+now) + inf.place(relx=0.5, rely=0.6, anchor='center') + for x in f.readlines(): + x = x.strip('\n') + list.append(x) + info = str(len(list)) + f.close() + except: + with open('support/1.txt', 'r') as f: + inf = tkinter.Label( + text='正在使用全体人名单') + inf.place(relx=0.5, rely=0.6, anchor='center') + for x in f.readlines(): + x = x.strip('\n') + list.append(x) + info = str(len(list)) + f.close() + with open('support/journal.log') as c: + jour=[] + for x in c.readlines(): + jour.append(x) + c.close() + for x in range(len(jour) - 1, -1, -1): + if '当前有' in jour[x]: + file_name =jour[x].split('当前有')[1] + episode_name = file_name.split('人')[0] + break + for y in range(len(jour)-1,-1,-1): + if '人名单sha256:' in jour[y]: + fi=jour[y].split('sha256:') + break + zz=file_sha256(r'support/1.txt')+'\n' + try: + try: + if zz != fi[1]: + if rest(): + on_button_click('人名单文件的sha256值\n与上次不一致。\n请确认人名单是否被篡改。\n按确定以继续。', + '') + elif not rest(): + on_button_click('人名单文件的sha256值\n与上次不一致。\n请确认人名单是否被篡改。\n按确定以继续。', + 'pppp') + else: + password = True + except: + log('人名单sha256:' + file_sha256(r'support/1.txt'),'info') + password=True + except: + pass + if (rest()) or (not rest() and password==True): + log('人名单sha256:'+file_sha256(r'support/1.txt'),'info') + log('当前有' + str(len(list)) + '人','info') + password=False + except Exception as e: + on_button_click('没有找到人名单文件或因\n'+str(e),'') + log('人名单文件不存在','info') + schedule('fromchoice') + root.quit() + try: + for z in range(len(jour)-1,-1,-1): + if '操作后sha256:' in jour[z]: + ooo=(jour[z].split('sha256:'))[1] + break + sha=file_sha256(r'support/record.txt')+'\n' + try: + if ooo != sha: + if rest(): + on_button_click('抽中记录的sha256值\n与上次不一致。\n请确认记录是否被篡改。\n按确定以继续。', '') + elif not rest(): + on_button_click('抽中记录的sha256值\n与上次不一致。\n请确认记录是否被篡改。\n按确定以继续。','pppp') + else: + password=True + if (rest()) or (not rest() and password == True): + log('操作后sha256:' + file_sha256(r'support/record.txt'),'info') + password = False + except: + pass + except: + pass + try: + with open('support/config.ini','r+') as file: + for z in file.readlines(): + if '日志处理后sha256:' in jour[z]: + jourlog = (jour[z].split('sha256:'))[1] + break + sha = file_sha256(r'support/journal.log') + '\n' + try: + if jourlog != sha: + if rest(): + on_button_click('日志的sha256值\n与程序自动操作的不一致。\n请确认记录是否被篡改。\n按确定以继续。', + '') + elif not rest(): + on_button_click('日志的sha256值\n与程序自动操作的不一致。\n请确认记录是否被篡改。\n按确定以继续。', + 'pppp') + else: + password = True + if (rest()) or (not rest() and password == True): + log('', 'info') + password = False + except: + pass + except: + pass + try: + if int(episode_name) != len(list): + on_button_click('人名单中的人数\n与上次运行时不一致,\n请检查人名单是否被篡改。\n按确定以继续。','') + for i in set(list): + if list.count(i) > 1: + if on_button_click('在人名单文件中,'+i+'出现了'+str(list.count(i))+'次,\n请检查人名单是否被篡改。\n重复的元素将会引发程序错误,\n在删除重复的元素之前请勿运行此模块。\n按确定以退出。',''): + schedule('fromchoice') + elif i in shouldnot: + on_button_click('人名单中出现不该出现的\n"'+i+'",\n请检查人名单是否被篡改。\n按确定以继续。','') + except: + pass + def stop(r): + global flag, status, list, info, a, chosed, inf + flag = True + status = '开始' + if not rest(): + inf = tkinter.Label( + text='当前有' + info + '人。\n现在处于下课时间,\n抽到的人将不会添加到已抽中列表。') + else: + chosed.append(r) + log('本次抽中' + r,'info') + with open('support/record.txt','a+') as p: + p.write(r+'\n') + p.close() + log('操作后sha256:'+file_sha256(r'support/record.txt'),'info') + inf = tkinter.Label( + text='当前有' + info + '人。历史上已抽中' + str(len(chosed)) + '人。\n在抽中所有人前,抽中的人不会再次出现。') + inf.place(relx=0.5, rely=0.6, anchor='center') + start = tkinter.Button(text=status, command=lambda: main(), font=('宋体', 24), width=20) + start.place(relx=0.5, rely=0.8, anchor='center') + def main(): + global flag, root, list, status, info, a, chosed, inf + try: + inf.destroy() + except: + pass + flag = False + status = '就你了' + start = tkinter.Button(text=status, command=lambda: stop(list[r]), font=('宋体', 24), width=20) + start.place(relx=0.5, rely=0.8, anchor='center') + while not flag: + r = random.randint(0, len(list) - 1) + if len(chosed) == len(list): + chosed.clear() + with open('support/record.txt','a+')as g: + g.truncate(0) + g.close() + log('操作后sha256:' + file_sha256(r'support/record.txt'),'info') + if list[r] not in chosed: + try: + a.destroy() + except: + pass + a = tkinter.Label(text=list[r], width=30, font=('华文行楷', 72)) + a.place(relx=0.5, rely=0.35, anchor='center') + root.update() + time.sleep(0.01) + + flag = False + status = '开始' + inn.destroy() + a = tkinter.Label(text='保持紧张', width=30, font=('华文行楷', 72)) + a.place(relx=0.5, rely=0.35, anchor='center') + start = tkinter.Button(text=status, command=lambda: main(), font=('宋体', 24), width=20) + start.place(relx=0.5, rely=0.8, anchor='center') +def check_resttime(): + global zhou, d + try: + excel = xlrd.open_workbook("support/时刻表.xls") + sheet = excel.sheet_by_index(0) + rows: list = sheet.row_values(0) + index = rows.index('时刻表') + listindes = sheet.col_values(index) + for x in range(1, len(listindes)): + a = listindes[x].split('-') + start_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[0], '%Y-%m-%d%H:%M') + end_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + a[1], '%Y-%m-%d%H:%M') + now_time = datetime.datetime.now() + if start_time < now_time < end_time: + delta = end_time - now_time + seconds = delta.total_seconds() + return int(seconds) + return 2400 + except: + return 2400 +def schedule(fr): + global thu,other,zhou,d,canceltopping,photo,label_img,lose,hh,h,no,top,z,speed + root.wm_attributes('-topmost', 0) + z = False + for btn in root.place_slaves(): + btn.destroy() + for btn in root.grid_slaves(): + btn.grid_remove() + if lose==[]: + pass + else: + a='缺少关键组件:\n' + for x in lose: + a=a+x+'\n' + on_button_click(a,'') + lose=[] + if fr=='fromclean': + step_wid = (50 - root.winfo_width()) / speed + step_hei = (500 - root.winfo_height()) / speed + step_x = (root.winfo_x() - (screen_width)) / speed + step_y = ((root.winfo_y() - root.winfo_screenheight() / 2) + 250) / speed + + + for x in range(speed): + wid = root.winfo_width() + step_wid + hei = root.winfo_height() + step_hei + root.geometry( + '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) + root.update() + root.geometry( + '{}x{}+{}+{}'.format(50, 500, screen_width - 50, root.winfo_screenheight() // 2 - 500 // 2)) + elif fr=='fromchoice': + step_wid = (50 - root.winfo_width()) / speed + step_hei = (500 - root.winfo_height()) / speed + step_x = (root.winfo_x() - (screen_width)) / speed + step_y = ((root.winfo_y() - root.winfo_screenheight() / 2) + 250) / speed + + + for x in range(speed): + wid = root.winfo_width() + step_wid + hei = root.winfo_height() + step_hei + root.geometry( + '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) + root.update() + root.geometry( + '{}x{}+{}+{}'.format(50, 500, screen_width - 50, root.winfo_screenheight() // 2 - 500 // 2)) + elif fr=='fromhomework': + step_wid = (50 - root.winfo_width()) / speed + step_hei = (500 - root.winfo_height()) / speed + step_x = (root.winfo_x()-(screen_width)) / speed + step_y = ((root.winfo_y() - root.winfo_screenheight() / 2)+250) / speed + + + for x in range(speed): + wid = root.winfo_width() + step_wid + hei = root.winfo_height() + step_hei + root.geometry( + '{}x{}+{}+{}'.format(int(wid), int(hei), int(root.winfo_x() - step_x), int(root.winfo_y() - step_y))) + root.update() + root.geometry( + '{}x{}+{}+{}'.format(50, 500, screen_width - 50,root.winfo_screenheight() // 2 - 500 // 2)) + root.update() + root.title('课程表') + root.resizable(0, 0) + root.overrideredirect(1) + try: + excel = xlrd.open_workbook("support/课程表.xls") + sheet = excel.sheet_by_index(0) + rows: list = sheet.row_values(0) + index = rows.index(zhou[d.weekday()]) + listindes = sheet.col_values(index) + except: + on_button_click('请确认课程表文件\n存在且格式正确','') + log('课程表文件不存在','error') + root.quit() + + g=0.113 + if len(listindes)==9: + for i in range(1, len(listindes)): + if '/' not in listindes[i]: + zxs = tkinter.Label(text=listindes[i][0], width=15, font=('华文行楷', 40)) + else: + zxs = tkinter.Label(text=listindes[i], width=15, font=('华文行楷', 20)) + zxs.place(relx=0.5, rely=g, anchor='center') + g = g + 0.113 + elif len(listindes)==10: + for i in range(1, len(listindes)): + if '/' not in listindes[i]: + zxs = tkinter.Label(text=listindes[i][0], width=15, font=('华文行楷', 40)) + else: + zxs = tkinter.Label(text=listindes[i], width=15, font=('华文行楷', 20)) + zxs.place(relx=0.5, rely=g, anchor='center') + g = g + 0.093 + else: + for i in range(1, len(listindes)): + if '/' not in listindes[i]: + zxs = tkinter.Label(text=listindes[i][0], width=15, font=('华文行楷', 40)) + else: + zxs = tkinter.Label(text=listindes[i], width=15, font=('华文行楷', 20)) + zxs.place(relx=0.5, rely=g, anchor='center') + g = g + 0.106 + listindes.clear() + y = tkinter.Button(text=zhou[d.weekday()], width=15, command=lambda :choice('fromschedule')) + y.place(relx=0.5, rely=1, anchor='s') + global h + h = tkinter.Button(text='添加作业', command=lambda: homework()) + h.place(relx=0.5, rely=0, anchor='n') + top=tkinter.Toplevel() + top.resizable(0, 0) + top.overrideredirect(1) + top.wm_attributes('-topmost', 1) + top.attributes('-alpha', 0.5) + btn=tkinter.Button(top,text='点名器',command=lambda :choice('fromtab'),font=('宋体',8)) + btn.place(relx=0,rely=0,anchor='nw') + root.update_idletasks() + + btn_width = btn.winfo_width() + btn_height = btn.winfo_height() + + top.geometry("{}x{}".format(btn_width, btn_height)) + root.wm_attributes('-topmost', 0) + root.mainloop() +def clean(): + global fin,a,ll,lose + ll='正在清理文件' + fin=False + a = 0 + current_dir = os.getcwd() + uncommon_dir = os.path.join(current_dir, '不常用的文件') + if not os.path.exists(uncommon_dir): + os.mkdir(uncommon_dir) + one_week_ago = datetime.datetime.now() - datetime.timedelta(days=7) + for filename in os.listdir(current_dir): + filepath = os.path.join(current_dir, filename) + ll='检查'+filepath + ll=filename + if filename == '不常用的文件': + ll = '跳过' + filename + elif filename == '文件归档.py' or filename=='loading.gif' or filename=='smile.jpg' or filename=='课程表.xls' or filename=='时间表.xls' or filename=='1.txt' or filename=='journal.log' or filename=='record.txt'or os.path.isdir(filepath) == 'support' or filename.endswith('.exe') or filename.endswith('.lnk') or filename.endswith('.ini') or ('nodelete' in filename) or ('support' in filename): + ll='跳过'+filename + elif os.path.getmtime(filepath) < one_week_ago.timestamp(): + ll='移动'+filename + try: + shutil.move(filepath, os.path.join(uncommon_dir, filename)) + log('移动了'+filename,'info') + except Exception as e: + log('移动'+str(filename)+'失败,因为'+str(e),'warning') + a = a + 1 + else: + ll=filename+'未到过期时间' + ll='正在检查程序组件' + x=os.listdir('support') + list=['smile.jpg','temp.txt','课程表.xls','时间表.xls','时刻表.xls','1.txt','journal.log','record.txt','config.ini'] + lose=[] + for y in list: + ll='检查'+y + if y in x: + ll='存在'+y + else: + ll='缺少'+y + lose.append(y) + fin=True +def report(): + pass +def ver(): + with open('support/temp.txt') as f: + for x in f.readlines(): + f.seek(0) + if x=='True': + '检测到了True' + return True + return False +def taskmgr(): + windows = pygetwindow.getAllTitles() + for window_title in windows: + try: + window = pygetwindow.getWindowsWithTitle(window_title)[0] + except Exception as e: + log(str(e)+'line 849', 'error') + try: + if window.title == 'Windows 任务管理器' or window.title == '任务管理器' or window.title == 'Windows任务管理器': + tsk = tkinter.Toplevel() + tsk.overrideredirect(1) + tsk.wm_attributes('-topmost', 1) + leb = tkinter.Message(tsk, + text='禁止使用任务管理器(自行在任务栏关闭任务管理器)', + font=('仿宋', 24)) + leb.place(relx=0.5, rely=0.5, anchor='center') + while not ver(): + try: + tsk.geometry('{}x{}+{}+{}'.format(window.width, window.height, window.left, window.top)) + tsk.update() + time.sleep(0.1) + except: + root.destroy() + break + else: + try: + tsk.destroy() + time.sleep(180) + except: + pass + except Exception as e: + log(str(e)+'line 874', 'error') + time.sleep(1) +def check_score(): + while 1: + if not rest(): + windows = pygetwindow.getAllTitles() + for window_title in windows: + try: + window = pygetwindow.getWindowsWithTitle(window_title)[0] + except Exception as e: + log(e,'error') + try: + if window.title == '成绩单': + window.close() + elif window.title =='任务管理器' or window.title == '任务管理器' or window.title == 'Windows任务管理器': + try: + if t5.isAlive(): + pass + else: + t5 = Thread(target=taskmgr) + t5.start() + except: + t5 = Thread(target=taskmgr) + t5.start() + except Exception as e: + log(str(e)+'line 899', 'error') + time.sleep(0.3) + else: + time.sleep(check_resttime()) +speed=50 +t1 = Thread(target=clean, args=()) +t2 = Thread(target=loading) +t4 = Thread(target=check_score) +t5 = Thread(target=urge) +t1.start() +t2.start() +t4.start() t5.start() \ No newline at end of file