我是否必须致电' event'在wxpython中的事件处理函数?

时间:2014-05-02 19:55:25

标签: python event-handling wxpython

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

情况如下:

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'是无用的,我不想再这样做,但是我无法这样做。是否有推荐使用'事件'我不申请?甚至可以不叫'事件'吗?我还没找到办法。

谢谢!

3 个答案:

答案 0 :(得分:1)

在这种情况下,不使用event,但在其他情况下,event可用于了解函数onclose的调用方式;什么事件导致函数执行。如果您的活动是由鼠标点击引起的,那么您可以使onClose的行为与按钮点击的方式不同,使用相同的功能。

event是必需的,因为来自wx的任何绑定都会向被调用函数发送event对象,因此当您无法使用def onclose(self)接受event时对象。

答案 1 :(得分:0)

Bind方法出于实际原因发送事件,因此您可以应用其他方法,例如event。getposition()或event。getkey(),并在调用的方法中对其进行比较。

你可以把它叫做任何你喜欢的东西,命名它只是传统的事件。

答案 2 :(得分: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惯用法。当然,您还要从违反wxPython编码标准的方法中删除事件。但它确实有效!