【发布时间】:2012-01-21 04:16:48
【问题描述】:
我有一个 GUI,其中有一个在新窗口中打开的属性窗口。在某些情况下,(随机且不可确定地重现)当我打开窗口时,它会给出休闲错误:
grab failed: window not viewable
它不会干扰程序的正常功能,除了打印该消息之外似乎对任何其他东西都没有任何影响。
新建窗口的代码为:
proc _prop_menu_make_top {{elem {}}} {
toplevel .prop_menu
#...initialize some variables...
wm title .prop_menu "Properties for $_prop_attr(name)"
#...create and display the window widgets...
bind .prop_menu <Key-KP_Enter> {_prop_menu_ok_button}
bind .prop_menu <Return> {_prop_menu_ok_button}
bind .prop_menu <Escape> {_prop_menu_cancel_button}
# catch presses on the window's `x` button
wm protocol .prop_menu WM_DELETE_WINDOW {
_prop_menu_cancel_button
}
# make the top window unusable
center_the_toplevel .prop_menu
focus .prop_menu.main_frame.model_name.entry
grab release .
grab set .prop_menu
}
proc center_the_toplevel { window } {
if { [string equal $window [winfo toplevel $window]] } {
set width [winfo reqwidth $window]
set height [winfo reqheight $window]
set x [expr {([winfo vrootwidth $window] - $width) / 2}]
set y [expr {([winfo vrootheight $window] - $height) / 2 }]
wm geometry $window +${x}+${y}
}
return
}
proc _prop_menu_ok_button {} {
#....saving the needed data...
_prop_menu_cancel_button
}
proc _prop_menu_cancel_button {} {
destroy .prop_menu
# make the top window usable again
grab set .
# redraw the canvas
nlv_draw
}
有没有人知道是什么导致了这个问题? 有人对如何使 bug 更容易重现有任何建议吗?
编辑: 运行64位的Tcl 8.4.6版,不知道哪个tk版本。
【问题讨论】:
-
你运行的是哪个版本的 Tcl 和 Tk?
-
也许尝试一些“tkwait可见性”以确保窗口可见? wiki.tcl.tk/10013
-
Tk 版本应该与 Tcl 版本完全匹配到 8.4 系列。
-
这不是 FWIW 的错误;它绝对是故意这样设计的。在使用抓取时,还要小心键盘焦点管理,因为它会完全忽略抓取。