У меня есть интерактивный сюжет, использующий matplotlib и ipywidgets, который мучительно медленный, поэтому отображение отстает от взаимодействия. Один из способов исправить это - указать моему виджету continuous_update=False
, но я не хочу этого делать - мне нравится, когда пользователь видит изменения через постоянную обратную связь.
Я подумал, что, возможно, смогу проверитьочередь сообщений от виджета: если последующие изменения находятся в очереди, то текущее состояние устарело, и я мог бы также отменить построение графика. Сообщения обязательно должны быть поставлены в очередь где-то . Доступна ли эта очередь сообщений?
Вот минимальный пример.
import matplotlib.pyplot as plt
import numpy
from IPython.display import display
import ipywidgets
# Don't want continuous_update=False
widg = ipywidgets.FloatSlider(value=.5,min=0,max=1,step=.01)
output = ipywidgets.Output()
def update_plot(msg):
# ??? if there are further changes queued: return
a = widg.value # or msg['new']
x = numpy.linspace(0,1,100)
plt.plot(x, (x>=a) & (x<=a+.2))
plt.ylim(-.02,1.02)
output.clear_output(wait=True)
with output:
plt.show()
widg.observe(update_plot, 'value')
display(ipywidgets.VBox([widg, output]))
update_plot(None)