使用spectral库可视化超立方体数据时空白窗口问题求助
解决Spectral库可视化超立方体时的空白窗口与wx.App初始化问题
问题背景
使用Spectral库可视化ENVI格式超立方体数据时,按官网指引通过ipython --pylab=wx启动环境,加载数据后调用view_cube(data,bands=[29, 19, 9])出现以下警告,且弹出空白窗口:
There is no current wx.App object - creating one now. warnings.warn('\nThere is no current wx.App object - creating one now.', Out[17]: <spectral.graphics.graphics.WindowProxy at 0x7f9dd694ef10>
手动添加wx.App()初始化代码后,PyCharm弹出的窗口无内容且被强制关闭。
可能原因
- IPython的
--pylab=wx模式会自动初始化部分绘图后端,与手动创建的wx.App实例冲突,导致GUI渲染异常 - Spectral的
view_cube内部会尝试创建wx.App,但如果环境中已有未正确配置的App实例,会引发窗口渲染失败 - PyCharm的默认运行环境对wxPython的GUI事件循环支持存在兼容性问题
解决方案
方案1:调整IPython启动方式与代码初始化顺序
- 启动IPython时使用
ipython --gui=wx替代--pylab=wx,避免pylab后端的干扰 - 按以下顺序编写代码,确保wx.App初始化与事件循环正确执行:
import wx import spectral from spectral import envi, view_cube import os # 初始化wx.App,关闭stderr重定向避免冲突 app = wx.App(redirect=False) # 配置Spectral的WX OpenGL设置 spectral.settings.WX_GL_DEPTH_SIZE = 16 # 加载超立方体数据 hsi_root = "mypath_to_hsi/" hsi_list = os.listdir(hsi_root) idx = 3 filename = "cube_envi32" data_path = os.path.join(hsi_root, hsi_list[idx], filename) data = envi.open(data_path + '.hdr', data_path + '.dat') # 调用可视化函数后启动wx事件循环 view_cube(data, bands=[29, 19, 9]) app.MainLoop()
方案2:改用Matplotlib后端(无需3D交互时)
如果不需要3D交互功能,使用Spectral的imshow结合Matplotlib展示伪彩色图,绕开wxPython的问题:
import spectral from spectral import envi import matplotlib.pyplot as plt # 加载超立方体数据 hsi_root = "mypath_to_hsi/" hsi_list = os.listdir(hsi_root) idx = 3 filename = "cube_envi32" data_path = os.path.join(hsi_root, hsi_list[idx], filename) data = envi.open(data_path + '.hdr', data_path + '.dat') # 绘制伪彩色合成图 spectral.imshow(data, bands=[29, 19, 9]) plt.show()
方案3:修复PyCharm环境的wx支持
- 在PyCharm的运行配置中,进入「Execution」选项卡,勾选「Run in terminal」
- 重新安装适配当前Python版本的wxPython:
pip uninstall wxpython pip install wxpython
- 避免在PyCharm的Python Console中运行GUI代码,改用普通的「Run」配置执行脚本
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

