wxPython Unbind方法返回True但不解除绑定

时间:2014-09-07 17:10:03

标签: event-handling wxpython

我正在尝试从TextCtrl窗口取消绑定事件wx.EVT_LEFT_DOWN

  1. 用户第一次点击文字字段或
  2. 在文本字段中输入第一个字符。
  3. 当我在绑定事件的方法中尝试解除绑定时,我在(1.)的初始尝试失败(请参阅下面的注释代码)。 TextCtrl字段不再允许任何文本输入。

    (2.)的尝试如下所示,但即使我已经测试了Unbind的返回值并且它是True,也不会产生所需的行为。

    所需的行为是,用户第一次在窗口中单击(TextCtrl)时,应清除默认文本,但是,一旦用户输入文本并再次在窗口中单击,输入的文本应被清除。如何使用 Unbind方法实现所需的行为?

    我可以想到其他方式(例如,计算用户在窗口内点击的次数,如果是第一次,只清除文本),但这些方法不太干净。

    import wx
    
    class FormTab(wx.Panel):
    
      def __init__(self, *args, **kwargs):
        super(FormTab, self).__init__(*args, **kwargs)
        self.createControls()
        self.bindEvents()
        self.doLayout()
    
      def createControls(self):
        self.exeTextCtrl = wx.TextCtrl(self, value="Executable")
        font=wx.Font(8,wx.DEFAULT,wx.ITALIC,wx.NORMAL)
        self.exeTextCtrl.SetFont(font)
    
      def bindEvents(self):
        for control, event, handler in \
          [(self.exeTextCtrl, wx.EVT_LEFT_DOWN, self.onExeReady),
           (self.exeTextCtrl, wx.EVT_TEXT, self.onExeEntered)]:
          control.Bind(event, handler)
    
      def onExeReady(self, event):
        self.exeTextCtrl.SetValue('')
        font=wx.Font(8,wx.DEFAULT,wx.NORMAL,wx.NORMAL)
        self.exeTextCtrl.SetFont(font)
    # (1) attempt failed and made text field inoperable
    #   self.exeTextCtrl.Unbind(wx.EVT_LEFT_DOWN, self.onExeReady)
        event.Skip()
    
      def onExeEntered(self, event):
        font=wx.Font(8,wx.DEFAULT,wx.NORMAL,wx.NORMAL)
        self.exeTextCtrl.SetFont(font)
        exclass.exe=event.GetString()
    # (2) attempt doesn't unbind event (even though following returns True)
        self.exeTextCtrl.Unbind(wx.EVT_LEFT_DOWN, self.onExeReady)
    
    # etc...
    

    谢谢。

1 个答案:

答案 0 :(得分:1)

来自wx._core

class EvtHandler(Object):
    """Proxy of C++ EvtHandler class"""

    ...

    def Unbind(self, event, source=None, id=wx.ID_ANY, id2=wx.ID_ANY, handler=None):
        """
        Disconnects the event handler binding for event from self.
        Returns True if successful.
        """

在您的示例中,更改:

self.exeTextCtrl.Unbind(wx.EVT_LEFT_DOWN, self.onExeReady)

导致AttributeError: 'function' object has no attribute 'GetId'(因为您指定了处理程序self.onExeReady而不是源参数),导致:

self.exeTextCtrl.Unbind(wx.EVT_LEFT_DOWN)

不可否认,以下任何一项都没有奏效(不起作用并返回False):

self.Unbind(wx.EVT_LEFT_DOWN, source=self.exeTextCtrl)
self.exeTextCtrl.Unbind(wx.EVT_LEFT_DOWN, self.exeTextCtrl)
self.exeTextCtrl.Unbind(wx.EVT_LEFT_DOWN, source=self.exeTextCtrl, handler=self.onExeReady)

希望有所帮助。