Sujet : 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, 10:55:13
Autres entêtes
Message-ID : <RJ-dnawmWOec0-j7nZ2dnZfqnPWdnZ2d@brightview.co.uk>
User-Agent : Pan/0.154 (Izium; 517acf4)
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