基于Python和Tkinter實現(xiàn)高考倒計時功能
一、軟件概述:
這款高考倒計時軟件的核心功能是展示距離高考的剩余天數(shù),以及設(shè)置多個復(fù)習(xí)目標(biāo)的倒計時。除了基本的倒計時功能,它還支持勵志語句顯示、目標(biāo)管理等功能,幫助你保持高效的復(fù)習(xí)節(jié)奏。
該軟件界面簡潔,操作簡單,且支持個性化設(shè)置。通過靈活的目標(biāo)管理,用戶可以設(shè)置多個關(guān)鍵時間點,并通過實時更新的倒計時幫助自己專注于每一個目標(biāo)。
二、功能亮點:
1. 高考倒計時
這是軟件的核心功能,能夠?qū)崟r顯示距離高考的剩余天數(shù)、小時和分鐘。每當(dāng)你看到倒計時的數(shù)字,都會提醒你珍惜剩下的每一秒鐘,不斷努力。
2. 添加目標(biāo)倒計時
除了高考這個主要目標(biāo)外,你還可以設(shè)置其他的學(xué)習(xí)目標(biāo),比如模擬考試時間、學(xué)科復(fù)習(xí)進(jìn)度等。每個目標(biāo)都可以設(shè)置日期、時間,軟件會自動倒計時,幫助你規(guī)劃每個階段的任務(wù)。
3. 勵志語句
每天在軟件界面下方,都會顯示一條勵志語句,幫助你在備考過程中保持積極的心態(tài)。這些語句隨機生成,既可以激勵你,也能緩解壓力。
4. 透明度調(diào)節(jié)與圓角設(shè)計
為了讓軟件界面更加美觀,我們?yōu)榇翱谠O(shè)計了圓角效果,同時支持透明度調(diào)節(jié)功能。你可以根據(jù)個人喜好調(diào)整窗口的透明度,既能讓軟件不占用太多桌面空間,又能確保時刻查看到倒計時。
5. 目標(biāo)管理
用戶可以通過右鍵菜單,方便地添加、刪除和修改目標(biāo)。當(dāng)某個目標(biāo)完成時,可以及時刪除或更改它,確保你的目標(biāo)始終是最新的。
6. 開機啟動與置頂功能
為方便使用,軟件支持設(shè)置為開機自動啟動,并且可以設(shè)置窗口始終置頂,確保你隨時可以看到剩余時間,不會錯過任何一個重要時刻。
7. 控制面板
控制面板是軟件的配置界面,用戶可以通過它來設(shè)置一些個性化的選項。例如:
- 透明度控制:你可以調(diào)整軟件的透明度,以便在桌面上自由擺放。
- 目標(biāo)管理:可以添加新目標(biāo)、修改現(xiàn)有目標(biāo)或刪除目標(biāo)。
- 窗口置頂與開機啟動:軟件可以設(shè)置為窗口始終置頂,或者設(shè)置為開機時自動啟動。
- 激勵語句切換:通過切換激勵語句,給自己帶來不一樣的動力。
三、運行效果:
四、技術(shù)實現(xiàn):
這款高考倒計時軟件基于Python和Tkinter開發(fā),以下是一些實現(xiàn)的技術(shù)細(xì)節(jié)。
1. 設(shè)置窗口透明度與圓角
使用 win32gui
庫,代碼如下:
import win32gui import win32con import win32api def set_rounded_corners(self): """設(shè)置窗口圓角和透明度""" hwnd = self.root.winfo_id() style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, style | win32con.WS_POPUP) win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED) self._region = win32gui.CreateRoundRectRgn(0, 0, self.root.winfo_width() + 1, self.root.winfo_height() + 1, 40, 40) win32gui.SetWindowRgn(hwnd, self._region, True) win32gui.SetLayeredWindowAttributes(hwnd, 0, int(0.8 * 255), win32con.LWA_ALPHA)
- 倒計時功能實現(xiàn) 倒計時的核心邏輯是計算當(dāng)前時間與目標(biāo)時間的差值,通過 datetime 庫來實時更新剩余時間。
import datetime def update_countdown(self): now = datetime.datetime.now() target = self.config['targets'][self.current_target_index] time_str = target.get('time', '00:00') target_datetime = datetime.datetime.strptime(f"{target['date']} {time_str}", '%Y-%m-%d %H:%M') delta = target_datetime - now self.days_label.config(text=str(delta.days) + " 天") self.countdown_label.config(text=f"{delta.hours}小時{delta.minutes}分鐘") self.date_label.config(text=f"{target['date']} {time_str}")
這段代碼會計算從當(dāng)前時間到目標(biāo)時間的時間差,并更新界面上的倒計時顯示。
- 激勵語句 為了讓備考過程不枯燥,我們使用API隨機獲取勵志語句,并在軟件界面下方展示。
def get_motto(self): try: response = requests.get('https://jkapi.com/api/one_yan?type=json', timeout=5) if response.status_code == 200: data = response.json() return data.get('content', random.choice(self.default_mottos)) except: pass return random.choice(self.default_mottos)
通過這段代碼,我們確保每天都能看到新的激勵語句,給自己帶來新的動力。
五、總結(jié) :
這款高考倒計時軟件不僅幫助你清晰地管理剩余時間,還通過多種人性化的功能幫助你保持積極心態(tài),迎接高考的挑戰(zhàn)。通過透明度調(diào)節(jié)、目標(biāo)管理、勵志語句等功能,讓你在高考備考過程中始終保持動力,不輕言放棄。 希望這款軟件能夠成為你備考路上的得力助手,祝你在高考中取得好成績,邁向更加輝煌的未來!
六、相關(guān)源碼:
import tkinter as tk from tkinter import ttk import datetime import json import os import sys import random import requests from tkinter import messagebox class CountdownTimer: def __init__(self): self.root = tk.Tk() self.root.title("高考倒計時軟件") self.root.attributes('-alpha', 0.8) # 設(shè)置初始透明度 self.root.overrideredirect(True) # 無邊框窗口 # 設(shè)置窗口大小 self.root.geometry('300x240') # 設(shè)置窗口背景為白色 self.root.configure(bg='white') # 設(shè)置窗口透明度 self.root.attributes('-alpha', 0.8) # 設(shè)置圓角窗口 self.set_rounded_corners() def set_rounded_corners(self): """設(shè)置窗口圓角""" import win32gui import win32con import win32api # 等待窗口完全加載 self.root.update_idletasks() # 獲取窗口句柄 hwnd = self.root.winfo_id() # 獲取窗口當(dāng)前樣式 style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) # 設(shè)置窗口樣式 win32gui.SetWindowLong( hwnd, win32con.GWL_STYLE, style | win32con.WS_POPUP ) # 設(shè)置窗口為圓角并啟用分層窗口 win32gui.SetWindowLong( hwnd, win32con.GWL_EXSTYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED ) # 設(shè)置窗口為圓角 self._region = win32gui.CreateRoundRectRgn( 0, 0, self.root.winfo_width() + 1, self.root.winfo_height() + 1, 40, 40 # 圓角的寬度和高度 ) win32gui.SetWindowRgn(hwnd, self._region, True) # 設(shè)置窗口透明色鍵,使圓角外區(qū)域完全透明 win32gui.SetLayeredWindowAttributes(hwnd, 0, int(0.8 * 255), win32con.LWA_ALPHA) # 保存窗口位置用的變量 self.x = 0 self.y = 0 # 加載配置 self.config = self.load_config() # 當(dāng)前顯示的目標(biāo)索引 self.current_target_index = 0 # 主框架 self.main_frame = tk.Frame(self.root, bg='white') self.main_frame.pack(padx=10, pady=5) # 標(biāo)題顯示(第一行) self.title_label = tk.Label( self.main_frame, text="", # 將在update_countdown中設(shè)置 font=("微軟雅黑", 14), fg='#4169E1', bg='white' ) self.title_label.pack() # 剩余天數(shù)顯示(第二行) self.days_label = tk.Label( self.main_frame, text="", font=("微軟雅黑", 30, "bold"), fg='#FF4500', bg='white' ) self.days_label.pack() # 倒計時顯示(第三行) self.countdown_label = tk.Label( self.main_frame, text="", font=("微軟雅黑", 16, ), fg='#758796', bg='white' ) self.countdown_label.pack() # 日期顯示(第四行) self.date_label = tk.Label( self.main_frame, text="", font=("微軟雅黑", 12), fg='#696969', bg='white' ) self.date_label.pack() # 默認(rèn)激勵語句列表 self.default_mottos = [ "不明白你們遇到好事,為什么要掐腿揉眼睛,真醒了怎么辦?", "天道酬勤,未來可期。", "一分耕耘,一分收獲。", "堅持就是勝利。", "相信自己,你就是最好的。", "付出終有回報,努力不會白費。" ] # 當(dāng)前使用的激勵語句 self.current_motto = self.get_motto() # 激勵文字 self.motto_label = tk.Label( self.main_frame, text=self.current_motto, font=("微軟雅黑", 10), fg='#77C5E6', bg='white', wraplength=260, # 設(shè)置較小的換行寬度以確保兩行顯示 height=3 # 設(shè)置固定高度為2行 ) self.motto_label.pack() # 添加切換按鈕框架 self.button_frame = tk.Frame(self.main_frame, bg='white') self.button_frame.pack(pady=5) # 添加目標(biāo)指示器框架 self.dots_frame = tk.Frame(self.button_frame, bg='white') self.dots_frame.pack() # 存儲圓點標(biāo)簽的列表 self.dot_labels = [] # 控制面板 self.control_window = None # 綁定鼠標(biāo)事件 self.root.bind('<Button-1>', self.save_last_click) self.root.bind('<B1-Motion>', self.drag_window) self.root.bind('<Button-3>', self.show_control_panel) # 開始倒計時 self.update_countdown() # 修復(fù)所有方法的縮進(jìn),確保它們都是 CountdownTimer 類的直接方法 def load_config(self): default_config = { 'transparency': 0.8, 'targets': [ { 'name': '高考', 'date': '2025-06-07' } ], 'position': [100, 100], 'topmost': False, 'auto_start': False } try: if os.path.exists('gaokao_config.json'): with open('gaokao_config.json', 'r', encoding='utf-8') as f: config = json.load(f) if not all(key in config for key in default_config.keys()): return default_config return config return default_config except: return default_config def save_config(self): with open('gaokao_config.json', 'w', encoding='utf-8') as f: json.dump(self.config, f, ensure_ascii=False, indent=2) def save_last_click(self, event): self.x = event.x self.y = event.y def drag_window(self, event): new_x = self.root.winfo_x() + (event.x - self.x) new_y = self.root.winfo_y() + (event.y - self.y) self.root.geometry(f"+{new_x}+{new_y}") self.config['position'] = [new_x, new_y] self.save_config() def show_control_panel(self, event): if self.control_window is None or not tk.Toplevel.winfo_exists(self.control_window): self.control_window = tk.Toplevel(self.root) self.control_window.title("設(shè)置") self.control_window.geometry('300x520') self.control_window.resizable(False, False) # 創(chuàng)建主框架并添加內(nèi)邊距 main_frame = tk.Frame(self.control_window, padx=20, pady=10) main_frame.pack(fill='both', expand=True) # 透明度控制區(qū)域 transparency_frame = tk.LabelFrame(main_frame, text="透明度設(shè)置", padx=10, pady=5) transparency_frame.pack(fill='x', pady=(0, 10)) transparency = ttk.Scale( transparency_frame, from_=0.1, to=1.0, value=self.config['transparency'], command=self.update_transparency ) transparency.pack(fill='x', pady=5) # 目標(biāo)管理區(qū)域 targets_frame = tk.LabelFrame(main_frame, text="倒計時目標(biāo)管理", padx=10, pady=5) targets_frame.pack(fill='both', expand=True) # 目標(biāo)列表框架 self.target_frame = tk.Frame(targets_frame) self.target_frame.pack(fill='both', expand=True, pady=5) # 添加目標(biāo)按鈕 add_button = tk.Button( targets_frame, text="添加新目標(biāo)", command=self.add_target, width=15 ) add_button.pack(pady=10) # 添加窗口置頂和開機啟動選項 options_frame = tk.LabelFrame(main_frame, text="其他設(shè)置", padx=10, pady=5) options_frame.pack(fill='x', pady=(0, 10)) # 窗口置頂選項 self.topmost_var = tk.BooleanVar(value=self.config.get('topmost', False)) topmost_check = tk.Checkbutton( options_frame, text="窗口置頂", variable=self.topmost_var, command=self.toggle_topmost ) topmost_check.pack(anchor='w') # 開機啟動選項 self.auto_start_var = tk.BooleanVar(value=self.config.get('auto_start', False)) auto_start_check = tk.Checkbutton( options_frame, text="開機啟動", variable=self.auto_start_var, command=self.toggle_auto_start ) auto_start_check.pack(anchor='w') # 添加切換激勵語句和關(guān)閉程序按鈕的框架 buttons_frame = tk.Frame(main_frame) buttons_frame.pack(fill='x', pady=10) # 添加切換激勵語句按鈕(靠左) change_motto_button = tk.Button( buttons_frame, text="切換激勵語句", command=self.change_motto, width=15 ) change_motto_button.pack(side='left', padx=5) # 添加關(guān)閉程序按鈕(靠右) close_button = tk.Button( buttons_frame, text="關(guān)閉程序", command=self.confirm_exit, fg='red', width=15 ) close_button.pack(side='right', padx=5) self.update_target_list() def update_transparency(self, value): transparency = float(value) self.root.attributes('-alpha', transparency) self.config['transparency'] = transparency self.save_config() def add_target(self): # 檢查目標(biāo)數(shù)量是否已達(dá)到上限 if len(self.config['targets']) >= 5: tk.messagebox.showwarning("提示", "最多只能添加5個倒計時目標(biāo)") return dialog = tk.Toplevel(self.control_window) dialog.title("添加目標(biāo)") dialog.geometry('300x250') dialog.resizable(False, False) # 創(chuàng)建主框架 main_frame = tk.Frame(dialog, padx=20, pady=10) main_frame.pack(fill='both', expand=True) # 名稱輸入?yún)^(qū)域 name_frame = tk.Frame(main_frame) name_frame.pack(fill='x', pady=(0, 10)) tk.Label(name_frame, text="目標(biāo)名稱:", width=10, anchor='w').pack(side='left') name_entry = tk.Entry(name_frame) name_entry.pack(side='left', fill='x', expand=True) # 日期輸入?yún)^(qū)域 date_frame = tk.Frame(main_frame) date_frame.pack(fill='x', pady=(0, 10)) tk.Label(date_frame, text="目標(biāo)日期:", width=10, anchor='w').pack(side='left') # 年份輸入 year_var = tk.StringVar(value=str(datetime.datetime.now().year)) year_spinbox = ttk.Spinbox(date_frame, from_=2024, to=2100, width=5, textvariable=year_var) year_spinbox.pack(side='left') tk.Label(date_frame, text="年").pack(side='left', padx=2) # 月份輸入 month_var = tk.StringVar(value='01') month_spinbox = ttk.Spinbox(date_frame, from_=1, to=12, width=3, textvariable=month_var, format='%02.0f') month_spinbox.pack(side='left') tk.Label(date_frame, text="月").pack(side='left', padx=2) # 日期輸入 day_var = tk.StringVar(value='01') day_spinbox = ttk.Spinbox(date_frame, from_=1, to=31, width=3, textvariable=day_var, format='%02.0f') day_spinbox.pack(side='left') tk.Label(date_frame, text="日").pack(side='left', padx=2) # 時間輸入?yún)^(qū)域 time_frame = tk.Frame(main_frame) time_frame.pack(fill='x', pady=(0, 20)) tk.Label(time_frame, text="目標(biāo)時間:", width=10, anchor='w').pack(side='left') # 小時輸入 hour_var = tk.StringVar(value='00') hour_spinbox = ttk.Spinbox(time_frame, from_=0, to=23, width=3, textvariable=hour_var, format='%02.0f') hour_spinbox.pack(side='left') tk.Label(time_frame, text=":").pack(side='left', padx=2) # 分鐘輸入 minute_var = tk.StringVar(value='00') minute_spinbox = ttk.Spinbox(time_frame, from_=0, to=59, width=3, textvariable=minute_var, format='%02.0f') minute_spinbox.pack(side='left') # 按鈕區(qū)域 button_frame = tk.Frame(main_frame) button_frame.pack(side='bottom', pady=(0, 10)) def save(): name = name_entry.get().strip() year = year_var.get().zfill(4) month = month_var.get().zfill(2) day = day_var.get().zfill(2) hour = hour_var.get().zfill(2) minute = minute_var.get().zfill(2) if not name: tk.messagebox.showwarning("提示", "請輸入目標(biāo)名稱") return date = f"{year}-{month}-{day}" try: datetime.datetime.strptime(f"{date} {hour}:{minute}", '%Y-%m-%d %H:%M') self.config['targets'].append({ 'name': name, 'date': date, 'time': f"{hour}:{minute}" }) self.save_config() self.update_target_list() dialog.destroy() except ValueError: tk.messagebox.showerror("錯誤", "日期無效,請檢查輸入") # 取消按鈕 tk.Button(button_frame, text="取消", width=10, command=dialog.destroy).pack(side='left', padx=5) # 保存按鈕 tk.Button(button_frame, text="保存", width=10, command=save).pack(side='left', padx=5) def update_target_list(self): for widget in self.target_frame.winfo_children(): widget.destroy() for i, target in enumerate(self.config['targets']): frame = tk.Frame(self.target_frame) frame.pack(fill='x', pady=2) time_str = target.get('time', '00:00') tk.Label( frame, text=f"{target['name']}: {target['date']} {time_str}", anchor='w' ).pack(side='left', fill='x', expand=True) tk.Button( frame, text="刪除", command=lambda idx=i: self.delete_target(idx), width=6 ).pack(side='right') def confirm_exit(self): if tk.messagebox.askokcancel("確認(rèn)", "確定要關(guān)閉程序嗎?"): self.root.quit() self.root.destroy() def delete_target(self, index): self.config['targets'].pop(index) # 如果刪除的是當(dāng)前顯示的目標(biāo),調(diào)整當(dāng)前索引 if index == self.current_target_index: self.current_target_index = 0 elif index < self.current_target_index: self.current_target_index -= 1 self.save_config() self.update_target_list() self.update_countdown() def get_motto(self): """獲取激勵語句,優(yōu)先從API獲取,失敗則使用默認(rèn)語句""" try: response = requests.get('https://jkapi.com/api/one_yan?type=json', timeout=5) if response.status_code == 200: data = response.json() return data.get('content', random.choice(self.default_mottos)) except: pass return random.choice(self.default_mottos) def update_countdown(self): now = datetime.datetime.now() # 不再每次更新激勵語句 # self.motto_label.config(text=self.get_motto()) # 檢查是否有目標(biāo) if not self.config['targets']: self.title_label.config(text="沒有設(shè)置倒計時目標(biāo)") self.days_label.config(text="請右鍵添加目標(biāo)") self.countdown_label.config(text="") self.date_label.config(text="") self.update_count_label() self.root.after(1000, self.update_countdown) return # 確保當(dāng)前索引在有效范圍內(nèi) if self.current_target_index >= len(self.config['targets']): self.current_target_index = 0 # 只顯示當(dāng)前選中的目標(biāo) target = self.config['targets'][self.current_target_index] time_str = target.get('time', '00:00') target_datetime = datetime.datetime.strptime(f"{target['date']} {time_str}", '%Y-%m-%d %H:%M') delta = target_datetime - now # 獲取年份 year = target_datetime.year # 更新標(biāo)題(第一行)- 距離2025年"項目標(biāo)題"還有: self.title_label.config(text=f"距離{year}年{target['name']}") # 處理目標(biāo)日期已過的情況 if delta.days < 0: # 第二行 - 顯示剩余天數(shù) self.days_label.config(text="0天(已結(jié)束)") # 第三行 - 顯示倒計時 self.countdown_label.config(text="0小時0分0秒") else: days = delta.days hours = delta.seconds // 3600 minutes = (delta.seconds % 3600) // 60 seconds = delta.seconds % 60 # 第二行 - 顯示剩余天數(shù) self.days_label.config(text=f"{days}天") # 第三行 - 顯示倒計時 self.countdown_label.config(text=f"{hours}小時{minutes}分{seconds}秒") # 第四行 - 顯示倒計時日期 formatted_date = target_datetime.strftime("%Y年%m月%d日") self.date_label.config(text=formatted_date) self.update_count_label() self.root.after(1000, self.update_countdown) def update_count_label(self): """更新目標(biāo)指示器顯示""" total = len(self.config['targets']) # 清除現(xiàn)有的圓點 for dot in self.dot_labels: dot.destroy() self.dot_labels.clear() # 如果只有一個目標(biāo)或沒有目標(biāo),不顯示圓點 if total <= 1: return # 為每個目標(biāo)創(chuàng)建一個圓點 for i in range(total): dot = tk.Label( self.dots_frame, text="●", font=("微軟雅黑", 8), fg='#D3D3D3' if i != self.current_target_index else '#4169E1', bg='white', cursor='hand2' # 添加手型光標(biāo) ) dot.pack(side='left', padx=2) # 綁定點擊事件 dot.bind('<Button-1>', lambda e, idx=i: self.switch_to_target(idx)) self.dot_labels.append(dot) def switch_to_target(self, index): """切換到指定目標(biāo)""" if self.config['targets']: self.current_target_index = index self.update_countdown() def toggle_topmost(self): """切換窗口置頂狀態(tài)""" is_topmost = self.topmost_var.get() self.root.attributes('-topmost', is_topmost) self.config['topmost'] = is_topmost self.save_config() def change_motto(self): """切換激勵語句""" new_motto = self.get_motto() self.current_motto = new_motto self.motto_label.config(text=new_motto) def toggle_auto_start(self): """切換開機啟動狀態(tài)""" import winreg key_path = r'Software\\Microsoft\\Windows\\CurrentVersion\\Run' app_path = os.path.abspath(sys.argv[0]) try: key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_ALL_ACCESS) if self.auto_start_var.get(): winreg.SetValueEx(key, 'GaokaoCountdown', 0, winreg.REG_SZ, app_path) else: try: winreg.DeleteValue(key, 'GaokaoCountdown') except WindowsError: pass winreg.CloseKey(key) self.config['auto_start'] = self.auto_start_var.get() self.save_config() except Exception as e: messagebox.showerror("錯誤", f"設(shè)置開機啟動失?。簕str(e)}") self.auto_start_var.set(not self.auto_start_var.get()) def run(self): # 設(shè)置初始位置 if 'position' in self.config: self.root.geometry(f"+{self.config['position'][0]}+{self.config['position'][1]}") # 設(shè)置初始透明度 self.root.attributes('-alpha', self.config['transparency']) # 設(shè)置窗口置頂狀態(tài) if self.config.get('topmost', False): self.root.attributes('-topmost', True) self.root.mainloop() if __name__ == "__main__": app = CountdownTimer() app.run()
到此這篇關(guān)于基于Python和Tkinter實現(xiàn)高考倒計時功能的文章就介紹到這了,更多相關(guān)Python Tkinter高考倒計時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python和NLTK進(jìn)行文本預(yù)處理示例詳解
文將介紹如何使用Python編程語言和NLTK(Natural Language Toolkit)庫進(jìn)行文本預(yù)處理,為后續(xù)的文本分析和機器學(xué)習(xí)任務(wù)做準(zhǔn)備,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-03-03關(guān)于pycharm找不到MySQLdb模塊的解決方法
MySQLdb是用于Python鏈接Mysql數(shù)據(jù)庫的接口,它實現(xiàn)了Python數(shù)據(jù)庫API規(guī)范V2.0,基于MySql C API上建立的,本文給大家介紹pycharm找不到MySQLdb模塊解決方法,需要的朋友參考下吧2021-06-06Python使用keras和tensorflow遇到的問題及解決
這篇文章主要介紹了Python使用keras和tensorflow遇到的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03