Я использую 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?
Я не Я действительно очень хорошо разбираюсь в этом материале, поэтому будем благодарны за любые комментарии. Может быть, есть совершенно другой способ подойти к этому, о котором я не знаю?
Заранее большое спасибо!
Я хотел бы кое-что добавить:
Хотя я собираюсь сделать некоторые изменения в соответствии с Хансом. предложения, я уже запланировал день тестирования, чтобы попытаться изолировать источник этой ошибки. До сих пор это происходило только при запуске скомпилированного приложения. Я потратил сегодня (и немного вчера), пытаясь воспроизвести зависание при работе в режиме отладки, чтобы, возможно, я мог добавить несколько точек останова и выяснить, что происходит. Пока программа не зависла в режиме отладки. Мне просто интересно, есть ли что-то другое в среде отладки, которое могло бы это объяснить. Может быть, я просто "