Qt环境下Basemap地图清除原有数据重新绘制失败问题求助
问题根因
你每次触发绘图时都会重复创建Figure、FigureCanvas、工具栏和布局,且没有移除mapWindow中已存在的旧控件,多个控件层叠导致旧内容始终可见,看似没有刷新。同时你混用了matplotlib的pyplot状态机接口和Qt嵌入场景下的面向对象接口,也是导致缓存没有清理的原因之一。
修复方案
- 将画布、工具栏、布局的初始化移到
__init__方法中,全局仅初始化一次,避免重复创建控件 - 绘图时仅清空已有画布、重绘内容、刷新画布即可,不需要重新创建控件
- 移除不必要的
plt.close("all")调用,避免干扰Qt内嵌的matplotlib实例
修正后完整代码
from PyQt5 import uic, QtWidgets from PyQt5.QtWidgets import QVBoxLayout from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar import matplotlib.pyplot as plt, numpy as np from mpl_toolkits.basemap import Basemap import sys qtCreatorFile = ('map_debug_form.ui') LandingPageUI, LandingPageBase = uic.loadUiType(qtCreatorFile) class searchApp(LandingPageBase, LandingPageUI): def __init__(self, parent=None): QtWidgets.QMainWindow.__init__(self) LandingPageBase.__init__(self) self.setupUi(self) # 初始化画布、工具栏、布局 仅执行一次 self.map_figure = plt.figure(figsize=(20,20)) self.map_canvas = FigureCanvas(self.map_figure) self.map_toolbar = NavigationToolbar(self.map_canvas, self) layout = QVBoxLayout() layout.addWidget(self.map_toolbar) layout.addWidget(self.map_canvas) layout.setSpacing(0) self.mapWindow.setLayout(layout) def plotMap(latlongs): # 清空现有画布 self.map_figure.clear() lons=[] lats=[] for item in latlongs: if item[0] < 0: tempLon = 360+item[0] else: tempLon = item[0] lons.append(tempLon) lats.append(item[1]) m =Basemap(llcrnrlon=(min(lons)-15),llcrnrlat=(min(lats)-15),urcrnrlon=(max(lons)+15),urcrnrlat=(max(lats)+15),projection='mill',resolution = 'l') x, y = m(lons, lats) m.drawcoastlines(linewidth=.75) m.fillcontinents(color='0.8') m.drawparallels(np.arange(-80,81,5),labels=[1,1,0,0]) m.drawmeridians(np.arange(0,360,10),labels=[0,0,0,1]) m.scatter(x,y,10,marker='o',color='r', zorder=10, alpha=0.7, picker=True) self.map_figure.subplots_adjust(left=0, right=1, top=1, bottom=0.04) self.map_canvas.draw() # 刷新画布 self.btnMap1.clicked.connect(lambda: plotMap([[-167.7742, 54.20214], [-167.7742, 54.20214], [-164.24091, 54.9311], [-163.9388, 54.4394], [-160.59821, 54.86025]])) self.btnMap2.clicked.connect(lambda: plotMap([[-172.7829, 50.55793], [-172.7829, 50.55793], [-172.7829, 50.55793], [-169.78149, 50.6384], [-169.78149, 50.6384]])) if __name__ == "__main__": app=QtWidgets.QApplication.instance() if not app: app = QtWidgets.QApplication(sys.argv) window = searchApp() window.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者jshort
相关产品推荐
相关产品推荐

