在python中使用实现wxpython弹出菜单PopupMenu效果
专题:wxpython中文教程
以上代码是由Chris Barker在wxPython用户组邮件清单上提交的。
弹出菜单籍由一个独立的类实现. 采用这种方法,不必去手动检查事件是否已经绑定好了。
例子:
#!/usr/bin/python
#coding=utf-8
#popup.py
import wx
app = wx.PySimpleApp()
class MyPopupMenu(wx.Menu):
def __init__(self, WinName):
wx.Menu.__init__(self)
self.WinName = WinName
item = wx.MenuItem(self, wx.NewId(), "菜单项1")
self.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnItem1, item)
item = wx.MenuItem(self, wx.NewId(), "菜单项2")
self.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnItem2, item)
item = wx.MenuItem(self, wx.NewId(), "菜单项3")
self.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnItem3, item)
def OnItem1(self, event):
print "%s 窗口中的菜单项 1 被选中了" % self.WinName
def OnItem2(self, event):
print "%s 窗口中的菜单项 2 被选中了" % self.WinName
def OnItem3(self, event):
print "%s 窗口中的菜单项 3 被选中了" % self.WinName
class MyWindow(wx.Window):
def __init__(self, parent, colour):
wx.Window.__init__(self, parent, -1)
self.colour = colour
self.SetBackgroundColour(colour)
self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
def OnRightDown(self, event):
self.PopupMenu(MyPopupMenu(self.colour), event.GetPosition())
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(300, 200))
sizer = wx.GridSizer(2, 2, 5, 5)
sizer.Add(MyWindow(self, "blue"), 1, wx.GROW)
sizer.Add(MyWindow(self, "yellow"), 1, wx.GROW)
sizer.Add(MyWindow(self, "red"), 1, wx.GROW)
sizer.Add(MyWindow(self, "green"), 1, wx.GROW)
self.CreateStatusBar()
self.SetSizer(sizer)
self.Show()
frame=MyFrame(None, -1, "测试")
app.SetTopWindow(frame)
app.MainLoop()
这个例子只是单个的框架.
它被分为四个窗口. 如你在框架上点击右键,上下文菜单将会弹出. 该菜单有3个命令.
在选择它们中任何一个后,就会有一条消息发送到控制台.
它将告诉你选择了那个项目以及点击鼠标所在窗口的颜色.
此例说明了面向对象编程所具有的威力. 试想一下如果你是通过计算鼠标指针位置的方式来实现,会有多麻烦!
注意,这里的弹出菜单是作为一个新类来实现的.
向下面这样使用弹出菜单则更为优雅.
代码:
这段代码有一些微妙的地方需要说明一下.
这里对事件只绑定了一次. 绑定是在后面的事件表中.
如果你是在类构建器中完成的绑定,那没有问题.
但如果是在一个方法中绑定事件到处理器,那么在该方法每次调用时,都会做一次事件绑定.
这就是为什么要写一个条件判断,来确保不会因此而造成开销太大.
代码: