Re: ISO a way to select programmatically an entry from a popup

Liste des GroupesRevenir à cl tcl 
Sujet : Re: ISO a way to select programmatically an entry from a popup
De : gregor.ebbing (at) *nospam* gmx.de (greg)
Groupes : comp.lang.tcl
Date : 15. Sep 2024, 14:01:02
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vc6lqe$263dr$1@dont-email.me>
References : 1
User-Agent : Mozilla Thunderbird
Am 13.09.24 um 01:31 schrieb Helmut Giese:
Hello out there,
it seems like as long as a popup is posted the app cannot do anything
- in particular it cannot post any events. Consider this script:
---
package require Tk
foreach ch [winfo children "."] {destroy $ch}
 # Turn $x & $y into absolute coords
proc mkAbsCoords {c x y} {
     # get the canvas's coord relative to the toplevel
     set xOfs [expr {[winfo rootx $c]}]
     set yOfs [expr {[winfo rooty $c]}]
     return [list [expr {$x + $xOfs}] [expr {$y + $yOfs}]]
}
 proc popupMenu {c x y} {
     catch {destroy .popup}
     set popup [menu .popup -tearoff false]
     set inactiveBG #b2b2b2
     $popup add command -label "Choose an op" \
         -background  #b2b2b2 -activebackground  #b2b2b2 \
         -activeforeground [$popup cget -fg]
     $popup add command -label "Op 1" -command {puts "Op1 selected"}
     $popup add command -label "Op 2" -command {puts "Op2 selected"}
     lassign [mkAbsCoords $c $x $y] x y
     tk_popup $popup $x $y
}
 set num [lindex $argv 0]
set c [canvas .c -width 200 -height 200]
pack $c
set id [$c create rectangle 50 50 150 150 -fill lightyellow]
$c bind $id <Button-3> [list popupMenu $c %x %y]
update
if {$num} {
     set event Button
} else {
     set event ButtonPress
}
event generate $c <$event> -button 3 -x 100 -y 100 -warp 1
puts "Back from '$event'"
if {$num == 0} {
     event generate $c <ButtonRelease> -button 3 -x 100 -y 100 -warp 1
     puts "Back from 'ButtonRelease'"
}
---
and this output:
---
Microsoft Windows [Version 10.0.19045.4894]
(c) Microsoft Corporation. Alle Rechte vorbehalten.
 d:\proj\_ToolsSE\Skeleton\TclTests>tclsh tst.tcl 1
Back from 'Button'
Op1 selected
 d:\proj\_ToolsSE\Skeleton\TclTests>tclsh tst.tcl 0
Back from 'ButtonPress'
Back from 'ButtonRelease'
Op1 selected
---
To me this seems to clearly indicate that the selection cannot be
influenced by the controlling app: control only returns when the
selection has happened - which is too bad.
 Or is there a trick by which one can influence the selection from a
popup?
Any idea will be highly appreciated.
Helmut
Oh, this is on Windows 64 bit under Tcl 8.6.10
Hello,
Windows 10 , Tcl/Tk 8.6.13
Without a change in the proc popupMenu the script is frozen.
list tk_popup $popup $x $y
# and invoke index for the selction 0, 1 and 2
#.popup invoke $num
package require Tk
foreach ch [winfo children "."] {destroy $ch}
# Turn $x & $y into absolute coords
proc mkAbsCoords {c x y} {
     # get the canvas's coord relative to the toplevel
     set xOfs [expr {[winfo rootx $c]}]
     set yOfs [expr {[winfo rooty $c]}]
     return [list [expr {$x + $xOfs}] [expr {$y + $yOfs}]]
}
proc popupMenu {c x y} {
     catch {destroy .popup}
     set popup [menu .popup -tearoff false]
     set inactiveBG #b2b2b2
     $popup add command -label "Choose an op" \
         -background  #b2b2b2 -activebackground  #b2b2b2 \
         -activeforeground [$popup cget -fg]
     $popup add command -label "Op 1" -command {puts "Op1 selected"}
     $popup add command -label "Op 2" -command {puts "Op2 selected"}
     lassign [mkAbsCoords $c $x $y] x y
     list tk_popup $popup $x $y
}
set num [lindex $argv 0]
set c [canvas .c -width 200 -height 200]
pack $c
set id [$c create rectangle 50 50 150 150 -fill lightyellow]
$c bind $id <Button-3> [list popupMenu $c %x %y]
update
if {$num} {
     set event Button
} else {
     set event ButtonPress
}
event generate $c <$event> -button 3 -x 100 -y 100 -warp 1
puts "Back from '$event'"
if {$num == 0} {
     event generate $c <ButtonRelease> -button 3 -x 100 -y 100 -warp 1
     puts "Back from 'ButtonRelease'"
}
.popup invoke $num
#Output
if {0} {
tclsh exahgnn.tcl 0
Back from 'ButtonPress'
Back from 'ButtonRelease'
^C
tclsh exahgnn.tcl 1
Back from 'Button'
Op1 selected
tk_popup>tclsh exahgnn.tcl 2
Back from 'Button'
Op2 selected
}

Date Sujet#  Auteur
13 Sep 24 * ISO a way to select programmatically an entry from a popup7Helmut Giese
14 Sep 24 +* Re: ISO a way to select programmatically an entry from a popup3greg
14 Sep 24 i+- Re: ISO a way to select programmatically an entry from a popup1greg
14 Sep 24 i`- Re: ISO a way to select programmatically an entry from a popup1greg
15 Sep 24 `* Re: ISO a way to select programmatically an entry from a popup3greg
15 Sep 24  `* Re: ISO a way to select programmatically an entry from a popup2greg
16 Sep 24   `- Re: ISO a way to select programmatically an entry from a popup1Helmut Giese

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal