@@ -916,6 +916,63 @@ def test_span_selector_bound(direction):
916
916
assert tool ._edge_handles .positions == handle_positions
917
917
918
918
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
+
919
976
def check_lasso_selector (** kwargs ):
920
977
ax = get_ax ()
921
978
0 commit comments