wxPython:MenuBar绑定事件在Init上执行

时间:2012-03-06 17:57:54

标签: python wxpython wxwidgets

Hello StackOverflow Hive Mind;

我正在学习如何使用wxPython它为我正在编写的应用程序制作GUI。我一直在努力,直到我注意到我无法正确制作菜单栏。无论我做错了什么导致我的事件绑定在程序运行时执行。这是有问题的代码。应该忽略轻微的拼写错误,我正在离开我离线的开发机器,所以我可能会错过这里或那里的钥匙。

def onDocClick():
   message = wx.MessageBox("did it work?","Question",wx.YES_NO)

def onAboutClick():
   pass

frame = wx.Frame(parent=None,title="RVR GUI",size=(315,490))
frame.Show()
panel = wx.Panel(frame,-1,size=(315,490)

menubar = wx.MenuBar()
fileMenu = wx.Menu()
documentation = fileMenu.Append(wx.ID_NEW,"Documentation")
about = fileMenu.Append(wx.ID_ABOUT,"About")
menuBar.Append(fileMenu,'File')

frame.SetMenuBar(menubar)
menubar.Bind(wx.EVT_MENU,onDocClick(),documentation)
menubar.Bind(wx.EVT_MENU,onAboutClick(),about)

GUI有很多,但其余的代码工作正常,所以我认为你不需要它。基本上发生的事情是,只要我运行打开GUI的脚本,就会执行onDocClick()中的消息框。一个我点击amy按钮,GUI的其余部分初始化正常,点击“文档”菜单条目绝对看不到任何事情。我有一种感觉我可能会遗漏一些简单的东西,也许wx.EVT_MENU在这种情况下不适合使用?如果是这样的话,那么正确使用的是什么?我在wxPython上看到的每一个教程都是这样做的,没有解释。老实说,我对wxPython缺乏有意义的文档感到震惊。 Zetcode教程甚至是有用的Mouse vs Python似乎都在关注工具包如何工作的基础知识。但是我离题了,而且我一直在做,我只是被这个完全糊涂了。无论如何,谢谢,我感谢任何回应!

迈克尔

2 个答案:

答案 0 :(得分:1)

您应该非常仔细地查看代码。我认为你在使用wxPython方面做得很好,但事件绑定没有正确完成。您应该将方法名称作为Bind方法的参数传递。相反,您进行方法调用(这会导致在UI构造期间执行绑定方法)。要修复它,你必须省略括号。您商家信息的最后两行应该成为:

<击>

<击>
menubar.Bind(wx.EVT_MENU, onDocClick, documentation)
menubar.Bind(wx.EVT_MENU, onAboutClick, about)

<击>

我尝试了你的代码,BrtH是对的,我没有成功使用菜单栏的绑定,你应该绑定来自wx.Frame实例的事件。 您完整的,可运行的示例现在看起来像这样:

import wx

def onDocClick(evt):
   message = wx.MessageBox("did it work?","Question",wx.YES_NO)

def onAboutClick(evt):
   print "clicked"

app = wx.App()
frame = wx.Frame(parent=None,title="RVR GUI",size=(315,490))
frame.Show()
panel = wx.Panel(frame,-1,size=(315,490))

menubar = wx.MenuBar()
fileMenu = wx.Menu()
documentation = fileMenu.Append(wx.ID_NEW,"Documentation")
about = fileMenu.Append(wx.ID_ABOUT,"About")
menubar.Append(fileMenu,'File')

frame.SetMenuBar(menubar)
frame.Bind(wx.EVT_MENU,onDocClick,documentation)
frame.Bind(wx.EVT_MENU,onAboutClick,about)
app.MainLoop()

答案 1 :(得分:-1)

你绑定了错误的东西。而是绑定到框架。试试frame.Bind(wx.EVT_MENU,onDocClick(),documentation)

相关问题