@@ -195,33 +195,44 @@ def current_index(self, index: dict[str, int]):
195
195
if not self ._initialized :
196
196
return
197
197
198
- if not set (index .keys ()).issubset (set (self ._current_index .keys ())):
199
- raise KeyError (
200
- f"All dimension keys for setting `current_index` must be present in the widget sliders. "
201
- f"The dimensions currently used for sliders are: { list (self .current_index .keys ())} "
202
- )
198
+ if self ._reentrant_block :
199
+ return
203
200
204
- for k , val in index .items ():
205
- if not isinstance (val , int ):
206
- raise TypeError ("Indices for all dimensions must be int" )
207
- if val < 0 :
208
- raise IndexError ("negative indexing is not supported for ImageWidget" )
209
- if val > self ._dims_max_bounds [k ]:
210
- raise IndexError (
211
- f"index { val } is out of bounds for dimension '{ k } ' "
212
- f"which has a max bound of: { self ._dims_max_bounds [k ]} "
201
+ try :
202
+ self ._reentrant_block = True # block re-execution until current_index has *fully* completed execution
203
+ if not set (index .keys ()).issubset (set (self ._current_index .keys ())):
204
+ raise KeyError (
205
+ f"All dimension keys for setting `current_index` must be present in the widget sliders. "
206
+ f"The dimensions currently used for sliders are: { list (self .current_index .keys ())} "
213
207
)
214
208
215
- self ._current_index .update (index )
209
+ for k , val in index .items ():
210
+ if not isinstance (val , int ):
211
+ raise TypeError ("Indices for all dimensions must be int" )
212
+ if val < 0 :
213
+ raise IndexError ("negative indexing is not supported for ImageWidget" )
214
+ if val > self ._dims_max_bounds [k ]:
215
+ raise IndexError (
216
+ f"index { val } is out of bounds for dimension '{ k } ' "
217
+ f"which has a max bound of: { self ._dims_max_bounds [k ]} "
218
+ )
216
219
217
- for i , (ig , data ) in enumerate (zip (self .managed_graphics , self .data )):
218
- frame = self ._process_indices (data , self ._current_index )
219
- frame = self ._process_frame_apply (frame , i )
220
- ig .data = frame
220
+ self ._current_index .update (index )
221
221
222
- # call any event handlers
223
- for handler in self ._current_index_changed_handlers :
224
- handler (self .current_index )
222
+ for i , (ig , data ) in enumerate (zip (self .managed_graphics , self .data )):
223
+ frame = self ._process_indices (data , self ._current_index )
224
+ frame = self ._process_frame_apply (frame , i )
225
+ ig .data = frame
226
+
227
+ # call any event handlers
228
+ for handler in self ._current_index_changed_handlers :
229
+ handler (self .current_index )
230
+ except Exception as exc :
231
+ # raise original exception
232
+ raise exc # current_index setter has raised. The lines above below are probably more relevant!
233
+ finally :
234
+ # set_value has finished executing, now allow future executions
235
+ self ._reentrant_block = False
225
236
226
237
@property
227
238
def n_img_dims (self ) -> list [int ]:
@@ -574,10 +585,12 @@ def __init__(
574
585
575
586
self .figure .add_gui (self ._image_widget_sliders )
576
587
577
- self ._initialized = True
578
-
579
588
self ._current_index_changed_handlers = set ()
580
589
590
+ self ._reentrant_block = False
591
+
592
+ self ._initialized = True
593
+
581
594
@property
582
595
def frame_apply (self ) -> dict | None :
583
596
return self ._frame_apply
0 commit comments