Изменить состояние входа в меню Ruby TK, когда переменная тоже меняется?
Давайте предположим, что у меня есть это меню:
menubar = TkMenu.new(win)
win['menu'] = menubar
edit = TkMenu.new(menubar)
menubar.add :cascade, :menu => edit, :label => 'Edit'
edit.add(:command, :label => 'Delete')
И я хочу изменить состояние записи "редактировать", когда переменная тоже меняется.
Я попробовал это,
def update_menu(edit)
Thread.new {
loop {
if $variable == nil
edit.entryconfigure 'Delete', :state => "disabled"
else
edit.entryconfigure 'Delete', :state => "normal"
end
sleep 0.1
}
}
end
И это на самом деле работает, но меню тк будет мигать для каждого тика цикла.
Я что-то напутал или есть лучший способ для петель в ТЗ? Это похоже на ошибку...
Я на Windows 10, и это моя версия ruby:ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]
1 ответ
Я нашел обходной путь, чтобы избежать этих вспышек в меню.
я использовал while
циклы не делают ничего, чтобы "приостановить" поток, затем, когда их условие станет истинным, они завершатся, поэтому edit.entryconfigure
код будет выполняться только один раз, изменяя состояние входа в меню. Все это замкнуто в петле.
Это обновленный код:
def update_menu(edit)
Thread.new {
loop {
while $variable == nil; sleep 0.1; end
edit.entryconfigure 'Delete', :state => "normal"
while $variable != nil; sleep 0.1; end
edit.entryconfigure 'Delete', :state => "disabled"
sleep 0.1
}
}
end
Теперь меню выглядит хорошо и никаких вспышек там нет.