Вы можете обойти обновление таймера, установив, какое окно имеет фокус (используя 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()
Это сработало довольно хорошо. Благодаря! Вместо «if not f == self.text» я использовал «if not f in [self.text, self.button_goto]», чтобы таймер не перезаписывал текстовое поле, когда пользователь нажал кнопку " goto ". Я также добавил вызов self.SetFocus() в моем методе onGoto, чтобы удалить фокус с кнопки после нажатия. – JcMaco
Добро пожаловать, и я рад, что это сработало для вас. – tom10
Следующий вопрос: если я включаю слайдер в графический интерфейс и делаю его так, чтобы при его перетаскивании его текущее значение отображалось в текстовом поле (таймер приостанавливается). как только слайдер отпущен, таймер может теперь возобновить запись текста в текстовое поле. Какие события я могу использовать для достижения этого? Мой слайдер привязан к EVT_SLIDER, и, похоже, нет способа проверить состояние мыши с этим событием. – JcMaco