在wxpython中,事件处理函数必须调用'event'吗?

0 投票
3 回答
1167 浏览
提问于 2025-04-18 05:10

我不太确定我的问题是否清楚,所以我想再解释一下。

这是我的情况:

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 对象。

撰写回答