0

假设我有这个菜单:

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 

它确实有效,但 tk 菜单会在循环的每个滴答声中闪烁​​。
我搞砸了,或者 TK 中的循环有更好的方法吗?好像是个bug...

我在 Windows 10 上,这是我的 ruby​​ 版本:
ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]

4

1 回答 1

0

我找到了一种解决方法来避免菜单上出现这些闪烁。

我使用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

现在菜单看起来不错,那里没有闪烁。

于 2018-12-06T16:54:21.610 回答