@@ -460,12 +460,12 @@ def _update_schedule_display(self, weekday_to_show: int) -> None:
460
460
color = self ._get_course_color (now , course )
461
461
if i < len (self .course_labels ):
462
462
# 强制更新标签颜色状态
463
- self ._update_existing_label (i , course , color , force_update = True )
463
+ self ._update_existing_label (i , course , color , now , force_update = True )
464
464
# 调整grid行号
465
465
self .course_labels [i ].master .grid (row = i )
466
466
else :
467
467
# 创建新标签并指定grid行号
468
- self ._create_new_label (course , color , row = i )
468
+ self ._create_new_label (course , color , now , row = i )
469
469
470
470
# 移除多余的标签
471
471
self ._remove_extra_labels (schedule_for_day )
@@ -492,12 +492,19 @@ def _get_course_color(self, now: datetime, course: Dict[str, str]) -> str:
492
492
493
493
# 从缓存获取或计算
494
494
if cache_key not in self ._course_time_cache :
495
- self ._course_time_cache [cache_key ] = (
496
- datetime .strptime (course ["start_time" ], "%H:%M" ).time (),
497
- datetime .strptime (course ["end_time" ], "%H:%M" ).time ()
498
- )
495
+ try :
496
+ self ._course_time_cache [cache_key ] = (
497
+ datetime .strptime (course ["start_time" ], "%H:%M" ).time (),
498
+ datetime .strptime (course ["end_time" ], "%H:%M" ).time ()
499
+ )
500
+ except (KeyError , ValueError ):
501
+ # 如果时间格式错误或键不存在,缓存一个无效标志并返回红色
502
+ self ._course_time_cache [cache_key ] = (None , None )
503
+ return "red"
499
504
500
505
start_time , end_time = self ._course_time_cache [cache_key ]
506
+ if not start_time : # 检查无效标志
507
+ return "red"
501
508
current_time = now .time ()
502
509
503
510
if start_time <= current_time <= end_time :
@@ -506,10 +513,42 @@ def _get_course_color(self, now: datetime, course: Dict[str, str]) -> str:
506
513
return "green" # 已上完的课程为绿色
507
514
return "red" # 未上过的课程为红色
508
515
509
- def _update_existing_label (self , index : int , course : Dict [str , str ], color : str , force_update : bool = False ) -> None :
516
+ def _get_course_display_text (self , course : Dict [str , str ], color : str , now : datetime ) -> str :
517
+ """根据课程状态和设置生成显示文本"""
518
+ mode = self .config_handler .current_course_time_display_mode
519
+
520
+ # 仅当课程正在进行中 ("yellow") 且模式不是 "default" 时,才应用特殊显示
521
+ if color == "yellow" and mode != "default" :
522
+ end_time_str = course .get ("end_time" , "00:00" )
523
+
524
+ if mode == "end_time" :
525
+ return f"{ end_time_str } { course ['name' ]} "
526
+
527
+ if mode == "countdown" :
528
+ try :
529
+ end_time_obj = datetime .strptime (end_time_str , "%H:%M" ).time ()
530
+ end_datetime = now .replace (hour = end_time_obj .hour , minute = end_time_obj .minute , second = 0 , microsecond = 0 )
531
+
532
+ # 如果结束时间在当前时间之前(例如,刚好过了一秒),则显示为0
533
+ if end_datetime < now :
534
+ remaining_seconds = 0
535
+ else :
536
+ remaining_seconds = (end_datetime - now ).total_seconds ()
537
+
538
+ minutes = int (remaining_seconds // 60 )
539
+ seconds = int (remaining_seconds % 60 )
540
+ return f"{ minutes :02d} :{ seconds :02d} { course ['name' ]} "
541
+ except (ValueError , KeyError ):
542
+ # 如果时间格式错误或键不存在,回退到默认显示
543
+ return f"{ course ['start_time' ]} { course ['name' ]} "
544
+
545
+ # 默认显示开始时间
546
+ return f"{ course ['start_time' ]} { course ['name' ]} "
547
+
548
+ def _update_existing_label (self , index : int , course : Dict [str , str ], color : str , now : datetime , force_update : bool = False ) -> None :
510
549
"""更新现有课程标签"""
511
550
label = self .course_labels [index ]
512
- new_text = f" { course [ 'start_time' ] } { course [ 'name' ] } "
551
+ new_text = self . _get_course_display_text ( course , color , now )
513
552
514
553
# 始终更新文本和颜色状态
515
554
label .config (text = new_text )
@@ -591,14 +630,14 @@ def _adjust_ui_layout(self) -> None:
591
630
# 强制更新所有部件
592
631
self .root .update_idletasks ()
593
632
594
- def _create_new_label (self , course : Dict [str , str ], color : str , row : int ) -> None :
633
+ def _create_new_label (self , course : Dict [str , str ], color : str , now : datetime , row : int ) -> None :
595
634
"""创建新课程标签"""
596
635
course_frame = tk .Frame (self .schedule_frame )
597
636
course_frame .grid (row = row , column = 0 , sticky = "ew" , pady = 2 ) # 使用指定的行号
598
637
599
638
label = tk .Label (
600
639
course_frame ,
601
- text = f" { course [ 'start_time' ] } { course [ 'name' ] } " ,
640
+ text = self . _get_course_display_text ( course , color , now ) ,
602
641
font = ("微软雅黑" , self .config_handler .schedule_size , "bold" ),
603
642
fg = self .config_handler .font_color ,
604
643
anchor = 'w'
@@ -848,30 +887,45 @@ def _check_and_show_tomorrow_preview(self, now: datetime):
848
887
if self .week_preview_window and self .week_preview_window .winfo_exists ():
849
888
return
850
889
851
- # 检查当天的所有课程是否都已结束
852
890
today_weekday_str = str (now .weekday ())
853
891
current_schedule_name = self .schedule .get ("current_schedule" , "default" )
854
892
schedule_data = self .schedule .get ("schedules" , {}).get (current_schedule_name , {})
855
893
courses_today = schedule_data .get (today_weekday_str , [])
856
894
857
895
if not courses_today :
858
- return # 今天没课,不触发
896
+ return # 今天没课,不触发
859
897
898
+ trigger_count = self .config_handler .preview_tomorrow_trigger_count
899
+
900
+ finished_courses_count = 0
860
901
all_courses_finished = True
861
902
last_course_end_time = None
903
+
862
904
for course in courses_today :
863
905
try :
864
906
end_time = datetime .strptime (course ['end_time' ], "%H:%M" ).time ()
865
907
if last_course_end_time is None or end_time > last_course_end_time :
866
908
last_course_end_time = end_time
867
- if now .time () <= end_time :
909
+
910
+ if now .time () > end_time :
911
+ finished_courses_count += 1
912
+ else :
868
913
all_courses_finished = False
869
- break
870
914
except (ValueError , KeyError ):
871
915
continue # 忽略格式错误的课程
872
916
873
- # 如果所有课程都结束了,且当前时间在最后一节课结束后,则触发
874
- if all_courses_finished and now .time () > last_course_end_time :
917
+ should_trigger = False
918
+ # 检查触发条件
919
+ if trigger_count > 0 :
920
+ # 按第N节课触发
921
+ if finished_courses_count >= trigger_count :
922
+ should_trigger = True
923
+ else :
924
+ # 按全部课程结束后触发 (旧逻辑)
925
+ if all_courses_finished and last_course_end_time and now .time () > last_course_end_time :
926
+ should_trigger = True
927
+
928
+ if should_trigger :
875
929
from tools .week_preview import WeekPreviewWindow
876
930
self .week_preview_window = WeekPreviewWindow (self .root , self , day_offset = 1 )
877
931
self .week_preview_window .show ()
0 commit comments