Python 3.x 使用ipython小部件操纵绘图,这些绘图在无限循环中不断更新

Python 3.x 使用ipython小部件操纵绘图,这些绘图在无限循环中不断更新,python-3.x,jupyter-notebook,ipython-parallel,ipywidgets,Python 3.x,Jupyter Notebook,Ipython Parallel,Ipywidgets,在ipython笔记本中,我尝试使用Jupyter做一个计算,它在一个while循环中运行了很长一段时间。我使用pyplot显示我的计算的当前状态,我希望能够通过ipywidgets与计算和绘图进行通信。例如,这可以是用于计算的停止按钮,也可以是调整绘图更新率的滑块 下面我展示了一个sin函数的最小示例,它不断地以不同的相移绘制。“开始”按钮开始计算,“停止”按钮停止计算,滑块应调整整个更新的速度。文本框显示当前相移 import numpy as np import matplotlib.py

在ipython笔记本中,我尝试使用Jupyter做一个计算,它在一个while循环中运行了很长一段时间。我使用pyplot显示我的计算的当前状态,我希望能够通过ipywidgets与计算和绘图进行通信。例如,这可以是用于计算的停止按钮,也可以是调整绘图更新率的滑块

下面我展示了一个sin函数的最小示例,它不断地以不同的相移绘制。“开始”按钮开始计算,“停止”按钮停止计算,滑块应调整整个更新的速度。文本框显示当前相移

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import *
import IPython.display as display
import _thread
import time

%matplotlib nbagg

# set up widgets

buttons = widgets.ToggleButtons(
    options=['Stop', 'Start'],
    description='',
    disabled=False,
)

text = widgets.Text(
    value='0',
    placeholder='',
    description='Shift [rad]',
)

speed_slider = widgets.IntSlider(
    description = "Speed", 
    value = 100, 
    min = 10, 
    max = 500, 
    step = 10,
)

container = widgets.HBox(children = [buttons, speed_slider, text])

display.display(container)


# functions

def mySin(x, x0):
    return np.sin(x-x0)

def run_app(x, dx0):

    x0 = np.remainder(np.float(text.value), 2*np.pi)

    while buttons.value == buttons.options[1]:
        x0 = np.remainder(x0 + dx0, 2*np.pi)    
        line.set_ydata(mySin(x, x0))
        text.value = str(x0)
        time.sleep(speed_slider.value/1000)
        fig.canvas.draw()

# setup plot

N = 1000
x = np.linspace(0, 10*np.pi, N)
dx0 = 0.05*2*np.pi

fig, ax = plt.subplots(ncols = 1, nrows = 1, figsize = (8,3))
line    = ax.plot(x, mySin(x, np.float(text.value)))[0]

# act on button change

def buttons_on_changed(val):

    if buttons.value == buttons.options[1]:
        _thread.start_new_thread(run_app, (x, dx0))

buttons.observe(buttons_on_changed)
我尝试在新线程中运行函数“run_app”,以使交互成为可能。我知道thread已经被弃用了,但我想首先知道,这是否是正确的方法。上面的例子或多或少可以工作,但执行会在几秒钟后停止,或者当我在笔记本中执行其他操作(滚动、单击等)时停止。因此,我的问题如下:

  • 线程正在关闭还是正在失去优先级?为什么会这样做
  • 这到底是一个好方法,还是可以通过更简单的方式实现。不幸的是,我在网上没有找到任何东西
  • 非常感谢, 坦率的