Как предотвратить закрытие второго диалогового окна, открытого ранее - PullRequest
0 голосов
/ 04 июня 2018

Я программист на Фортране, но теперь мне нужно поддерживать графический интерфейс, написанный на Tcl / Tk, который управляет кодом на Фортране (общение с ним через сокет), но я очень мало знаю о tcl.

МойПрограмма Fortran отправляет XML в GUI о состоянии ошибки, и это отображается в диалоговом окне с использованием кода, показанного ниже:

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)
}

у меня проблема заключается в том, что в результате другого XML, который отправляется в GUI, он открывает другое диалоговое окно с другим предупреждающим сообщением, а открытие второго диалогового окна закрывает первое, поэтому пользователь не видит первыйпредупреждение.Второе диалоговое окно открывается с помощью приведенного ниже кода.

Есть ли способ, которым я могу остановить закрытие первого диалогового окна, если пользователь фактически не нажал кнопку "Отклонить"?Я думал, что «tkwait» в методе «подтвердить» может сделать это, но это не так.

# 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
}

1 Ответ

0 голосов
/ 06 июня 2018

Как предположил Гленн Джекман, проблема заключалась в том, что я использовал одно и то же имя окна (.m) для двух разных сообщений об ошибках.Я просто изменил имя окна для второго сообщения об ошибке (на .n) и объявил это (Message .n) и изменил строку:

установить выбор [.m Подтвердить]

на:

установить выбор [.n подтверждение]

в коде для второго сообщения об ошибке, и проблема была решена.

...