Re: how to create a dialog that is hidden/shown rather than created/destroyed

Liste des GroupesRevenir à cl tcl 
Sujet : Re: how to create a dialog that is hidden/shown rather than created/destroyed
De : mark (at) *nospam* qtrac.eu (Mark Summerfield)
Groupes : comp.lang.tcl
Date : 21. Jun 2024, 16:17:56
Autres entêtes
Message-ID : <aOWdnd1K6Kw5BOj7nZ2dnZfqnPGdnZ2d@brightview.co.uk>
References : 1
User-Agent : Pan/0.149 (Bellevue; 4c157ba)
On Fri, 21 Jun 2024 09:55:13 +0000, Mark Summerfield wrote:

Below is a tiny program.
 
The "About" form is created and destroyed. So you can click About then
close the About form, then repeat as often as you like.
 
The "Options" form is supposed to be shown and hidden. But once you
click it and then close it, the entire app is blocked. So clearly I'm
doing something wrong.
 
Here's the code using Tcl/Tk 9.0b2 on Linux.
 
#!/usr/bin/env wish9
 
if {[info exists env(TK_SCALING)]} { tk scaling $env(TK_SCALING) }
 
proc prepare_modal {form} {
    wm withdraw $form wm attributes $form -type dialog wm transient
    $form .
}
 
proc show_modal {form {focus_widget ""}} {
    wm deiconify $form raise $form focus $form if {$focus_widget ne ""}
    {
        focus $focus_widget
    }
    catch {grab set $form}
    catch {tkwait visibility $form}
}
 
variable optionsForm
 
proc main {} {
    wm title . "Dialog Tests"
    wm minsize . 240 240 wm attributes . -type dialog ttk::button
    .optionsButton -text Options… -underline 1 \
        -command on_options
    ttk::button .aboutButton -text About -underline 1 -command on_about
    pack .optionsButton -side top pack .aboutButton -side top
}
 
proc on_options {} {
    if {![info exists ::optionsForm]} {
        puts "on_options init"
        set ::optionsForm [toplevel .optionsForm] prepare_modal
        .optionsForm wm protocol .optionsForm WM_DELETE_WINDOW {wm
withdraw .optionsForm}
        ttk::label .optionsForm.label -text Options pack
        .optionsForm.label
    }
    puts on_options ;# TODO use show_modal hide/show show_modal
    $::optionsForm ;# TODO give focus widget
}
 
proc on_about {} {
    toplevel .aboutForm prepare_modal .aboutForm wm protocol .aboutForm
    WM_DELETE_WINDOW {destroy .aboutForm} ttk::label .aboutForm.label
    -text About pack .aboutForm.label show_modal .aboutForm
}
 
main

I think I have solved it this time.

I added this proc:

proc hide_modal {form} {
    wm withdraw $form
    grab release $form
}

and changed the protocol call to:

wm protocol .optionsForm WM_DELETE_WINDOW {hide_modal .aboutForm}

It seems to work, but is this now correct?

Date Sujet#  Auteur
21 Jun 24 * how to create a dialog that is hidden/shown rather than created/destroyed7Mark Summerfield
21 Jun 24 +* Re: how to create a dialog that is hidden/shown rather than created/destroyed2Mark Summerfield
21 Jun 24 i`- Re: how to create a dialog that is hidden/shown rather than created/destroyed1Mark Summerfield
21 Jun 24 +* Re: how to create a dialog that is hidden/shown rather than created/destroyed2Mark Summerfield
21 Jun 24 i`- Re: how to create a dialog that is hidden/shown rather than created/destroyed1Rich
21 Jun 24 `* Re: how to create a dialog that is hidden/shown rather than created/destroyed2Rich
22 Jun 24  `- Re: how to create a dialog that is hidden/shown rather than created/destroyed1Mark Summerfield

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal