простое приложение с использованием wxPython и matplotlib зависает - PullRequest
4 голосов
/ 27 июля 2011

Я пытаюсь заставить matplotlib взаимодействовать с wxPython, и мое приложение, перечисленное ниже, ведет себя неловко: под Ubuntu оно работает как положено, но под Windows XP кажется, что зависает, т.е. кнопка не реагирует на нажатие, а элементы перекрываются(как будто GridSizer не работает).Что я делаю неправильно?

Обновление: после изменения GridSizer на BoxSizer все работает в обеих операционных системах, но проблема с GridSizer все еще не решена.

# wxPython module
import wx
# Matplotlib Figure object
from matplotlib.figure import Figure
# Numpy functions for image creation
import numpy as np

# import the WxAgg FigureCanvas object, that binds Figure to
# WxAgg backend. In this case, this is a wxPanel
from matplotlib.backends.backend_wxagg import \
FigureCanvasWxAgg as FigureCanvas

class MyFigurePanel(wx.Panel):
  """Class to represent a Matplotlib Figure as a wxFrame"""
  def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    # usual Matplotlib functions
    self.figure = Figure()#figsize=(6, 4), dpi=100)
    self.axes = self.figure.add_subplot(111)
    x = np.arange(0, 6, .01)
    y = np.sin(x**2)*np.exp(-x)
    self.axes.plot(x, y)
    # initialize the FigureCanvas, mapping the figure to
    # the Wx backend
    self.canvas = FigureCanvas(self, wx.ID_ANY, self.figure)

class MyButtonPanel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    save_button = wx.Button(self, label = 'SAVE se')



class MyFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self,None)
    panelx = wx.Panel(self)
    self.figure = MyFigurePanel(panelx)
    self.buttons = MyButtonPanel(panelx)
    grid = wx.GridSizer(1,2)
    grid.Add(self.figure)
    grid.Add(self.buttons)
    panelx.SetSizer(grid)


# Create a wrapper wxWidgets application     
app = wx.PySimpleApp()
# instantiate the Matplotlib wxFrame
frame = MyFrame()
# show it
frame.Show(True)
# start wxWidgets mainloop
app.MainLoop()

1 Ответ

3 голосов
/ 27 июля 2011

Это работает (после изменения MyFrame):

from matplotlib.backends.backend_wxagg import \
FigureCanvasWxAgg as FigureCanvas

class MyFigurePanel(wx.Panel):
  """Class to represent a Matplotlib Figure as a wxFrame"""
  def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    self.figure = Figure()#figsize=(6, 4), dpi=100)
    self.axes = self.figure.add_subplot(111)
    x = np.arange(0, 6, .01)
    y = np.sin(x**2)*np.exp(-x)
    self.axes.plot(x, y)
    self.canvas = FigureCanvas(self, wx.ID_ANY, self.figure) 

class MyButtonPanel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    button = wx.Button(self, label = 'SAVE se')

class MyFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None)
    self.figure = MyFigurePanel(self)
    self.buttons = MyButtonPanel(self)
    grid = wx.BoxSizer(wx.VERTICAL)
    grid.Add(self.buttons, flag=wx.EXPAND)
    grid.Add(self.figure, flag=wx.EXPAND)
    self.SetSizer(grid)
    self.Fit()


# Create a wrapper wxWidgets application     
app = wx.PySimpleApp()
# instantiate the Matplotlib wxFrame
frame = MyFrame()
# show it
frame.Show(True)
# start wxWidgets mainloop
app.MainLoop()

Изменение ключа для запуска - исключение панели в MyFrame.На самом деле вы уже добавляете две панели.Также я использую wx.BoxSizer() для лучшего вида (GridSizer производит ячейки одинакового размера)

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