加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在while循环中生成绘图后在KeyboardInterrupt上退出

发布时间:2020-12-20 13:32:28 所属栏目:Python 来源:网络整理
导读:我正在使用matplotlib实时监控实验,以在while循环中生成绘图.理想情况下,循环应该退出像KeyboardInterrupt这样的东西.这在Ubuntu测试中运行良好.在 Windows 7中,使用ipython,它会以“终止批处理作业(是/否)?”退出.然后关闭翻译.我想避免这种行为,并在Keybo
我正在使用matplotlib实时监控实验,以在while循环中生成绘图.理想情况下,循环应该退出像KeyboardInterrupt这样的东西.这在Ubuntu测试中运行良好.在 Windows 7中,使用ipython,它会以“终止批处理作业(是/否)?”退出.然后关闭翻译.我想避免这种行为,并在KeyboardInterrupt之后保持解释器打开.这是一个测试脚本.

[编辑2]:如果ipython作为ipython –pylab加载,此脚本在Windows中可以正常工作.

import time
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
line,= ax.plot([0],[0],'b-o')

window = 50
plot_data = np.zeros((window,2))

i = 0
start = time.time()
while True:
    try:
        data = [time.time() - start,np.random.rand()]
        print ' '.join('{:.2f}'.format(x) for x in data)
        if i < window:
            plot_data[i,:] = data
            line.set_data(plot_data[0:i+1,0],plot_data[0:i+1,1])
        else:
            plot_data[0:window-1] = plot_data[1:window]
            plot_data[window-1] = data
            line.set_data(plot_data[:,plot_data[:,1])
        ax.relim()
        ax.autoscale_view(True,True,True)
        fig.canvas.draw()
        plt.pause(0.1)
        i += 1
    except KeyboardInterrupt:
            print "Program ended by user.n"
            break 
print 'Success!'

[编辑1]:我应该更清楚为什么我用matplotlib标记这个.以下示例脚本在任一操作系统中都不会出现问题.

i = 0 
start = time.time()
while True:
    try:
        data = [time.time() - start,np.random.rand()]
        print ' '.join('{:.2f}'.format(x) for x in data)
        time.sleep(0.1)
    except KeyboardInterrupt:
        print "Proram ended by user. n"
        break
print 'Success!'

昨天安装了所有软件包,作为Enthought的全新安装的一部分.

解决方法

现在,我发现在多台Windows机器上解决此问题的最佳方法如下……

print 'press 'q' to end run'
time.sleep(1.0)

fig = plt.figure()
ax = fig.add_subplot(111)
line,'b-o')

window = 150
plot_data = np.zeros((window,2))

i = 0
start = time.time()
while True:
    data = [time.time() - start,np.random.rand()]
    print ' '.join('{:.2f}'.format(x) for x in data)
    if i < window:
        plot_data[i,:] = data
        line.set_data(plot_data[0:i+1,1])
    else:
        plot_data[0:window-1] = plot_data[1:window]
        plot_data[window-1] = data
        line.set_data(plot_data[:,1])
    ax.relim()
    ax.autoscale_view(True,True)
    fig.canvas.draw()
    plt.pause(delay)
    i += 1
    if msvcrt.kbhit():
        if ord(msvcrt.getch()) == 113:
            print "Program ended by user.n"
            break 
print 'Success!'

不幸的是,这根本不是平台独立的,但过去几天我读过的所有内容都让我相信平台无关的键盘输入实际上是不可能实现的.我原来问题中的代码在Unix和一些Windows安装中运行良好.此代码适用于我尝试过的少数Windows安装.所有这些在通过ipython –pylab运行时效果最佳.这可能必须足够好了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读