【问题标题】:Do I have to call 'event' in an event handler function in wxpython?我必须在 wxpython 的事件处理函数中调用“事件”吗?
【发布时间】:2014-05-02 19:55:25
【问题描述】:

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

情况如下:

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' 是无用的,我不想在那时调用它,但我无法这样做。有没有推荐使用我没有申请的“事件”?甚至可以不调用“事件”吗?我还没有找到方法。

谢谢!

【问题讨论】:

  • 现在,当你说“call event”时,你的意思是你必须将它包含在你的处理程序的定义中吗?
  • 我的意思是我不能做例如: def onclose(self): [...]
  • 当您定义onclose(您的处理程序)时,event 必须在参数列表中。那你到底在问什么?
  • 是的,事件在参数列表中。但是,它显然没有在函数中使用,因此使它成为一个看似无用的参数。如果可能的话,我不希望我的函数中有无用的参数。
  • 对,但是作为答案状态,当您Bind 一个事件和一个函数时,该事件会发送到该函数,因此该函数需要期待它(即使您不使用它)

标签: python event-handling wxpython


【解决方案1】:

在这种情况下,event没有被使用,但在其他情况下,event可以用来知道函数onclose是如何被调用的;什么事件导致函数执行。如果您的事件是由鼠标点击引起的,您可以使用相同的函数使 onClose 的行为与按钮点击不同。

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

【讨论】:

  • 好的。不使用时不能“不调用”,这似乎很奇怪。
  • wx 是这样定义它的,所以如果你创建了自己的函数:def add(self,x,y),你将无法将其称为add(1)wx 强制任何被绑定的函数接受 event,就像这个 add 函数强制你提供两个数字一样。
  • 是的,但是如果没有给出'event',wx不能设置默认值吗?
  • 这是个好问题。可能还有其他我不知道的原因,但从我的角度来看,最好让所有功能都需要它,因为wx 将始终提供它,并且用户始终可以访问它以忽略或不,根据他的喜好。
【解决方案2】:

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

顺便说一句,你可以随意称呼它,命名事件只是常规的。

【讨论】:

  • 我明白了,我只是觉得有一个我不会在那个特定函数中使用的参数很烦人。应用那些其他方法很酷,但在这个函数中,我并不在意。
【解决方案3】:

wxPython 事件 API 要求它向事件处理程序发送一个事件。因此,当您执行绑定时,您将向事件处理程序发送某种类型的事件。

这里有一些链接可以帮助你更好地理解 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 编码标准的方法中删除 event。但它确实有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多