Matplot - холст не перерисовывается - PullRequest
1 голос
/ 29 апреля 2019

У меня есть графический интерфейс, созданный с помощью Wxpython.В моем основном графическом интерфейсе я показываю и скрываю некоторые панели.Также я вызываю функцию в своем классе Panel «active», это должно перерисовать мат-план с картой Cartopy и некоторыми координатами каждый раз, когда он вызывается с новыми данными из класса Main.

Моя проблема в том, что холст перерисовывается не так, как ожидалось.Я использовал self.ax.clear(), чтобы очистить свой график, и self.fig.canvas.draw_idle(), чтобы перерисовать его.Но после того, как «active» вызывается из main, холст каждый раз показывает одну и ту же карту.

Так как мне правильно перерисовать мою карту?

Параметр "d", который передается в класс панели, работает правильно и изменяется, как и ожидалось.Также все данные из БД отображаются корректно, если я их распечатаю.

Вот мой сокращенный код:

def OnTest(self, d):
    self.panel_one.Hide()
    self.panel_two.Hide()
    self.panel_three.Hide()
    self.panel_four.Hide()

    RedrawTest.PanelOne.active(self.panel_five, d)

    self.panel_five.Show()
    self.Layout()

А вот класс панели:

import wx
import wx.adv
from wx import TextCtrl, EVT_TEXT_ENTER, TE_PROCESS_ENTER

import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from matplotlib.offsetbox import AnnotationBbox,OffsetImage

import cartopy
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

import sqlite3

class PanelOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)    

        mainsizer = wx.BoxSizer(wx.VERTICAL) 

        self.fig=plt.figure(figsize=(100, 20))      
        self.canvas = FigureCanvas(self, 1, self.fig) 

        mainsizer = wx.BoxSizer(wx.VERTICAL)           
        mainsizer.Add(self.canvas, 1)         

        self.SetSizer(mainsizer)
        self.Layout()  

        self.Show()

    def active(self, d):        
        conn = sqlite3.connect("Database.db")
        c = conn.cursor()
        c.execute('SELECT Coordinates from Test WHERE TestID = ?', (d,))        
        coordinates = c.fetchone()[0]

        item_coord = coordinates.split(',')

        location_lat, location_lon = float(item_coord[0]),float(item_coord[1])        

        self.ax = plt.axes(projection=ccrs.PlateCarree())
        self.ax.clear()

        self.ax.add_feature(cartopy.feature.LAND, facecolor='#FAFAFA')
        self.ax.add_feature(cartopy.feature.OCEAN, facecolor='#F0F0F0')
        self.ax.add_feature(cartopy.feature.COASTLINE, alpha=.25)
        self.ax.add_feature(cartopy.feature.BORDERS, linestyle='-', alpha=.25)

        self.ax.set_extent([-150, 60, -25, 90])
        self.fig.tight_layout()

        self.ax.set_facecolor('#F0F0F0')

        self.ax.plot([location_lon], [location_lat],
                 color='green', linewidth=2, marker='o',
                 transform=ccrs.Geodetic(),
                 )
        self.ax.text(location_lon + 2, location_lat - 2, str(coordinates),
                 horizontalalignment='left', fontsize=16,
                 transform=ccrs.Geodetic()) 

        plt.gca().outline_patch.set_visible(False)         

        self.fig.canvas.draw_idle()

        plt.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...