Я работаю над приложением 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()
Не импортируйте 'pyplot', если вы собираетесь внедрить его в свой собственный gui. – tacaswell
Можете ли вы сделать это более управляемым? Включите только код, относящийся к вашей проблеме. С этим большим количеством кода шансы заставить кого-то прочитать все, чтобы разобраться в вашей проблеме, низки. – tacaswell
Спасибо, tcaswell, я изменил код, как вы предложили, и изменил фигуру с pyplot на matplotlib.figure. Все еще имея такую же основную проблему, слушатель не получает кнопку button_press_event. –