import os import time import random import hashlib import datetime import threading from typing import Callable from tkinter import font, ttk, END import tkinter import tkinter.messagebox import xlrd import requests import pyperclip from lib_not_dr.loggers import config from docx import Document from PIL import Image, ImageTk from ttkbootstrap import Style from pyglet import media as pyglet_media logger = config.get_logger("main") def check_pwd(pwd): global password password = False try: with open("support/config.ini", "r", encoding="utf-8") 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, \ file_counter, \ root, \ screen_width, \ ll, \ style, \ 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, \ lock_photo, \ countdown_photo, \ sport_photo, \ eye_photo, \ line_photo, \ flag_photo, \ pen_photo, \ tick_photo, \ choice_photo, \ image_dict, \ screen_height fin = False style = Style(theme="newtheme") root = style.master style.configure("TButton") DraggableWindow(root) screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() root.resizable(0, 0) root.overrideredirect(1) for x in range(75): win_width = (4 * x) + 201 win_height = (4 * x) + 2 win_x = screen_width // 2 - win_width // 2 win_y = screen_height // 2 - win_height // 2 # 窗口垂直居中 root.geometry("{}x{}+{}+{}".format(win_width, win_height, win_x, win_y)) root.update() root.update() logger.info("正在清理文件") while not fin: c = tkinter.Label(text=ll, font=("宋体", 10)) 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(file_counter) + "个文件", font=("宋体", 48)) logger.info(f"本次共清理了{file_counter}个文件") k.place(relx=0.5, rely=0.5, anchor="center") root.update() root.after(1500) k.destroy() k = tkinter.Label(text="正在处理图片", font=("宋体", 24)) k.place(relx=0.5, rely=0.5, anchor="center") 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) tick = Image.open("support/tick.png") tick = tick.resize((20, 20)) tick_photo = ImageTk.PhotoImage(tick) pen = Image.open("support/pen.png") pen = pen.resize((20, 20)) pen_photo = ImageTk.PhotoImage(pen) save_and_continue = Image.open("support/save_and_continue.png") save_and_continue = save_and_continue.resize((120, 60)) save_and_continue_photo = ImageTk.PhotoImage(save_and_continue) continued = Image.open("support/continue.png") continued = continued.resize((120, 60)) continued_photo = ImageTk.PhotoImage(continued) lock = Image.open("support/lock.png") lock = lock.resize((200, 200)) lock_photo = ImageTk.PhotoImage(lock) countdown = Image.open("support/countdown.png") countdown = countdown.resize((40, 40)) countdown_photo = ImageTk.PhotoImage(countdown) sport = Image.open("support/sport.png") sport = sport.resize((60, 60)) sport_photo = ImageTk.PhotoImage(sport) eye = Image.open("support/check.png") eye = eye.resize((60, 60)) eye_photo = ImageTk.PhotoImage(eye) line = Image.open("support/line.png") line = line.resize((60, 5)) line_photo = ImageTk.PhotoImage(line) flag = Image.open("support/flag.png") flag = flag.resize((60, 60)) flag_photo = ImageTk.PhotoImage(flag) choiced = Image.open("support/choice.png") choiced = choiced.resize((40, 40)) choice_photo = ImageTk.PhotoImage(choiced) subjects = ( open("support/subjects", "r").read().splitlines() ) # 读取文件并分割成行 subjects.append("others") image_dict = {} for image_file in subjects: try: subphoto = Image.open("support/" + image_file + ".png") except FileNotFoundError: try: file = requests.get( "http://shenjack.top:5100/people/what/raw/branch/main/" + image_file + ".png" ) open("support/" + image_file + ".png", "wb").write(file.content) subphoto = Image.open("support/" + image_file + ".png") except: try: subphoto = Image.open("support/others.png") except: try: file = requests.get( "http://shenjack.top:5100/people/what/raw/branch/main/others.png" ) open("support/others.png", "wb").write(file.content) subphoto = Image.open("support/others.png") except: subphoto = Image.open("support/up.png") subphoto = subphoto.resize((40, 40)) subject_photo = ImageTk.PhotoImage(subphoto) image_dict[os.path.basename(image_file)] = ( subject_photo # 将文件名作为键,图片对象作为值存储在字典中 ) 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) # else: # logging.error("日志评级不正确,记录内容为:" + content) # with open("support/config.ini", "a+", encoding="utf-8") 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(True) 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), bg="#4472c4", activebackground="#4472c4", fg="white", ) 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), bg="#4472c4", activebackground="#4472c4", fg="white", ) 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): # 如果触发事件的控件是Button或Text,就不开始移动窗口 if ( isinstance(event.widget, tkinter.Button) or isinstance(event.widget, tkinter.Text) or isinstance(event.widget, ttk.Button) ): 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): # 如果触发事件的控件是Button或Text,就不移动窗口 if ( isinstance(event.widget, tkinter.Button) or isinstance(event.widget, tkinter.Text) or isinstance(event.widget, tkinter.Entry) or nodrag ): 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 = [ "孙妍", "王浩楠", "张一樵", "李克强", "蔡奇", "张建波", "任杰", "齐静", "刘爽", "付金生", "李梦莉", "陈红", "崔渊伟", "高佳", "张硕", "甘霖", "Matt", "matt", "岳欣欣", "刘立忠", "于跃", "梅源", "王静杰", "孙媛媛", "齐鹤群", "王旭圆", "许月玥", "王慧", "李月", "付鹏飞", "王芳", "习近平", "隋亚珍", "特朗普", "郭晶", "苏瑶", "许久辰", "张三", "李四", "王五", "赵六", "田七", "安倍晋三", "bilibili", "哔哩哔哩", ] logging.basicConfig( filename=os.getcwd() + "/support/journal.log", filemode="a+", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="", level=logging.DEBUG, ) class PILFilter(logging.Filter): def filter(self, record): return record.name != "PIL" or record.levelno > logging.DEBUG handler = logging.StreamHandler() handler.addFilter(PILFilter()) # 设置日志级别和处理器 logging.basicConfig(level=logging.DEBUG, handlers=[handler]) def file_hash(file_path: str, hash_method: Callable) -> str: h = hash_method() with open(file_path, "rb", encoding="utf-8") 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") # 打开excel文件 sheet = excel.sheet_by_index(0) # 获取工作薄 rows: list = sheet.row_values(0) # 获取第一行的表头内容 index = rows.index("时刻表") # 获取age列所在的列数: 1,也可以换成"password" listindes = sheet.col_values(index) # 获取age列的所有内容 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") # 打开excel文件 sheet = excel.sheet_by_index(0) # 获取工作薄 rows: list = sheet.row_values(0) # 获取第一行的表头内容 index = rows.index( zhou[d.weekday()] ) # 获取age列所在的列数: 1,也可以换成"password" listindes = sheet.col_values(index) # 获取age列的所有内容 try: ax = 1 while ( listindes[x + ax] == "升旗" or listindes[x + ax] == "上操" or listindes[x + ax] == "吃饭" or listindes[x + ax] == "眼操" ): ax += 1 return listindes[x], listindes[x + ax] except: return listindes[x] return False except: return False def rest(): try: excel = xlrd.open_workbook("support/时间表.xls") # 打开excel文件 sheet = excel.sheet_by_index(0) # 获取工作薄 rows: list = sheet.row_values(0) # 获取第一行的表头内容 index = rows.index("时间表") # 获取age列所在的列数: 1,也可以换成"password" listindes = sheet.col_values(index) # 获取age列的所有内容 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 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 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 not flag: pass else: finishing() def finishing(): global bigback_photo sound = pyglet_media.load("support/sound.mp3") player = sound.play() for child in root.grid_slaves(): child.grid_remove() tkinter.Label(text="时间到了", font=("华文行楷", 50)).grid( column=0, columnspan=3, row=1, sticky="nsew" ) def tmp(): player.pause() welcome() def tmp2(): player.pause() schedule("fromclean") cancel = tkinter.Button( text="确定", command=tmp, font=("宋体", 30), bg="#4472c4", activebackground="#4472c4", fg="white", ) cancel.grid(column=0, row=3, sticky="nsew") back = tkinter.Button( image=bigback_photo, command=tmp2, font=("宋体", 30), height=60, bg="#4472c4", activebackground="#4472c4", fg="white", ) back.grid(column=2, row=3, sticky="nsew") 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() - (screen_width // 2 - 500 / 2)) / speed step_y = (root.winfo_y() - (screen_height // 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(screen_width // 2 - 500 / 2), int(screen_height // 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 reset_grid_configurations(root): for row in range(20): root.grid_rowconfigure(row, weight=0, minsize=0) for col in range(5): root.grid_columnconfigure(col, weight=0, minsize=0) def check_homework(): 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) if "——" in x: copylist = copylist + x.split("——")[1] else: copylist = copylist + str(l) + ")" + x l = l + 1 return copylist def homework(pas=None, window=None, line=9999): global z, toplevel, back_photo, speed z = True if window == lo: for child in root.grid_slaves(): cc = child.grid_info() if cc["column"] == 1 and cc["row"] == line - 1: child.grid_remove() zxs = tkinter.Label(root, text=pas[0], font=("华文行楷", 40)) zxs.grid(column=1, row=line - 1) reset_grid_configurations(window) style.configure("TButton", font=("微软雅黑", 10)) if window != root: window.configure(width=300) def ex(): if window == lo: schedule("fromhomework") else: for child in right_area.grid_slaves(): child.grid_remove() for t in right_area.place_slaves(): t.destroy() schedule_for_view() right_area.configure(width=55) def schedule_for_view(): global right_area for btn in right_area.place_slaves(): btn.destroy() for btn in right_area.grid_slaves(): btn.grid_remove() right_area.grid_columnconfigure(0, weight=1) right_area.grid_propagate(False) try: excel = xlrd.open_workbook("support/课程表.xls") # 打开excel文件 sheet = excel.sheet_by_index(0) # 获取工作薄 rows: list = sheet.row_values(0) # 获取第一行的表头内容 index = rows.index( zhou[d.weekday()] ) # 获取age列所在的列数: 1,也可以换成"password" listindes = sheet.col_values(index) # 获取age列的所有内容 except: listindes = "没有找到课程表文件" logger.error("课程表文件不存在") # 遍历该列所有的内容 zxs = tkinter.Label(right_area, text="曾", font=("华文行楷", 40)) zxs.grid(column=0, row=0) window.update() he = zxs.winfo_height() wi = zxs.winfo_width() zxs.destroy() style.configure("TButton", font=("华文行楷", 40)) for i in range(1, len(listindes)): if listindes[i] == "上操": zxs = tkinter.Label( right_area, image=sport_photo, font=("华文行楷", 40) ) elif listindes[i] == "眼操": zxs = tkinter.Label(right_area, image=eye_photo, font=("华文行楷", 40)) elif listindes[i] == "吃饭": zxs = tkinter.Label(right_area, image=line_photo, font=("华文行楷", 40)) elif listindes[i] == "升旗": zxs = tkinter.Label(right_area, image=flag_photo, font=("华文行楷", 40)) elif "/" not in listindes[i]: window.grid_rowconfigure(i - 1, weight=1) zxs = tkinter.Frame(right_area, height=he, width=wi) ttk.Button( zxs, text=listindes[i][0], command=lambda listindes=listindes[i], g=i: homework( pas=listindes, window=right_area, line=g ), style="light.TButton", ).place( relx=0.5, rely=0.5, anchor="center" ) # 使用 lambda 函数打印按钮的文本 else: zxs = tkinter.Label( right_area, text=listindes[i], font=("华文行楷", 20) ) zxs.grid(column=0, row=i) right_area.grid_rowconfigure(i, weight=1) window.update() listindes.clear() def edit(con): for child in too.grid_slaves(): child.grid_remove() for t in too.place_slaves(): t.destroy() ppp = tkinter.Text(too, font=("黑体", 24)) window.update() co = tkinter.Text(too, width=ppp.cget("width"), font=("黑体", 36)) co.focus_set() co.insert("insert", con) co.grid(row=0, column=0, sticky="nsew") button = tkinter.Button( too, image=tick_photo, command=lambda: pasd(co.get(1.0, END).strip()) ) # 使用 lambda 函数打印按钮的文本 button.place(rely=0, relx=0.5, anchor="n") window.update() def look(): global cross_photo for child in window.grid_slaves(): child.grid_remove() for t in window.place_slaves(): t.destroy() def secure(): pasd("") secure() def pasd(copylist): global too, right_area, nodrag nodrag = True if copylist == "" or copylist == "refresh": if copylist == "": for child in window.grid_slaves(): child.grid_remove() for t in window.place_slaves(): t.destroy() step_wid = (screen_width - window.winfo_width()) / speed step_hei = (screen_height - window.winfo_height()) / speed step_x = (window.winfo_x() - 0) / speed step_y = (window.winfo_y() - 0) / speed wid = window.winfo_width() hei = window.winfo_height() xxx = window.winfo_x() yyy = window.winfo_y() # 移动窗口到指定位置,并有动画效果 for x in range(speed): wid = wid + step_wid hei = hei + step_hei xxx = xxx - step_x yyy = yyy - step_y window.geometry( "{}x{}+{}+{}".format(int(wid), int(hei), int(xxx), int(yyy)) ) window.update() window.geometry("{}x{}+{}+{}".format(screen_width, screen_height, 0, 0)) window.grid_rowconfigure(0, weight=1) too = tkinter.Frame(window) too.grid(column=0, row=0, sticky="nsew") right_area = tkinter.Frame(window, height=screen_height) right_area.grid(row=0, column=1, sticky="nsew") window.grid_rowconfigure(0, weight=1) # too 所在的列 window.grid_columnconfigure(0, weight=1) # too 所在的列 window.grid_columnconfigure( 1, minsize=55, weight=0 ) # right_area 所在的列,固定宽度 right_area.configure(width=55) schedule_for_view() elif copylist == "refresh": for child in too.grid_slaves(): child.grid_remove() for t in too.place_slaves(): t.destroy() copylist = check_homework() pyperclip.copy(str(d.date()) + "\n" + copylist) doc = Document() # 这里相当于输入了一个空格,后面等待着文字输入 paragraph3 = doc.add_paragraph() paragraph3.add_run("请勿在此处更改,不会被保存。\n" + copylist) try: doc.save("support/" + str(d.date()) + "作业.docx") except: on_button_click("请将word窗口关闭", "") window.update() else: for child in too.grid_slaves(): child.grid_remove() for t in too.place_slaves(): t.destroy() tkinter.Label( too, text=" ", font=("黑体", 24), wraplength=root.winfo_width(), ).grid(column=0, row=0, sticky="nsew") root.update() ly = tkinter.Label( too, text=str(d.date()) + " " + zhou[d.weekday()], font=("黑体", 24), wraplength=root.winfo_width(), ) ly.grid(column=0, row=0, sticky="nsew") root.update() lp = tkinter.Label( too, text=copylist, font=("黑体", 36), anchor="w", justify="left", wraplength=root.winfo_width() - 55, ) lp.grid(column=0, row=1, ipadx=50, sticky="nsew") adjust_font_size(lp, max_height=root.winfo_height() - ly.winfo_height()) zzz = tkinter.Frame(too) lz = tkinter.Button(zzz, text="→←", command=lambda: schedule("fromhomework")) lz.grid(column=0, row=0, sticky="nsew") lf = tkinter.Button(zzz, text="复制", command=lambda: copy(zzz)) lf.grid(column=1, row=0, sticky="nsew") li = tkinter.Button(zzz, image=pen_photo, command=lambda: edit(copylist)) li.grid(column=2, row=0, sticky="nsew") zzz.grid(column=0, row=2, sticky="nsew") zzz.grid_columnconfigure(0, weight=1) # too 所在的列 zzz.grid_columnconfigure(1, weight=1) # too 所在的列 zzz.grid_columnconfigure(2, weight=1) # too 所在的列 too.grid_rowconfigure(1, weight=1) # too 所在的列 window.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 edit_homework(sub, subject, book, line): for child in window.grid_slaves(): if child.grid_info()["row"] == line: child.grid_remove() ppp = tkinter.Text( window, height=2, ) ppp.focus_set() ppp.insert("insert", subject) ppp.bind("", handle_return) ppp.grid(row=line, column=0, ipadx=30, padx=10) button = tkinter.Button( window, image=tick_photo, command=lambda: rewrite_homework( sub, subject, book, ppp.get(1.0, END).strip() ), ) # 使用 lambda 函数打印按钮的文本 button.grid(row=line, column=2, ipadx=1, pady=5) # 假设你只使用一列 def rewrite_homework(sub, subject, book, content): with open("support/homework/" + str(d.date()) + sub, "r") as file: lines = file.readlines() # 遍历每一行,检查是否有内容为”123“的行 for i, line in enumerate(lines): if line.strip() == subject: # 如果有,删除这一行 del lines[i] break lines.append(content + "\n") with open("support/homework/" + str(d.date()) + sub, "w") as file: file.writelines(lines) if window != lo: pasd("refresh") add_work(sub, book) def add_work_write(sub, book, info): with open("support/homework/" + str(d.date()) + sub, "a+") as f: f.write(book + info + "\n") pass try: window.update() add_work(sub, book) except: pass if window != lo: pasd("refresh") def delete_homework(sub, subject, book): with open("support/homework/" + str(d.date()) + sub, "r") as file: lines = file.readlines() # 遍历每一行,检查是否有内容为”123“的行 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) if window != lo: pasd("refresh") add_work(sub, book) def handle_return(event): if event.keysym == "Return": homework_input_box.insert(END, "\n——") return "break" def add_work(sub, book): window.grid_columnconfigure(0, weight=1) global cross_photo for child in window.grid_slaves(): child.grid_remove() for t in window.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): button = tkinter.Label( window, text=subject, justify="left", wraplength=160 ) # 使用 lambda 函数打印按钮的文本 button.grid( row=i + 1, column=0, ipadx=50, pady=5, sticky="w" ) # 假设你只使用一列 button = tkinter.Button( window, image=pen_photo, command=lambda subject=subject, i=i + 1: edit_homework( sub, subject, book, i ), ) # 使用 lambda 函数打印按钮的文本 button.grid(row=i + 1, column=1, ipadx=1, pady=5) # 假设你只使用一列 button = tkinter.Button( window, image=cross_photo, command=lambda subject=subject: delete_homework(sub, subject, book), bg="#4472c4", activebackground="#4472c4", fg="white", ) # 使用 lambda 函数打印按钮的文本 button.grid(row=i + 1, column=2, ipadx=1, pady=5) # 假设你只使用一列 def confirm(sub, book, content): if content == "": choice_book(sub) else: for child in window.grid_slaves(): child.grid_remove() for t in window.place_slaves(): t.destroy() leb = tkinter.Message( window, text="是否保存更改?\n内容:\n\n" + sub + ":" + book + content, font=("仿宋", 24), ) leb.grid(column=0, row=0, sticky="nsew", columnspan=2) tkinter.Button( text="保存", command=lambda: add_work_write( sub, book, homework_input_box.get(1.0, END).strip() ), font=("宋体", 30), ).grid(column=0, row=1, sticky="nsew") tkinter.Button( text="不保存", command=lambda: choice_book(sub), font=("宋体", 30) ).grid(column=1, row=1, sticky="nsew") # tkinter.Button(window, image=back_photo, command=lambda: confirm()choice_book(sub),bg='#4472c4',activebackground='#4472c4',fg='white').place(relx=0, rely=0,anchor='nw') tkinter.Button( window, image=back_photo, command=lambda: confirm( sub, book, homework_input_box.get(1.0, END).strip() ), bg="#4472c4", activebackground="#4472c4", fg="white", ).place(relx=0, rely=0, anchor="nw") tkinter.Label( window, text=sub + " " + book + "\n" + "请输入具体页数或题号" ).grid(row=0, column=0, ipadx=15, pady=10, columnspan=3) global homework_input_box homework_input_box = tkinter.Text( window, height=20, ) homework_input_box.focus_set() homework_input_box.bind("", handle_return) homework_input_box.grid( row=i + 2, column=0, columnspan=3, sticky="nsew", padx=10 ) ttk.Button( window, image=continued_photo, command=lambda: add_work_write( sub, book, homework_input_box.get(1.0, END).strip() ), style="light.TButton", ).grid(row=i + 4, column=0, ipadx=15, pady=10) # tkinter.Button(window, text='回车可用(点此阅读回车说明)',command=lambda :tkinter.messagebox.showinfo('回车使用方法','按下回车后自动在下一行添加破折号“——”,破折号不会在最终页面中显示,仅代表新一行仍属于本项作业,不会被标号。\n如果手动删除某行的破折号,则该行将被认为是新一项作业,并顺序标号。\n可手动添加破折号,代表该行不会被标号。')).grid(row=i+3, column=0, ipadx=15, pady=10, columnspan=3) tkinter.Button(window, image=cross_photo, command=lambda: ex()).place( relx=1, rely=0, anchor="ne" ) 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 + "已存在") elif len(open("support/" + sub, "r+").read().splitlines()) >= 12: tkinter.messagebox.showwarning( "已达上限", "最多添加12个常用书,删除功能还在测试,敬请期待。" ) 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 window.grid_slaves(): child.grid_remove() for t in window.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.Label( window, text="\n\n" + sub + "\n" + "选择或输入书名或卷名\n可将此栏目中的内容添加为常用书", ).grid(row=0, column=0, ipadx=15, pady=10, columnspan=2, sticky="nsew") for i, subject in enumerate(subjects): button = tkinter.Button( window, text=subject, command=lambda subject=subject: add_work(sub, subject), height=3, ) # 使用 lambda 函数打印按钮的文本 button.grid( row=i // 2 + 1, column=i % 2, pady=10, padx=10, sticky="nsew" ) # 假设你只使用一列 tkinter.Button( window, image=back_photo, command=lambda: choice_subject() ).place(relx=0, rely=0, anchor="nw") ppp = tkinter.Entry(window, width=10) ppp.grid(row=i + 2, column=0, ipadx=15, columnspan=3) ttk.Button( window, image=save_and_continue_photo, command=lambda: add_book(sub, ppp.get()), style="light.TButton", ).grid(row=i + 3, column=0, ipadx=15, pady=10, columnspan=2) ttk.Button( window, image=continued_photo, command=lambda: add_work(sub, ppp.get()), style="light.TButton", ).grid(row=i + 4, column=0, ipadx=15, pady=10, columnspan=2) tkinter.Button(window, image=cross_photo, command=lambda: ex()).place( relx=1, rely=0, anchor="ne" ) window.update() pass def window_close_handle(): global z, toplevel z = False window.destroy() try: toplevel.overrideredirect(1) except: pass for x in window.place_slaves(): x.place_forget() for child in window.grid_slaves(): child.grid_remove() if window == root: window.protocol("WM_DELETE_WINDOW", window_close_handle) root.update() def the(): for child in window.grid_slaves(): child.grid_remove() for t in window.place_slaves(): t.destroy() tkinter.Button(window, image=cross_photo, command=lambda: ex()).place( relx=1, rely=0, anchor="ne" ) tkinter.Button( window, image=back_photo, command=lambda: choice_subject() ).place(relx=0, rely=0, anchor="nw") tkinter.Label(window, text="\n\n名称").grid(column=0, row=0) tkinter.Label(window, text="\n\n存活").grid(column=1, row=0) tkinter.Label(window, text="\n\n目标").grid(column=2, row=0) tkinter.Label(window, text="\n\n操作").grid(column=3, row=0) a = 2 for thread in threading.enumerate(): tkinter.Label(window, text=thread.getName()).grid(column=0, row=a) tkinter.Label(window, text=thread.is_alive()).grid(column=1, row=a) # 检查线程是否有 target 属性,并获取其名称(而不是尝试调用它) if hasattr(thread, "target"): target_name = ( thread.target.__name__ if callable(thread.target) else str(thread.target) ) target_label = tkinter.Label(window, text=target_name) else: target_label = tkinter.Label( window, text="None" ) # 对于没有 target 的线程,显示 "None" target_label.grid(column=2, row=a) if thread.is_alive(): tkinter.Button( window, text="停止", command=lambda: tkinter.messagebox.showwarning( "", "暂不支持此功能" ), ).grid(column=3, row=a) else: try: tkinter.Button( window, text="启动", command=lambda: tkinter.messagebox.showwarning( "", "暂不支持此功能" ), ).grid(column=3, row=a) except Exception as e: tkinter.messagebox.showwarning("", str(e)) a = a + 1 tkinter.Label(window, text="v24.10.28 ©曾祥盛").grid( column=0, row=a + 1, columnspan=4 ) def choice_subject(sub=None): window.grid_rowconfigure(1, weight=0) window.grid_columnconfigure(0, weight=1) window.grid_columnconfigure(1, weight=1) window.grid_columnconfigure(2, weight=0) global z for child in window.grid_slaves(): child.grid_remove() for t in window.place_slaves(): t.destroy() subjects = ( open("support/subjects", "r").read().splitlines() ) # 读取文件并分割成行 tkinter.Label(window, text="请选择科目").grid( row=0, column=0, pady=10, columnspan=2, sticky="nsew" ) for i, subject in enumerate(subjects): try: button = ttk.Button( window, image=image_dict[subject], compound="left", text=subject, command=lambda subject=subject: choice_book(subject), style="light.TButton", ) # 使用 lambda 函数打印按钮的文本 except: button = ttk.Button( window, image=up_photo, compound="left", text=subject, command=lambda subject=subject: choice_book(subject), style="light.TButton", ) # 使用 lambda 函数打印按钮的文本 button.grid( row=i // 2 + 1, column=i % 2, sticky="nsew", ipady=20 ) # 假设你只使用一列 ppp = tkinter.Entry(window, width=10) ppp.grid(row=i + 2, column=0, ipadx=15, columnspan=2) ttk.Button( window, image=continued_photo, command=lambda: add_subject(ppp.get()), style="light.TButton", ).grid(row=i + 3, column=0, pady=10, columnspan=2) tkinter.Button(window, image=cross_photo, command=lambda: ex()).place( relx=1, rely=0, anchor="ne" ) tkinter.Button(window, text="thread", command=lambda: the()).place( relx=0, rely=1, anchor="sw" ) if sub is not None: if sub in subjects: choice_book(sub) window.update() if pas: pasd("") elif pas is not None: choice_subject(pas) else: choice_subject() def choice(fromwhere): global \ info, \ canceltopping, \ zhou, \ h, \ d, \ photo, \ label_img, \ chosed, \ shouldnot, \ password, \ speed, \ g_list root.wm_attributes("-topmost", 1) top.destroy() for btn in root.place_slaves(): btn.destroy() for x in root.grid_slaves(): x.grid_remove() 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 = screen_height // 2 - win_height // 2 # 窗口垂直居中 step_x = ((screen_width - win_width) - root.winfo_x()) / speed step_y = ((screen_height // 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("随机选人") g_list = [] status = "开始" back = tkinter.Button( text="返回", command=lambda: schedule("fromchoice"), font=("微软雅黑", 10) ) back.place(relx=1, rely=0, anchor="ne") verify = tkinter.Button(image=countdown_photo, command=lambda: countdown()) verify.place(relx=0, rely=0, anchor="nw") nolis = tkinter.StringVar() nolis.set(False) lissss = ttk.Checkbutton( root, text="忽略已抽中列表", style="round-toggle", variable=nolis, onvalue=True, offvalue=False, ) lissss.place(relx=0.5, rely=0, anchor="n") # set = tkinter.Button(text='设置', command=lambda: settings(),bg='#4472c4',activebackground='#4472c4',fg='white') # set.place(relx=0.5, rely=0, anchor='n') root.update() inn = tkinter.Label(text="正在处理……", font=("微软雅黑", 10)) 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: with open("support/1.txt", "r") as f: for x in f.readlines(): x = x.strip("\n") g_list.append(x) info = str(len(g_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: logger.info(f'人名单sha256: {file_sha256(r"support/1.txt")}') password = True except: pass if rest() or (not rest() and password): logger.info('人名单sha256:' + file_sha256(r'support/1.txt')) logger.info(f'当前有{len(g_list)}人') password = False except Exception as e: on_button_click("没有找到人名单文件或因\n" + str(e), "") logger.info(f'没有找到人名单文件或因{e}') 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): logger.info(f'操作后sha256:{file_sha256(r"support/record.txt")}') 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): password = False except: pass except: pass try: if int(episode_name) != len(g_list): on_button_click( "人名单中的人数\n与上次运行时不一致,\n请检查人名单是否被篡改。\n按确定以继续。", "", ) for i in set(g_list): if g_list.count(i) > 1: if on_button_click( "在人名单文件中," + i + "出现了" + str(g_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, g_list, info, file_counter, chosed, inf flag = True status = "开始" if not rest(): inf = tkinter.Label( text="当前有" + info + "人。\n现在处于下课时间,抽到的人将不会添加到已抽中列表。", font=("微软雅黑", 10), ) elif str(nolis.get()) == "1": inf = tkinter.Label( text="当前有" + info + "人。已忽略已抽中列表。\n抽到的人将不会添加到已抽中列表。", font=("微软雅黑", 10), ) 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=str(len(chosed)) + "/" + info + "。剩余5人时将开启新一轮。", font=("微软雅黑", 10), ) inf.place(relx=0.5, rely=0.7, anchor="center") start = tkinter.Button( text=status, command=lambda: main(), font=("宋体", 24), width=30, bg="#4472c4", activebackground="#4472c4", fg="white", ) start.place(relx=0.5, rely=1, anchor="s") def main(): global flag, root, g_list, status, info, file_counter, chosed, inf try: inf.destroy() except: pass flag = False status = "就你了" start = tkinter.Button( text=status, command=lambda: stop(g_list[r]), font=("宋体", 24), width=30, bg="#4472c4", activebackground="#4472c4", fg="white", ) start.place(relx=0.5, rely=1, anchor="s") while not flag: r = random.randint(0, len(g_list) - 1) if len(chosed) == len(g_list) - 5: chosed.clear() with open("support/record.txt", "a+") as g: g.truncate(0) g.close() logger.info("操作后sha256:", file_sha256(r"support/record.txt")) if (g_list[r] not in chosed) and (int(nolis.get()) == 0): try: file_counter.destroy() except: pass file_counter = tkinter.Label(text=g_list[r], width=30, font=("华文行楷", 72)) file_counter.place(relx=0.5, rely=0.4, anchor="center") root.update() time.sleep(0.01) elif int(nolis.get()) == 1: try: file_counter.destroy() except: pass file_counter = tkinter.Label(text=g_list[r], width=30, font=("华文行楷", 72)) file_counter.place(relx=0.5, rely=0.4, 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.4, anchor="center") start = tkinter.Button( text=status, command=lambda: main(), font=("宋体", 24), width=30, bg="#4472c4", activebackground="#4472c4", fg="white", ) start.place(relx=0.5, rely=1, anchor="s") def adjust_font_size(label, max_width=None, max_height=None, min_size=1): # 获取当前内容 text = label.cget("text") # 初始字体大小(可以根据需要调整) font_size = 48 # 尝试从当前字体描述中提取字体家族(如果不存在,则使用默认家族) try: # 注意:这里的解析是简化的,可能不适用于所有情况 # 正确的做法是使用更健壮的解析方法,或者保存原始Font对象(如果可能的话) current_font_desc = label.cget("font") family = current_font_desc.split()[0] if current_font_desc else "Arial" except: family = "Arial" # 默认字体家族 # 创建字体对象(使用默认或提取的家族) current_font = font.Font(family=family, size=font_size) # 获取 Label 的实际宽高(如果提供了max_width和max_height,则使用它们) label_width = max_width if max_width else label.winfo_width() label_height = max_height if max_height else label.winfo_height() # 不断缩小字体大小直到内容完全显示或达到最小字体大小 while True: # 设置新的字体大小 current_font.configure(size=font_size) # 更新 Label 字体 label.config(font=current_font) # 更新窗口以应用新的字体大小并获取实际内容所需的宽高 label.update_idletasks() # 获取 Label 实际内容所需的宽高(考虑wraplength和padding等可能影响的因素) # 注意:wraplength可能会限制宽度,但不影响字体大小的调整逻辑 text_width = label.winfo_reqwidth() text_height = label.winfo_reqheight() # 判断是否满足条件 if (max_width is None or text_width <= label_width) and ( max_height is None or text_height <= label_height ): break # 字体大小递减(避免无限循环) font_size -= 1 # 检查是否已达到最小字体大小 if font_size < min_size: label.config(text="字数过多") font_size = 48 def copy(lg): pyperclip.copy(str(d.date()) + "\n" + check_homework()) lf = tkinter.Button(lg, image=tick_photo) lf.grid(column=1, row=0, sticky="nsew") root.after(5000, lambda: lf.destroy()) def schedule(fr): global \ thu, \ other, \ zhou, \ d, \ canceltopping, \ photo, \ lose, \ h, \ no, \ z, \ speed, \ nodrag, \ top, \ btn, \ lo root.wm_attributes("-topmost", 0) nodrag = False z = False for btn in root.place_slaves(): btn.destroy() for btn in root.grid_slaves(): btn.grid_remove() reset_grid_configurations(root) if lose == []: pass else: a = "缺少关键组件:\n" for x in lose: a = a + x + "\n" on_button_click(a, "") lose = [] if 1: step_wid = (359 - root.winfo_width()) / speed step_hei = (800 - root.winfo_height()) / speed step_x = (root.winfo_x() - (screen_width - 359)) / speed step_y = (root.winfo_y() - 0) / speed wid = root.winfo_width() hei = root.winfo_height() xxx = root.winfo_x() yyy = root.winfo_y() # 移动窗口到指定位置,并有动画效果 for x in range(speed): wid = wid + step_wid hei = hei + step_hei xxx = xxx - step_x yyy = yyy - step_y root.geometry("{}x{}+{}+{}".format(int(wid), int(hei), int(xxx), int(yyy))) root.update() root.geometry("{}x{}+{}+{}".format(359, 800, screen_width - 359, 0)) root.update() root.title("课程表") root.resizable(0, 0) root.overrideredirect(1) try: excel = xlrd.open_workbook("support/课程表.xls") # 打开excel文件 sheet = excel.sheet_by_index(0) # 获取工作薄 rows: list = sheet.row_values(0) # 获取第一行的表头内容 index = rows.index( zhou[d.weekday()] ) # 获取age列所在的列数: 1,也可以换成"password" listindes = sheet.col_values(index) # 获取age列的所有内容 except: on_button_click("请确认课程表文件\n存在且格式正确", "") log("课程表文件不存在", "error") root.quit() # 遍历该列所有的内容 style.configure("TButton", font=("华文行楷", 40)) zxs = tkinter.Label(root, text="曾", font=("华文行楷", 40)) zxs.grid(column=1, row=0) root.update() he = zxs.winfo_height() wi = zxs.winfo_width() zxs.destroy() lo = tkinter.Frame(root, width=300) lo.grid_propagate(False) # 使用配置好的样式创建按钮 for i in range(1, len(listindes)): if listindes[i] == "上操": zxs = tkinter.Label(root, image=sport_photo, font=("华文行楷", 40)) elif listindes[i] == "眼操": zxs = tkinter.Label(root, image=eye_photo, font=("华文行楷", 40)) elif listindes[i] == "吃饭": zxs = tkinter.Label(root, image=line_photo, font=("华文行楷", 40)) elif listindes[i] == "升旗": zxs = tkinter.Label(root, image=flag_photo, font=("华文行楷", 40)) elif "/" not in listindes[i]: root.grid_rowconfigure(i - 1, weight=1) zxs = tkinter.Frame(root, height=he, width=wi) ttk.Button( zxs, text=listindes[i][0], command=lambda listindes=listindes[i], g=i: homework( pas=listindes, window=lo, line=g ), style="light.TButton", ).place( relx=0.5, rely=0.5, anchor="center" ) # 使用 lambda 函数打印按钮的文本 else: zxs = tkinter.Label(root, text=listindes[i], font=("华文行楷", 20)) zxs.grid(column=1, row=i - 1) root.update() listindes.clear() y = tkinter.Button(text=zhou[d.weekday()], command=lambda: choice("fromtab")) y.grid(row=i, column=1, sticky="nsew") global h, labeled root.grid_columnconfigure(0, weight=1) lw = tkinter.Label(lo, text=str(d.date()), font=("微软雅黑", 20)) lw.grid(column=0, row=0, sticky="nsew") root.update() lo.grid(column=0, row=0, rowspan=i, sticky="nsew") lj = tkinter.Label( lo, text=check_homework(), wraplength=root.winfo_width() - y.winfo_width(), font=("黑体", 20), justify="left", ) lj.grid(column=0, row=1, sticky="nsew") zzz = tkinter.Frame(root) zzz.grid(column=0, row=i, sticky="nsew") zzz.grid_columnconfigure(0, weight=1) zzz.grid_columnconfigure(1, weight=1) if fr != "fromhomework": top = tkinter.Toplevel() top.resizable(False, False) top.overrideredirect(True) top.wm_attributes("-topmost", 1) try: if isinstance(check_class(), tuple): btn = tkinter.Button( top, text=check_class()[0][0] + "→" + check_class()[1][0], command=lambda: choice("fromtab"), font=("华文行楷", 20), ) else: btn = tkinter.Button( top, text=check_class(), command=lambda: choice("fromtab"), font=("华文行楷", 20), ) except TypeError: try: btn = tkinter.Button( top, text=check_class()[0][0], command=lambda: choice("fromtab"), font=("华文行楷", 20), ) except: btn = tkinter.Button( top, image=choice_photo, command=lambda: choice("fromtab"), font=("华文行楷", 20), ) btn.place(relx=0.5, rely=0.5, anchor="center") top.update() total_width = btn.winfo_width() total_height = btn.winfo_height() // 1.5 top.geometry( "{}x{}+{}+{}".format(int(total_width) - 2, int(total_height), 0, 0) ) top.update() lz = tkinter.Button(zzz, text="←→", command=lambda: homework(pas=True, window=root)) lz.grid(column=0, row=0, sticky="nsew") lf = tkinter.Button(zzz, text="复制", command=lambda: copy(zzz)) lf.grid(column=1, row=0, sticky="nsew") adjust_font_size(lj, max_height=800 - he) root.update_idletasks() root.wm_attributes("-topmost", 0) def check_resttime(): global zhou, d try: excel = xlrd.open_workbook("support/时刻表.xls") # 打开excel文件 sheet = excel.sheet_by_index(0) # 获取工作薄 rows: list = sheet.row_values(0) # 获取第一行的表头内容 index = rows.index("时刻表") # 获取age列所在的列数: 1,也可以换成"password" listindes = sheet.col_values(index) # 获取age列的所有内容 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 count(): time.sleep(10) def bsy(fro=None): global top if fro is None: time.sleep(10) while isinstance(check_class(), tuple): try: btn.config(text=check_class()[0][0] + "→" + check_class()[1][0]) time.sleep(check_resttime() + 3) except tkinter.TclError: time.sleep(check_resttime() + 3) else: if isinstance(check_class(), str): btn.config(text=check_class()) else: btn.config(text="", image=choice_photo) top.update() total_width = btn.winfo_width() total_height = btn.winfo_height() // 1.5 top.geometry("{}x{}+{}+{}".format(total_width, int(total_height), 0, 0)) def clean(): ... # global fin, file_counter, ll, lose # ll = "正在清理文件" # fin = False # file_counter = 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 == "课程表.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") # file_counter = file_counter + 1 # else: # ll = filename + "未到过期时间" # ll = "正在检查程序组件" # x = os.listdir("support") # list = [ # "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 speed = 50 nodrag = False flag_flag = True t1 = threading.Thread( target=clean, name="clean" ) # 定义线程t1,线程任务为调用task1函数,task1函数的参数是6 t2 = threading.Thread( target=loading, name="main" ) # 定义线程t2,线程任务为调用task2函数,task2函数无参数 t3 = threading.Thread(target=bsy, name="bsy") t1.start() # 开始运行t1线程 t2.start() # 开始运行t2线程 time.sleep(5) t3.start()