假设我有这个菜单:
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]
答案 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
现在菜单看起来不错,那里没有闪烁。