@@ -226,7 +226,15 @@ def _apply_scroll_position(self, scroll_to_bottom: bool) -> None:
226226 self .canvas .yview_moveto (position )
227227
228228 def _update_table (self , params : dict [str , ArduPilotParameter ], gui_complexity : str ) -> None :
229- """Initialize scroll load."""
229+ """
230+ Update the table from a new parameter set and start incremental rendering.
231+
232+ This method is the entry point used when the table is rebuilt for a
233+ fresh ``params`` mapping. It resets the incremental-load state, stores
234+ the active GUI complexity, renders the first batch of rows immediately
235+ (currently 20 parameters), and then starts the page-scroll/polling
236+ mechanism that loads additional chunks as needed.
237+ """
230238 self ._params_list = list (params .items ())
231239 self ._total_params = len (self ._params_list )
232240 self ._current_idx = 0
@@ -291,18 +299,42 @@ def _load_next_chunk(self, chunk_size: int = 15) -> None:
291299 self .canvas .configure (scrollregion = self .canvas .bbox ("all" ))
292300 self ._is_loading = False
293301
302+ def _cancel_page_scroll_after (self ) -> None :
303+ """Cancel any scheduled page-scroll polling callback."""
304+ after_id = getattr (self , "_page_scroll_after_id" , None )
305+ if not after_id :
306+ return
307+ try :
308+ self .after_cancel (after_id )
309+ except tk .TclError :
310+ pass
311+ finally :
312+ self ._page_scroll_after_id = None
313+
314+ def _on_destroy_cancel_page_scroll (self , _event : Optional [tk .Event ] = None ) -> None :
315+ """Stop page-scroll polling when the widget is being destroyed."""
316+ self ._cancel_page_scroll_after ()
317+
294318 def _page_scroll (self ) -> None :
295319 """Load more items when reaching the bottom."""
320+ self ._page_scroll_after_id = None
321+ if not getattr (self , "_page_scroll_destroy_binding_registered" , False ):
322+ self .bind ("<Destroy>" , self ._on_destroy_cancel_page_scroll , add = "+" )
323+ self ._page_scroll_destroy_binding_registered = True
296324 if not self .winfo_exists () or self ._current_idx >= self ._total_params :
325+ self ._cancel_page_scroll_after ()
297326 return
298327
299328 try :
300329 if self .canvas .yview ()[1 ] > 0.85 :
301330 self ._load_next_chunk (chunk_size = 15 )
302331 except tk .TclError :
303- pass
304-
305- self .after (150 , self ._page_scroll )
332+ return
333+ if self .winfo_exists () and self ._current_idx < self ._total_params :
334+ try :
335+ self ._page_scroll_after_id = self .after (150 , self ._page_scroll )
336+ except tk .TclError :
337+ self ._page_scroll_after_id = None
306338
307339 def _create_column_widgets (self , param_name : str , param : ArduPilotParameter , show_upload_column : bool ) -> list [tk .Widget ]:
308340 """Create all column widgets for a parameter row."""
0 commit comments