Выделение содержимого TextCtrl при получении фокуса
Вариант 1.
import wx
class wndSelect(wx.Dialog):
def __init__(self):
"""Constructor"""
wx.Dialog.__init__(self, None, title="Выделение текста",size=(160,130))
self.Centre()
self.aaa=wx.TextCtrl(self, id=1, value='Текст 1', size=(120, 30), pos=(10, 10))
self.Bind(wx.EVT_SET_FOCUS, self.SelectText, self.aaa)
self.bbb=wx.TextCtrl(self, id=2, value='Текст 2', size=(120, 30), pos=(10, 50))
self.Bind(wx.EVT_SET_FOCUS, self.SelectText, self.bbb)
def SelectText(self, event):
idTc=event.GetId()
if idTc==1:
self.aaa.SetFocus()
self.aaa.SetSelection(-1,-1)
print('1')
elif idT==2:
self.bbb.SetFocus()
self.bbb.SetSelection(-1,-1)
print('2')
event.Skip()
if __name__ == "__main__":
app = wx.App(False)
frmSelect = wndSelect()
frmSelect.ShowModal()
Вариант 2
import wx
class wndSelect(wx.Dialog):
def __init__(self):
"""Constructor"""
wx.Dialog.__init__(self, None, title="Выделение текста",size=(160,130))
self.Centre()
self.aaa=wx.TextCtrl(self, id=1, value='Текст 1', size=(120, 30), pos=(10, 10))
self.aaa.Bind(wx.EVT_SET_FOCUS, self.SelectText)
self.bbb=wx.TextCtrl(self, id=2, value='Текст 2', size=(120, 30), pos=(10, 50))
self.bbb.Bind(wx.EVT_SET_FOCUS, self.SelectText)
def SelectText(self, event):
idTc=event.GetId()
event.EventObject.SetFocus()
event.EventObject.SetSelection(-1,-1)
event.Skip()
if __name__ == "__main__":
app = wx.App(False)
frmSelect = wndSelect()
frmSelect.ShowModal()
Непонятно, почему не срабатывает выделение. Когда назначаешь С ПОМОЩЬЮ ДОПОЛНИТЕЛЬНОЙ КНОПКИ фокус элементу и выделение его содержимого, все срабатывает. Но не делать же каждому текстовому полю отдельную кнопку для выделения. Конечно, можно при попадании в элемент очищать его содержимое, но это нарушает "философию программы". В общем, хотелось бы понять суть проблемы.
Ответы (1 шт):
Выделять содержимое нужно после установки фокуса. Для этого нужно вызвать SetSelection после обработки всех событий установки фокуса с помощью wx.CallAfter.
def SelectText(self, event):
wx.CallAfter(event.EventObject.SetSelection, -1, -1)
event.Skip()
В вашем случае не нужно вызывать SetFocus, если вы вызываете event.Skip(). Skip() приводит к вызову следующего в очереди обработчика события. Так как у вас всего одна привязка события к wx.EVT_SET_FOCUS, то event.Skip() приведет к вызову базового обработчика, который установит фокус.
Вместо wx.TextCtrl.SetSelection можно использовать wx.TextCtrl.SelectAll. Тогда получим следующую функцию:
def SelectText(self, event):
wx.CallAfter(event.EventObject.SelectAll)
event.Skip()