Изменить состояние входа в меню Ruby TK, когда переменная тоже меняется? - PullRequest
0 голосов
/ 06 декабря 2018

Давайте предположим, что у меня есть это меню:

menubar = TkMenu.new(win)
win['menu'] = menubar

edit = TkMenu.new(menubar)

menubar.add :cascade, :menu => edit, :label => 'Edit'

edit.add(:command, :label => 'Delete')

И я хочу изменить состояние ввода "edit", когда переменная тоже меняется.

Я пробовал это,

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 

И это на самом деле работает, но меню tk будет мигать для каждого такта цикла.
Я что-то напутал или есть лучший способ для циклов в TK?Это похоже на ошибку ...

Я на Windows 10, и это моя версия ruby:
ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

1 Ответ

0 голосов
/ 06 декабря 2018

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

Я использовал циклы 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

Теперь меню выглядит хорошо и там не мигает.

...