You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python绘制RTL-SDR接收信号的实时图且不关闭绘图窗口

解决RTL-SDR信号图连续绘图问题

你的代码核心问题是每次循环调用的show()会阻塞程序,必须关闭窗口才会继续执行下一次循环。要实现同一窗口连续更新绘图,只需调整matplotlib的显示逻辑,以下是修改后的可运行代码:

from pylab import *
from rtlsdr import *

# 开启matplotlib交互式模式,让窗口不阻塞程序
ion()

sdr = RtlSdr()    
sdr.sample_rate = 2.4e6
p = sdr.start_freq = 95e6
sdr.gain = 50    

try:
    while True:
        samples = sdr.read_samples(256*1024)
        # 清除当前画布的旧内容,避免图像叠加
        clf()
        psd(samples.real, NFFT=1024, Fs=sdr.sample_rate/1e6, Fc=p/1e6)
        xlabel('Frequency (MHz)')
        ylabel('Relative power (dB)')
        # 强制刷新绘图窗口
        draw()
        # 短暂暂停,让绘图完成刷新,同时处理UI事件
        pause(0.01)
except KeyboardInterrupt:
    # 捕获Ctrl+C中断,优雅退出循环
    pass

# 关闭交互式模式
ioff()
sdr.close()

关键修改说明:

  • ion():启用matplotlib交互式模式,允许程序在显示窗口的同时继续执行后续代码
  • clf():每次循环清除当前画布,防止新旧图像叠加
  • draw():替代原代码的show(),只刷新窗口而不阻塞程序
  • pause():替代sleep(),因为sleep()不会触发matplotlib的窗口刷新,pause()会同步处理绘图事件
  • 替换通用except为KeyboardInterrupt:避免捕获未知错误,方便调试过程中用Ctrl+C正常终止程序

如果运行时遇到后端不支持交互式的问题,可以在导入pylab前添加以下代码指定兼容的后端:

import matplotlib
matplotlib.use('TkAgg')

内容的提问来源于stack exchange,提问作者ismail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:52:14