在wxpython中,事件处理函数必须调用'event'吗?
我不太确定我的问题是否清楚,所以我想再解释一下。
这是我的情况:
class Frame(wx.Frame):
def __init__(self, title):
[...]
self.Bind(wx.EVT_CLOSE, self.onclose)
def onclose(self, event):
"""
Close the program
"""
self.Destroy()
在这段代码中,'event' 是没用的,我想不调用它,但我还没找到办法。有没有什么推荐的用法是我没有应用的?其实可以不调用 'event' 吗?我还没找到方法。
谢谢!
3 个回答
0
wxPython的事件API需要将事件发送给事件处理器。所以当你使用Bind的时候,你实际上是在向事件处理器发送某种类型的事件。
这里有一些链接,可能会帮助你更好地理解wxPython:
如果你不想按照工具包的API来做,你可以用Python做一些特别的事情,比如这样:
import wx
########################################################################
class Example(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="test")
panel = wx.Panel(self)
btn = wx.Button(panel, label="Close")
btn.Bind(wx.EVT_BUTTON, self.onClose)
#----------------------------------------------------------------------
def onClose(*args):
""""""
args[0].Destroy()
#----------------------------------------------------------------------
if __name__ == "__main__":
app = wx.App(False)
frame = Example()
frame.Show()
app.MainLoop()
不过这样做并不推荐,因为你在onClose事件处理器中去掉了对self的引用,这样就不符合标准的Python写法。而且,你也把event从方法中去掉了,这违反了wxPython的编码标准。不过,这样确实能工作!
0
Bind
方法是为了方便而发送一个事件,这样你就可以使用其他方法,比如 event.getposition()
或 event.getkey()
,并在被调用的方法中进行比较。
顺便说一下,你可以随便给它起个名字,叫它 event 只是个习惯而已。
1
在这个例子中,event
没有被使用,但在其他情况下,event
可以用来了解函数 onclose
是怎么被调用的;也就是说,是什么事件导致这个函数执行。如果你的事件是因为鼠标点击引起的,你可以让 onClose
在按钮点击时表现得不同,但仍然使用同一个函数。
event
是必须的,因为任何来自 wx
的绑定都会把一个 event
对象发送给被调用的函数,所以当你不能使用 def onclose(self)
时,就需要接受这个 event
对象。