2009-06-04 4 views
0

Можно ли проверить, находится ли TextCtrl в фокусе клавиатуры (мигающий курсор в текстовом поле) без определения обработчика для EVT_SET_FOCUS?Запретить таймеру обновлять текстовое поле, если курсор находится в поле

Я просто хочу выполнить быструю булевскую проверку, чтобы предотвратить перезапись текстового поля wx.Timer, если пользователь что-то пишет в поле.

ответ

3

Вы можете обойти обновление таймера, установив, какое окно имеет фокус (используя FindFocus) и сравнивая это с окном TextCtrl. Затем, если ваш TextCtrl имеет фокус, вы можете оставить его в покое. Вот пример:

import wx 

class TestFrame(wx.Frame): 

    def __init__(self): 
     self.count = 0 
     wx.Frame.__init__(self, None, -1, "test frame", size=(200, 100)) 
     self.panel = wx.Panel(self, -1) 
     button = wx.Button(self.panel, -1, "b", pos=(10, 40)) 
     self.text = wx.TextCtrl(self.panel, -1, `self.count`, size=(50, 25)) 
     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.incr_text) 
     self.timer.Start(1000) 

    def incr_text(self, event): 
     self.count += 1 
     f = self.FindFocus() 
     if not f==self.text: 
      self.text.SetValue(`self.count`) 

if __name__=="__main__": 
    app = wx.PySimpleApp() 
    TestFrame().Show() 
    app.MainLoop() 
+0

Это сработало довольно хорошо. Благодаря! Вместо «if not f == self.text» я использовал «if not f in [self.text, self.button_goto]», чтобы таймер не перезаписывал текстовое поле, когда пользователь нажал кнопку " goto ". Я также добавил вызов self.SetFocus() в моем методе onGoto, чтобы удалить фокус с кнопки после нажатия. – JcMaco

+0

Добро пожаловать, и я рад, что это сработало для вас. – tom10

+0

Следующий вопрос: если я включаю слайдер в графический интерфейс и делаю его так, чтобы при его перетаскивании его текущее значение отображалось в текстовом поле (таймер приостанавливается). как только слайдер отпущен, таймер может теперь возобновить запись текста в текстовое поле. Какие события я могу использовать для достижения этого? Мой слайдер привязан к EVT_SLIDER, и, похоже, нет способа проверить состояние мыши с этим событием. – JcMaco

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