python - 暂停 matplotlib 自定义动画循环

标签 python animation matplotlib

我想暂停在自己的事件循环中运行的动画。这是代码的简化版本:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
from mpl_toolkits.mplot3d import proj3d

import time

def main():
    global paused
    paused = False

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    ax.set_ylim(-100, 100)
    ax.set_xlim(-10, 10)
    ax.set_zlim(-100, 100)

    plt.ion()
    plt.show()

    def pause_anim(event):
        global paused
        paused = not paused

    pause_ax = fig.add_axes((0.7, 0.03, 0.1, 0.04))
    pause_button = Button(pause_ax, 'pause', hovercolor='0.975')
    pause_button.on_clicked(pause_anim)

    x = np.arange(-50, 51)

    line = ax.plot([], [], [], c="r")[0]

    y_range = list(np.arange(1, 60, 3))
    y_len = len(y_range)
    idx = 0

    while True:

        if not paused:
            idx += 1
            if idx >= y_len:
                break

            y = y_range[idx]
            z = - x**2 + y - 100

            line.set_data(x, 0)
            line.set_3d_properties(z)

            plt.draw()
            plt.pause(0.2)

        else:
            time.sleep(1)  # this stops button events from happening
            #input("Shoop?")  # prompting for input works
            # I've also tried putting a mutex here

if __name__ == '__main__':
    main()

正如我在代码中提到的,我尝试了 time.sleepLock,但是一旦暂停,这些就会阻止我取消暂停。如何暂停循环而不破坏恢复动画的能力?

最佳答案

您可以将 else 部分中的 time.sleep(1) 替换为 plt.pause,就像您所做的那样在 if 部分。

        ....
        plt.draw()
        plt.pause(0.2)
    else:
        plt.pause(0.2)

另一种选择当然是使用 matplotlib 动画,例如 FuncAnimation,它具有方法 .event_source.stop().event_source.start ()。 (如该问题的两个答案所示:stop / start / pause in python matplotlib animation)

关于python - 暂停 matplotlib 自定义动画循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43383093/

相关文章:

python - 在python中检查相同类型的值

android - 通过线性布局移动图像

iphone - 如何在部分 curl 动画后展开?

python - Matplotlib 控制哪个图在最上面

Python Pylab散点图误差条(每个点的误差都是唯一的)

python - 未找到 Django 页面 - 一般

python - 根据文件夹更改的数量触发多个 Jenkins 作业

python - 通过应用变换简化 SVG - 减小尺寸

Javascript setInterval 连续多行

python - Matplotlib/Tkinter 错误 : exception when comparing collection3d objects