单击鼠标时,我想在窗口matplotlib
内的图形上显示上下文菜单。wxPython
不幸的是,在它检测到点击后,该PopupMenu
方法被调用,但它既不返回也不显示弹出窗口。(这是在带有 Windows 7 主机的 VirtualBox 内的 Ubuntu 12.10 中使用的股票 Python。)
到目前为止,这是我的代码;我错过了什么?即我如何让PopupMenu
实际显示?
import wx
import numpy
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
from wxPython.wx import *
class MatplotlibContext(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'some title')
self.panel = wx.Panel(self)
self.fig = Figure()
self.canvas = FigCanvas(self.panel, -1, self.fig)
self.axes = self.fig.add_subplot(111)
x = numpy.linspace(0, 6.28)
y = numpy.sin(x)
self.axes.plot(x, y)
self.canvas.draw()
self.canvas.mpl_connect('button_press_event', self.context_menu)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
self.panel.SetSizer(self.vbox)
self.vbox.Fit(self)
def context_menu(self, event):
print 'in context_menu callback: clicked at (%g, %g)' % (event.x, event.y)
menu = wxMenu()
item_id = wxNewId()
menu.Append(item_id, 'item')
wx.EVT_MENU(menu, item_id, self.callback)
self.PopupMenu(menu, wx.Point(event.x, event.y))
menu.Destroy()
def callback(self, event):
print 'menu selection: %r' % event.GetId()
app = wx.PySimpleApp()
app.frame = MatplotlibContext()
app.frame.Show()
app.MainLoop()
编辑 2013-01-31:更正了代码中的错字。修改后的问题:
上面的代码不适用于我在 VirtualBox 中运行 Ubuntu 12.10 或直接安装的 12.04 的两台不同的机器上,但主要适用于运行 12.10 的第四台机器。我不知道为什么会有差异。
否则,我想我现在的问题是:
- 如何解决上/下坐标问题?(如果我单击距窗口顶部一定距离,它会显示距底部的距离。)
- 如果我打开一个 PopupMenu(并可选择关闭它),那么当主窗口关闭时进程不会终止。我该如何解决?
编辑 2013-10-02:版本信息
对于其中一台不起作用的机器,我正在运行带有 Python 2.7.4、Matplotlib 1.2.1 和 wx 2.8.12.1 的 Ubuntu 13.04。