matplotlib plt.pause(0)永远不会返回,即使我关闭窗口

lawou6xi  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(142)

TL;DR当我的脚本以plt.pause(0)结尾时,我如何返回到终端提示符?
这是我的代码,一种动画w/o matplotlib.anim

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from sys import exit

def websocket(tmax=1000, dt=0.005):
    from numpy import sin
    from time import sleep
    w1 = 0.3 ; w2 = 0.4 ; slope = 0.0025
    for t in range(0, tmax):
        sleep(dt)
        yield slope*t + 0.5*(sin(w1*t)-sin(w2*t))

t, y = [], []
tmin = 0 ; dtmax = 101

fig, ax = plt.subplots(figsize=(5, 2), dpi=96, layout='tight')
line = ax.plot(0, 0)[0]
ax.set_ylim(-1, 4)
ax.set_xlim(tmin, tmin+dtmax)

for t_, y_ in enumerate(websocket(400, dt=0.002)):
    t.append(t_), y.append(y_)
    tmin = max(tmin, t_-dtmax)
    line.remove()
    ax.set_xlim(tmin, tmin+dtmax)
    line = Line2D(t[tmin:tmin+dtmax],
                                   y[tmin:tmin+dtmax])
    ax.add_line(line)
    fig.canvas.draw()
    plt.pause(0.0001)

if True:
    plt.pause(0)
else:
    plt.pause(4)

当我运行pause(0)时,它挂起显示窗口,我可以按预期与之交互,但是当我关闭绘图窗口(通过窗口管理器或使用“q”键绑定)时,脚本永远挂起,直到我在控制终端中输入^C,此时我得到以下回溯

^CTraceback (most recent call last):
  File "/home/boffi/ppp.py", line 31, in <module>
    plt.pause(0)
  File "/usr/lib64/python3.11/site-packages/matplotlib/pyplot.py", line 557, in pause
    canvas.start_event_loop(interval)
  File "/usr/lib64/python3.11/site-packages/matplotlib/backends/backend_qt.py", line 407, in start_event_loop
    with _maybe_allow_interrupt(event_loop):
  File "/usr/lib64/python3.11/contextlib.py", line 144, in __exit__
    next(self.gen)
  File "/usr/lib64/python3.11/site-packages/matplotlib/backends/qt_compat.py", line 269, in _maybe_allow_interrupt
    old_sigint_handler(*handler_args)
KeyboardInterrupt

如果我使用pause(4)运行,并在完成后立即关闭窗口,脚本将保持大约4”的静止状态,并最终显示终端提示符。
当我的脚本以plt.pause(0)结尾时,我如何返回到终端提示符?
PS我知道正确的解决方案可能不会以plt.pause(0)结束。

1aaf6o9v

1aaf6o9v1#

在考虑了pause(0)的作用之后,即激活输入循环并永远等待,我意识到show()也是这样做的,但它被设计为在绘图窗口关闭时进行适当的内务处理并将控制返回给解释器,无论是通过窗口管理器还是使用“q”快捷方式。
为了获得预期的行为,我在vim中编辑了源文件,并使用了vim命令

:g/pause(0)/s/pause(0)/show()/|wq

相关问题