ressw m@iii@g oii meer@@et
2025-Jan-20 01:51 UTC
[R] [tcltk] binding two functions to one event
Here is some tcl/tk code I am trying to emulate in R. Paste the following into wish ### begin tcl code toplevel .wtop proc evresp1 { data } { puts "evresp1 $data" } proc evresp2 { data } { puts "evresp2 $data" } bind all <<EVENT>> "evresp1 %d" bind all <<EVENT>> "+evresp2 %d" ### end tcl code Now paste event generate .wtop <<EVENT>> -data abcdef I see the output evresp1 abcdef evresp2 abcdef Both evresp1 and evresp2 got called in response to the event and both got the data. Then paste the following into an R session ### begin R code library(tcltk) catn = function(...) { cat(...,'\n') } wtop = tktoplevel() evresp1 = function(d) { catn('evresp1',d) } evresp2 = function(d) { catn('evresp2',d) } tkbind('all','<<EVENT>>',evresp1) .Tcl(paste('proc evresp2 { d } { ', .Tcl.callback(evresp2),'}')) .Tcl('bind all <<EVENT>> "+evresp2 %d"') ### end R code The .Tcl() calls are necessary (as far as I can tell) to get the effect of 'bind all <<EVENT>> "+evresp2 %d"' ,i.e. appending evresp2 Now paste tkevent.generate(wtop,'<<EVENT>>',data='abcdef') I see output evresp1 abcdef evresp2 %d Both evresp1 and evresp2 got called but only evresp1 got the data right. How can I fix this?> sessionInfoR version 4.3.0 (2023-04-21) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 20.04.6 LTS attached base packages: [1] tcltk stats graphics grDevices utils datasets methods [8] base loaded via a namespace (and not attached): [1] compiler_4.3.0> tclVersion()[1] "8.6.10"
This is in the obscure corners of the tcltk interface, as I am sure you already realized... I'm not even sure whether the "+" in bind .... +script is syntactically an operator or part of the command. However, it is usually not right to define named functions on the Tcl side and mix them with the ones R/Tcl interface generate. So I am thinking that if tkbind('all','<<EVENT>>',evresp1) works, then to add evresp2, you just need to get a "+" into whatever the evresp2 gets converted to. And...> tkbind('all','<<EVENT>>',evresp1)<Tcl>> tkbind('all','<<EVENT>>',paste0("+", .Tcl.callback(evresp2)))<Tcl>> tkevent.generate(wtop,'<<EVENT>>',data='abcdef')evresp1 abcdef evresp2 abcdef <Tcl>> tkbind('all','<<EVENT>>')<Tcl> R_call 0x7f9769c764b0 %d R_call 0x7f9769c79978 %d -pd PS. To answer my own question: yes, the "+" is part of the command because this does not work:> tkbind('all','<<EVENT>>',"+", evresp2)Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") : [tcl] wrong # args: should be "bind window ?pattern? ?command?".> On 20 Jan 2025, at 02:51 , ressw at meer.net wrote: > > > > Here is some tcl/tk code I am trying to emulate in R. > Paste the following into wish > > ### begin tcl code > toplevel .wtop > proc evresp1 { data } { puts "evresp1 $data" } > proc evresp2 { data } { puts "evresp2 $data" } > bind all <<EVENT>> "evresp1 %d" > > ### end tcl code > > Now paste > > event generate .wtop <<EVENT>> -data abcdef > > I see the output > evresp1 abcdef > evresp2 abcdef > > Both evresp1 and evresp2 got called in response to the event and both > got the data. > > Then paste the following into an R session > > ### begin R code > library(tcltk) > catn = function(...) { cat(...,'\n') } > wtop = tktoplevel() > evresp1 = function(d) { catn('evresp1',d) } > evresp2 = function(d) { catn('evresp2',d) } > tkbind('all','<<EVENT>>',evresp1) > .Tcl(paste('proc evresp2 { d } { ', .Tcl.callback(evresp2),'}')) > .Tcl('bind all <<EVENT>> "+evresp2 %d"') > ### end R code > > The .Tcl() calls are necessary (as far as I can tell) to get the > effect of 'bind all <<EVENT>> "+evresp2 %d"' ,i.e. appending evresp2 > > Now paste > > > I see output > evresp1 abcdef > evresp2 %d > > Both evresp1 and evresp2 got called but only evresp1 got the data right. > > How can I fix this? > >> sessionInfo > R version 4.3.0 (2023-04-21) > Platform: x86_64-pc-linux-gnu (64-bit) > Running under: Ubuntu 20.04.6 LTS > attached base packages: > [1] tcltk stats graphics grDevices utils datasets methods > [8] base > loaded via a namespace (and not attached): > [1] compiler_4.3.0 >> tclVersion() > [1] "8.6.10" > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Office: A 4.23 Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com