【发布时间】:2015-03-03 01:59:20
【问题描述】:
我正在尝试将 matplotlib 集成到 wxpython GUI 中,并且我已经成功地显示了交互式导航工具栏。但是,按下任何按钮都不会更改绘图,如果您重新调整窗口大小或按下另一个按钮(即缩放)并应用相关操作(选择一个盒子/区域)。我尝试在网上查找,但大多数答案要么没有回答这个特定问题,要么似乎与我的查询相匹配的问题没有得到解答。下面是一段相关代码:
忽略所有大量的更新/刷新调用,我只是试图让帧/情节刷新,但它没有用。有什么想法吗?
class p1(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1, size=(50,50))
#Set up Figure
self.figure = matplotlib.figure.Figure()
self.canvas = FigureCanvas(self, -1, self.figure)
#Set up Matplotlib Toolbar
self.chart_toolbar = NavigationToolbar2Wx(self.canvas)
tw,th = self.chart_toolbar.GetSizeTuple()
fw,fh = self.canvas.GetSizeTuple()
self.chart_toolbar.SetSize(wx.Size(fw, th))
self.chart_toolbar.Realize()
graphs_sizer = wx.BoxSizer(wx.VERTICAL)
graphs_sizer.Add(self.canvas, 20, flag=wx.EXPAND, border=5)
graphs_sizer.Add(self.chart_toolbar, 1, flag=wx.ALIGN_CENTER, border=5)
self.SetSizer(graphs_sizer)
self.chart_toolbar.update()
self.canvas.Update()
self.canvas.Refresh()
self.Update()
def plot(self):
self.axes = self.figure.add_subplot(111)
self.axes.plot(aggregatePlot,color='blue',alpha=0.6,lod=True)
self.canvas.draw()
self.canvas.Update()
self.canvas.Refresh()
class TestFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(200,200))
#Create Splitter Window and Add Left/Right Panels
self.sp = wx.SplitterWindow(self)
self.p1 = p1(self.sp)
self.p2 = wx.Panel(self.sp, style=wx.SUNKEN_BORDER)
self.sp.SplitVertically(self.p1, self.p2, 100)
#Create Buttons
self.siButton = wx.Button(self.p1, -1, "Si", size=(40,20), pos=(10,10))
self.siButton.Bind(wx.EVT_BUTTON, self.Si)
self.siButton = wx.Button(self.p2, -1, "No", size=(40,20), pos=(10,10))
self.siButton.Bind(wx.EVT_BUTTON, self.No)
#Create Status Bar
self.statusbar = self.CreateStatusBar()
self.statusbar.SetStatusText("Hola")
#Plot
self.p1.plot()
#Event Handlers
def Si(self, event):
self.statusbar.SetStatusText("Si")
def No(self, event):
self.statusbar.SetStatusText("No")
app = wx.App(redirect=False)
frame = TestFrame(None, 'Hello World!')
frame.Show(True)
frame.p1.plot()
frame.p1.canvas.Update()
frame.p1.canvas.Refresh()
app.MainLoop()
下面是一个示例,按下缩放按钮并选择了一个矩形区域进行缩放,但没有任何反应。缩放矩形也有很多小的内部矩形,但实际的图形并没有改变。
【问题讨论】:
-
我不知道您到底期望什么:您正在绘制恰好一次,那么您为什么希望绘图发生变化(缩放/缩放除外)?更好的说法是,您正在绘制两次,但第二次
frame.p1.plot()是空操作,因为aggregatePlot不应该更改。 -
对不起,我可能解释的不正确,我感觉不对的一个例子是我点击了缩放按钮,选择了一个矩形区域来放大绘图。现在根据我对 matplotlib 的了解,绘图应该变成放大的区域。现在实际上什么都没有发生。现在,如果我选择平移并移动一点,或者调整整个绘图的大小,图形会变为我之前放大的位置,然后平移动作发生。这有意义吗?
-
没关系,请看下面的答案,我的matplotlib版本可能有问题,更新修复了它。
标签: python matplotlib wxpython toolbar wxwidgets