Как запускать код при изменении значения виджета Tkinter?

Я использую Python и Tkinter , и мне нужен эквивалент события onchange из других наборов инструментов / языков. Я хочу запускать код всякий раз, когда пользователь обновляет состояние некоторых виджетов.

В моем случае у меня много Entry , Checkbutton , Spinbox и Виджеты Radiobutton . Всякий раз, когда любое из этих изменений изменяется, я хочу запустить свой код (в данном случае обновить текстовое поле на другой панели).

(просто помните, что пользователь может взаимодействовать с этими виджетами с помощью мыши или клавиатуры, этот таймер - это, по сути, сердцебиение приложения управления производством, и очень плохо, если он остановится по какой-либо причине. Я подумал, что было бы неплохо установить отказоустойчивый тайм-аут, чтобы, если «работа» занимает слишком много времени, таймер мог бы снова включиться и повторить попытку. Я думал о чем-то вроде этого:

Переместите работу в подпрограмму и создайте делегата:

Private Delegate Sub WorkDelegate()
Private Sub Work()
   '...work...
End Sub

Вызовите работу, вызвав делегата, а затем используйте WaitOne (тайм-аут) в IAsyncResult, чтобы указать тайм-аут:

Private Sub MasterTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles MasterTimer.Elapsed
    MasterTimer.Enabled = False
    Dim workDel as New WorkDelegate(AddressOf Work)
    Dim result as IAsyncResult = workDel.BeginInvoke
    result.AsyncWaitHandle.WaitOne(CInt(MasterTimer.Interval))
    MasterTimer.Enabled = True
End Sub

Но мой вопрос: вызовет ли это проблему, если Work () действительно где-то застрял? В том, что он повторно вводит подпрограмму, которая уже запущена? Есть ли способ прервать работу Work (), если она не завершилась по истечении тайм-аута? Другими словами, просто прекратите выполнение Work (), если result.IsCompleted Is False после WaitOne?

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

Заранее большое спасибо!

Я хотел бы кое-что добавить:

Хотя я собираюсь сделать некоторые изменения в соответствии с Хансом. предложения, я уже запланировал день тестирования, чтобы попытаться изолировать источник этой ошибки. До сих пор это происходило только при запуске скомпилированного приложения. Я потратил сегодня (и немного вчера), пытаясь воспроизвести зависание при работе в режиме отладки, чтобы, возможно, я мог добавить несколько точек останова и выяснить, что происходит. Пока программа не зависла в режиме отладки. Мне просто интересно, есть ли что-то другое в среде отладки, которое могло бы это объяснить. Может быть, я просто "

1
задан Brian Mulcahy 6 October 2010 в 22:57
поделиться