2013-07-27 3 views
0

Я работаю над приложением WX-MPL для отображения и интерактивного обработки данных на основе пользовательского ввода. У меня возникают трудности с настройкой событий мыши MPL для работы в приложении WX.Wx Matplotlib Обработка событий

Цель состоит в том, чтобы иметь ряд редактируемых вертикальных линий, которые определяют начальное и конечное время для функций, которые были идентифицированы в предыдущей обработке. Пользователи должны иметь возможность перетаскивать линии вдоль оси X, удалять ненужные строки и вставлять новые строки.

До сих пор мне удалось достичь этой функциональности, используя стандартную фигуру графика MPL (я думаю, ее Tk). Когда я пытаюсь интегрировать эти классы в свое приложение, что-то сбивается с пути обработки событий, и я не могу взаимодействовать с объектами линии или создавать новые объекты линии. Поэтому я сделал резервную копию шага и пытался добавить сложность в мой рабочий пример, чтобы определить, где проблемы возникают на картинке.

При запуске рабочего примера в качестве простого приложения WX класс NewVLineListener больше не получает button_press_events. Ниже приведен код, связанный с конкретной проблемой, которую я испытываю.

Это первый раз, когда я работал с событиями мыши, и я, несомненно, что-то пропустил ... Любые советы были бы весьма признательны.

Кроме того, я запускаю WX 2.8.12 и MPL 1.1.1rc.

from matplotlib.figure import Figure 
import wx 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg 

class NewVLineListener: 
    global castLog, count, dvls, ax1 
    lock = None # only one can be animated at a time 
    def __init__(self, fig): 
     self.fig = fig 

    def connect(self): 
     'connect to all the events we need' 
     self.cidpressright = self.fig.canvas.mpl_connect(
     'button_press_event', self.on_press_right) 

    def on_press_right(self, event): 
     global count, castLog, dvls, ax1 
     print event.button 
     if event.button != 3: return 
     tag = 'Begin' 
     # Increase castLog Key to accomodate new Vline 
     count += 1 
     print 'count: ', count 
     # Set castLog values to x-value of triggering event 
     castLog[str(count)] = { tag:event.xdata } 
     # Spawn a new DraggableVline instance 
     color_map = {'Begin':'g', 'End':'r'} 
     dvl = DraggableVline(self.fig, ax1.axvline(x=castLog[str(count)][tag], linewidth=2, color=color_map[tag]), count, tag) 
     dvl.connect() 
     dvls.append(dvl) 

     canvas = self.fig.canvas 
     canvas.draw() 

class MainFrame(wx.Frame): 
     def __init__(self): 
      wx.Frame.__init__(self, None, wx.ID_ANY) 
      global castLog, count, ax1, dvls 
      fig = Figure() 
      canvas = FigureCanvasWxAgg(self, -1, fig) 
      ax1 = fig.add_subplot(111) 

      # Create empty dict that will hold new V-line Data 
      castLog = { } 
      dvls = [ ] 
      count = 0 

      # Instantiate New Vline Listener 
      NVL = NewVLineListener(fig) 
      NVL.connect() 

if __name__ == '__main__': 
     app = wx.PySimpleApp() 
     app.frame = MainFrame() 
     app.frame.Show() 
     app.MainLoop() 
+0

Не импортируйте 'pyplot', если вы собираетесь внедрить его в свой собственный gui. – tacaswell

+0

Можете ли вы сделать это более управляемым? Включите только код, относящийся к вашей проблеме. С этим большим количеством кода шансы заставить кого-то прочитать все, чтобы разобраться в вашей проблеме, низки. – tacaswell

+0

Спасибо, tcaswell, я изменил код, как вы предложили, и изменил фигуру с pyplot на matplotlib.figure. Все еще имея такую ​​же основную проблему, слушатель не получает кнопку button_press_event. –

ответ

1

Я понял!

Я думаю, что ссылка на объект NewVlineListener была собрана мусором, поэтому события никогда не принимались. Добавляя ссылку на объект NVL к массиву ссылок на перетаскиваемые объекты vline, он опирается и принимает события, как ожидалось.

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY) 
     global castLog, count, ax1, dvls 
     fig = Figure() 
     canvas = FigureCanvasWxAgg(self, -1, fig) 
     ax1 = fig.add_subplot(111) 

     # Create empty dict that will hold new V-line Data 
     castLog = { } 
     dvls = [ ] 
     count = 0 

     # Instantiate New Vline Listener 
     NVL = NewVLineListener(fig) 
     NVL.connect() 
     dvls.append(NVL) # This keeps NVL reference from being garbage collected? 

Я все еще нахожу это интересным, что называя объект NewVlineListener не достаточно, чтобы сохранить ссылку вокруг, и что он прекрасно работает с pyplot, но теперь с Wx, однако это, кажется, работает.

Смежные вопросы