wxPython Unbind 方法返回 True,但不取消绑定



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

  1. 用户第一次单击文本字段内部时,或者
  2. 其中在文本字段中输入第一个字符

当我在事件绑定到的方法内尝试Unbind时,我在(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...

谢谢。

来自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)

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新