@@ -916,6 +916,63 @@ def test_span_selector_bound(direction):
916916 assert tool ._edge_handles .positions == handle_positions
917917
918918
919+ @pytest .mark .backend ('QtAgg' , skip_on_importerror = True )
920+ def test_span_selector_animated_artists_callback ():
921+ """Check that the animated artists changed in callbacks are updated."""
922+ x = np .linspace (0 , 2 * np .pi , 100 )
923+ values = np .sin (x )
924+
925+ fig , ax = plt .subplots ()
926+ (ln ,) = ax .plot (x , values , animated = True )
927+ (ln2 , ) = ax .plot ([], animated = True )
928+
929+ # spin the event loop to let the backend process any pending operations
930+ # before drawing artists
931+ # See blitting tutorial
932+ plt .pause (0.1 )
933+ ax .draw_artist (ln )
934+ fig .canvas .blit (fig .bbox )
935+
936+ def mean (vmin , vmax ):
937+ # Return mean of values in x between *vmin* and *vmax*
938+ indmin , indmax = np .searchsorted (x , (vmin , vmax ))
939+ v = values [indmin :indmax ].mean ()
940+ ln2 .set_data (x , v )
941+
942+ span = widgets .SpanSelector (ax , mean , direction = 'horizontal' ,
943+ onmove_callback = mean ,
944+ interactive = True ,
945+ drag_from_anywhere = True ,
946+ useblit = True )
947+
948+ # Add span selector and check that the line is draw after it was updated
949+ # by the callback
950+ press_data = [1 , 2 ]
951+ move_data = [2 , 2 ]
952+ do_event (span , 'press' , xdata = press_data [0 ], ydata = press_data [1 ], button = 1 )
953+ do_event (span , 'onmove' , xdata = move_data [0 ], ydata = move_data [1 ], button = 1 )
954+ assert span ._get_animated_artists () == (ln , ln2 )
955+ assert ln .stale is False
956+ assert ln2 .stale
957+ assert ln2 .get_ydata () == 0.9547335049088455
958+ span .update ()
959+ assert ln2 .stale is False
960+
961+ # Change span selector and check that the line is drawn/updated after its
962+ # value was updated by the callback
963+ press_data = [4 , 2 ]
964+ move_data = [5 , 2 ]
965+ release_data = [5 , 2 ]
966+ do_event (span , 'press' , xdata = press_data [0 ], ydata = press_data [1 ], button = 1 )
967+ do_event (span , 'onmove' , xdata = move_data [0 ], ydata = move_data [1 ], button = 1 )
968+ assert ln .stale is False
969+ assert ln2 .stale
970+ assert ln2 .get_ydata () == - 0.9424150707548072
971+ do_event (span , 'release' , xdata = release_data [0 ],
972+ ydata = release_data [1 ], button = 1 )
973+ assert ln2 .stale is False
974+
975+
919976def check_lasso_selector (** kwargs ):
920977 ax = get_ax ()
921978
0 commit comments