2014-09-17 7 views
2

Я пытаюсь запустить строку кода, когда пользователь нажимает на textCtrl. Конечной целью является выделение содержимого окна при нажатии. Я знаю, что это возможно с помощью wx.EVT_SET_FOCUS, но это либо неправильно, либо я неправильно реализую это. Вот мой код:Как написать событие фокуса wxPython textCtrl

self.m_textCtrl1 = wx.TextCtrl(self.m_panel2, wx.ID_ANY, wx.EmptyString, 
           wx.DefaultPosition, wx.Size(100,-1), wx.TE_LEFT) 
self.m_textCtrl1.SetMaxLength(8) 
self.m_textCtrl1.SetMinSize(wx.Size(100,-1)) 
self.m_textCtrl1.SetMaxSize(wx.Size(100,-1)) 
self.m_textCtrl1.Bind(wx.EVT_SET_FOCUS, self.highlightText, self.m_textCtrl1) 

Этот код может успешно стрелять HighlightText, когда я хочу его, но по какой-то причине, курсор удаляется из textCtrl, оставляя пользователь не в состоянии выбрать его пятно, выделение или забой , Мы ценим любые предложения. Как примечание, есть ли способ сделать это в wxFormBuilder? Я построил свое приложение, используя его, но не смог добавить фокусное событие. Кажется, единственные фокусные события, которые он предлагает, для всего окна.

EDIT 9/19/14: Майк, вот мой автоматически wxFormBuilder код в gui.py:

class OrderNumEntry (wx.Frame): 
    def __init__(self, parent): 
     # there's a lot more stuff here, but it's irrelevant 
     self.m_textCtrl1.Bind(wx.EVT_SET_FOCUS, self.highlightText) 

    def __del__(self): 
     pass 

    # Virtual event handlers, overide them in your derived class 
    def highlightText(self, event): 
     event.Skip() 

... и вот обработчик события, который я написал

import wx, gui 

class OrderFrame(gui.OrderNumEntry): 
    def __init__(self, parent): 
     gui.OrderNumEntry.__init__(self, parent) 
     # again, a lot more irrelevant stuff here 

    def highlightText(self, event): 
     print 'test' 

событие отлично работает (как в тесте, которое напечатано, когда я его хочу), но я не могу выделить текст, и я не вижу своего курсора.

+0

Ваш последний пример не имеет 'событие. Skip() 'в обработчиках событий, поэтому вы не можете выделить текст и т. Д. –

+0

Вы правы, сэр. Я предположил, что это было в виртуальном обработчике, что было достаточно хорошо, но теперь, когда я думаю об этом, который все равно переопределяется. Рекомендуется ли это для всех обработчиков событий? Все мои другие события отлично справились с этим. – TboneH

+0

Вам нужно только событие event.Skip(), если событие должно распространяться на цепочку событий. В этом случае вы хотите, чтобы событие продолжалось, чтобы вы могли нормально использовать виджет. В большинстве случаев вам не нужно вызывать Skip(), потому что обработчик событий, который вы определили, делает все, что вы хотите. –

ответ

1

Вы не показываете обработчик событий, но я предполагаю, что вам нужно позвонить event.Skip() в конце его. Я хочу также отметить, что вы неправильно привязываете событие. Оно должно быть:

self.m_textCtrl1.Bind(wx.EVT_SET_FOCUS, self.highlightText) 

или

self.Bind(wx.EVT_SET_FOCUS, self.highlightText, self.m_textCtrl1) 

Смотреть вики WxPython для полного объяснения:

+0

У меня есть событие.Skip(), так что это не может быть проблемой. Обработчики виртуальных событий автоматически генерируются wxFormBuilder, поэтому все, что мне нужно сделать, это написать подпрограмму с тем же именем. Тем не менее, я опробовал оба ваших примера, и у меня все еще возникают проблемы. Ваш первый пример делает то же самое, что и я. Он работает правильно, но я не могу выделить текст, и я не вижу курсора. Интересно, что он также запускает код в событии фокуса окна. Второй пример, похоже, ничего не делает. – TboneH

+0

Первый пример работает для меня. Когда вы нажимаете на нее, текст выделяется, а затем курсор появляется там, где вы нажимали, поэтому он не остается очень длинным. Это происходит только в том случае, если у меня есть 'event.Skip()' в конце. В противном случае он выбирает все, но я не могу редактировать текст. –

+0

Только что отредактировал мой вопрос для ясности – TboneH

Смежные вопросы