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