更改 Ruby TK 菜单项状态,同时变量也在更改?
Change Ruby TK menu entry state while a variable is changing too?
假设我有这个菜单:
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]
我找到了避免菜单闪烁的解决方法。
我使用 while
循环对 "pause" 线程不做任何事情,然后当它们的条件变为真时,它们将结束,因此 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
现在菜单看起来不错,那里没有闪烁。
假设我有这个菜单:
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]
我找到了避免菜单闪烁的解决方法。
我使用 while
循环对 "pause" 线程不做任何事情,然后当它们的条件变为真时,它们将结束,因此 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
现在菜单看起来不错,那里没有闪烁。