Почему я не могу использовать app.MainLoop () с iPython? - PullRequest
2 голосов
/ 07 сентября 2011

Я бы хотел, чтобы прямоугольник появлялся каждый раз, когда пользователь нажимает на строку. Я получил это для процедурной работы, как в этом примере: http://www.daniweb.com/software-development/python/code/216648, но как только я реализовал совместимость с iPython и начал использовать классы, я больше не мог использовать app.MainLoop () без сбоя программы. Как обновить объект wx.Frame из класса? Почему self.figure.canvas.draw () не работает?

Код ниже. Откройте ipython с параметром -pylab. x = [-10,10] и y = x - достойные параметры для этой проблемы.

import wx
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanv
from pylab import *
import IPython.ipapi
ip = IPython.ipapi.get()
import sys

class MainCanvas(wx.Frame):
    """ Set up the canvas and plot on which the rectangle will lie """
    def __init__(self, *args):
        wx.Frame.__init__(self,None,-1, size=(550,350))
        self.x = args[0]
        self.y = args[1]

        self.figure = plt.figure()
        self.axes = self.figure.add_subplot(111)
        self.axes.plot(*args)
        self.line, = self.axes.plot(self.x, self.y, picker = 3,
                visible = False) 
        self.canvas = FigCanv(self, -1, self.figure)

        self.rect = patches.Rectangle((0, 0), 2, 2, visible=True)
        self.axes.add_patch(self.rect)
        self.figure.canvas.mpl_connect('pick_event', self.onPick)

    def onPick(self, event):
        """ Move rectangle to last click on line """     
        self.rect.set_x(event.mouseevent.xdata)
        self.rect.set_y(event.mouseevent.ydata)
        self.rect.set_visible(True)
        print "rect x: ", self.rect.get_x()
        print "rect y: ", self.rect.get_y()          
        self.figure.canvas.draw()

def run_this_plot(self, arg_s=''):
    """ Run in iPython
    Examples
    In [1]: import demo
    In [2]: runplot x y <z> 
    Where x, y, and z are numbers of any type
    """
    args = []
    for arg in arg_s.split():
        try:
            args.append(self.shell.user_ns[arg])
        except KeyError:
            raise ValueError("Invalid argument: %r" % arg)
    mc = MainCanvas(*args)

ip.expose_magic("runplot", run_this_plot)

Спасибо! --Erin

1 Ответ

1 голос
/ 08 сентября 2011

Кажется вероятным, что matplotlib настроен на использование бэкэнда, отличного от wx. Попробуйте либо установить это в файле matplotlibrc, либо это можно установить в программе (но это должно быть установлено до импорта matplotlib). Инструкции здесь .

...