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.tclDate : 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?