我正在尝试从TextCtrl窗口取消绑定事件wx.EVT_LEFT_DOWN
当我在绑定事件的方法中尝试解除绑定时,我在(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...
谢谢。
答案 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)
希望有所帮助。