我是Fortran程序员,但现在必须维护用Tcl / Tk编写的GUI来驱动Fortran代码(通过套接字与它通信),但我对tcl的知识非常有限。
我的fortran程序向GUI发送有关错误情况的XML,并使用以下代码在对话框中显示:
body Processingwizard::updateProcessingData { a_param_class a_dom } {
# Check on status of task
set status_code [$a_dom selectNodes string(/integration_postrefinement/status/code)]
if {$status_code == "error"} {
.m confirm \
-title "Error" \
-type "1button" \
-text "Integration post-refinement failed, sorry.\n[$a_dom selectNodes string(/integration_postrefinement/status/message)]" \
-button1of1 "Dismiss"
} else {
....
确认定义为:
body Dialog::confirm {} {
centreOnScreen
wm deiconify $itk_component(hull)
raise $itk_component(hull)
grabber set $itk_component(hull)
#bind $itk_component(hull) <ButtonRelease-1> [list raise $itk_component(hull)]
tkwait variable [scope responses($this)]
#bind $itk_component(hull) <ButtonRelease-1> { }
grabber release $itk_component(hull)
wm withdraw $itk_component(hull)
return $responses($this)
}
我遇到的问题是,由于发送到GUI的其他XML,它打开另一个带有不同警告消息的对话框并打开第二个对话框关闭第一个对话框,因此用户无法获得看到第一个警告。使用下面的代码打开第二个对话框。
有没有办法我可以阻止第一个对话框关闭,除非用户实际按下了&#34; Dismiss&#34;按钮?我以为&#34; tkwait&#34;在方法&#34;确认&#34;可能会这样做,但事实并非如此。
# Warn the user
.m configure \
-type "3button" \
-title "Doubtful refinement" \
-text "The following parameters have refined to physically questionable values:\n\n$messages\" \
-button1of3 "Reset" \
-button2of3 "Always" \
-button3of3 "Once" \
-buttontext "Ignore (in this Session only) "
set choice [.m confirm]
if {$choice == 2} {
resetDetectorCrystalParams
} elseif {$choice == 1} {
set alwaysignore 0
} else {
set alwaysignore 1
}
答案 0 :(得分:0)
正如glenn jackman所说,问题是我使用相同的窗口名称(.m)来表示两个不同的错误消息。我只是更改了第二条错误消息的窗口名称(到.n)并声明了这个(消息.n)并更改了行:
设置选项[.m确认]
为:
设置选项[.n确认]
在第二条错误消息的代码中,问题解决了。