6464)
6565
6666
67- APP_NAME = 'Python Easy Chess GUI'
68- APP_VERSION = 'v1.19.0'
69- BOX_TITLE = f'{ APP_NAME } { APP_VERSION } '
67+ APP_NAME = 'Python Easy Chess GUI'
68+ APP_VERSION = 'v1.19.0'
69+ BOX_TITLE = f'{ APP_NAME } { APP_VERSION } '
70+ REVIEW_MAX_DISPLAY_GAMES = 5000
7071
7172
7273platform = sys .platform
@@ -2507,20 +2508,32 @@ def save_game(self):
25072508 with open (self .pecg_auto_save_game , mode = 'a+' ) as f :
25082509 f .write ('{}\n \n ' .format (self .game ))
25092510
2510- def load_pgn_games (self , pgn ):
2511- """Load all games from a pgn file ."""
2511+ def load_pgn_games (self , pgn , max_games = REVIEW_MAX_DISPLAY_GAMES ):
2512+ """Load review game headers up to a display limit ."""
25122513 games = []
2514+ is_truncated = False
25132515 with open (pgn , encoding = 'utf-8' , errors = 'replace' ) as h :
2514- while True :
2515- game = chess .pgn .read_game (h )
2516- if game is None :
2516+ while len (games ) < max_games :
2517+ offset = h .tell ()
2518+ headers = chess .pgn .read_headers (h )
2519+ if headers is None :
25172520 break
2518- games .append (game )
2519- return games
2521+ games .append ({'offset' : offset , 'headers' : headers })
2522+
2523+ if len (games ) == max_games and chess .pgn .read_headers (h ) is not None :
2524+ is_truncated = True
2525+
2526+ return games , is_truncated
2527+
2528+ def load_review_game (self , pgn , game_entry ):
2529+ """Load a single review game from its file offset."""
2530+ with open (pgn , encoding = 'utf-8' , errors = 'replace' ) as h :
2531+ h .seek (game_entry ['offset' ])
2532+ return chess .pgn .read_game (h )
25202533
25212534 def get_review_game_text (self , game , index ):
25222535 """Return one-line summary of a game for review list."""
2523- headers = game .headers
2536+ headers = game .headers if hasattr ( game , 'headers' ) else game [ 'headers' ]
25242537 white = headers .get ('White' , '?' )
25252538 black = headers .get ('Black' , '?' )
25262539 result = headers .get ('Result' , '*' )
@@ -2568,7 +2581,7 @@ def select_review_game(self, pgn_file=None, games=None):
25682581 continue
25692582
25702583 try :
2571- selected_games = self .load_pgn_games (selected_pgn )
2584+ selected_games , is_truncated = self .load_pgn_games (selected_pgn )
25722585 except (FileNotFoundError , OSError , UnicodeError ) as exc :
25732586 logging .exception (
25742587 f'Failed to load pgn games from { selected_pgn } : { exc } ' )
@@ -2588,8 +2601,12 @@ def select_review_game(self, pgn_file=None, games=None):
25882601 for index , game in enumerate (selected_games )
25892602 ]
25902603 w ['game_k' ].Update (selection_list , set_to_index = [0 ])
2591- w ['status_k' ].Update (
2592- f'Status: Loaded { len (selected_games )} game(s). Select one and press OK.' )
2604+ if is_truncated :
2605+ w ['status_k' ].Update (
2606+ f'Status: Showing first { len (selected_games )} games only. Select one and press OK.' )
2607+ else :
2608+ w ['status_k' ].Update (
2609+ f'Status: Loaded { len (selected_games )} game(s). Select one and press OK.' )
25932610 continue
25942611
25952612 if e == 'OK' :
@@ -2600,11 +2617,17 @@ def select_review_game(self, pgn_file=None, games=None):
26002617 continue
26012618
26022619 selected_index = selection_list .index (selected_text )
2620+ selected_game_obj = self .load_review_game (
2621+ selected_pgn , selected_games [selected_index ])
2622+ if selected_game_obj is None :
2623+ w ['status_k' ].Update ('Status: Failed to load selected game.' )
2624+ continue
2625+
26032626 selected_game = {
26042627 'pgn_file' : selected_pgn ,
26052628 'games' : selected_games ,
26062629 'game_index' : selected_index ,
2607- 'game' : selected_games [ selected_index ]
2630+ 'game' : selected_game_obj
26082631 }
26092632 break
26102633
0 commit comments