在变量也更改的同时更改Ruby TK菜单项的状态?

时间:2018-12-06 01:08:22

标签: ruby windows-10 tcl tk tcltk

假设我有这个菜单:

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中有更好的循环方法?似乎是个错误...

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

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法,以避免菜单上的那些闪烁。

我使用For Each循环不执行任何操作来“暂停”线程,然后当它们的条件变为true时,它们将结束,因此Dim i As Long With Inputs For i = 0 To .Length - 1 .Item(i).Value = ThisWorkbook.Sheets("Prices").Cells(i + 1, "A") Next End With 代码将仅执行一次,从而更改菜单项的状态。所有这些都在一个循环中关闭。

这是更新的代码:

while

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