我正在尝试取消绑定事件wx。EVT_LEFT_DOWN从TextCtrl窗口或
- 用户第一次单击文本字段内部时,或者
- 其中在文本字段中输入第一个字符
当我在事件绑定到的方法内尝试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)
希望能有所帮助。