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
Am 13.09.24 um 01:31 schrieb Helmut Giese:
Oh, this is on Windows 64 bit under Tcl 8.6.10
Hello
with event, invoke and unpost
https://www.tcl.tk/man/tcl8.6/TkCmd/menu.htm#M41
event generate $c <$event> -button 3 -x 100 -y 100 -warp 1
#num 1 or 2, 0 is the label
.popup invoke $num
.popup unpost
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
list tk_popup $popup $x $y
.popup invoke $num
Sysop: | DaiTengu |
---|---|
Location: | Appleton, WI |
Users: | 991 |
Nodes: | 10 (0 / 10) |
Uptime: | 120:04:16 |
Calls: | 12,958 |
Files: | 186,574 |
Messages: | 3,265,641 |