Installed with R is the documentation for tcl/tk (the original language), on my computer it is in the Doc folder/dir of the TCL folder/dir under the R folder. In that documentation on listbox, near the bottom in the "Default Bindings" section it mentions the virtual event "<<ListboxSelect>>", so I tried that and it worked. It looks like the double angle brackets are because it is a virtual event rather than a regular (real, non-virtual, ...?) event. Virtual events are not tied to a direct interaction like keypress or mouse click, but rather a given widget can generate a virtual event at a time when it makes sense to do so, e.g. <<ListboxSelect>>.
On Wed, Jun 4, 2014 at 10:42 AM, Fowler, Mark <mark.fow...@dfo-mpo.gc.ca> wrote: > Thanks for responding, Greg. That works. Plus I wasn't aware of a > ListboxSelect option, which is much more convenient. Trivial question if you > know off the top of your head - why <<ListboxSelect>> rather than < > ListboxSelect>? I never saw any examples of that type of enclosure. > > I cced the list. Ran into a lot of dead end threads related to my question, > and callbacks in general, using tcltk or tcltk2. Might spare others some > headaches. > > > > -----Original Message----- > From: Greg Snow [mailto:538...@gmail.com] > Sent: June 3, 2014 1:41 PM > To: Fowler, Mark > Cc: R help > Subject: Re: [R] tkbind (callback) > > I think the problem is that the tkbind function is expecting the 3rd argument > to be a function and the arguments of functions passed to tkbind need to have > specific names. In your call when you do the binding the OtoFanCallback > function is called at that time (hence the initial print) and its return > value (which is the return value of the final cat call) is used as the > binding function, which ends up doing nothing as you see. > > I changed your bind command to: > > tkbind(detlist,"<<ListboxSelect>>", OtofanCallback) > > and I changed the OtofanCallback function to have no arguments and ran the > script and everything looks much more like it is working, at least when I > changed the selection in the list box I saw the new value 'cat'ed to the > screen. > > hope this helps > > > On Tue, Jun 3, 2014 at 6:32 AM, Fowler, Mark <mark.fow...@dfo-mpo.gc.ca> > wrote: >> Hello, >> >> >> >> I've migrated an ADMB application with a user dialog from S to R. The >> script below will produce a dialog in R, and don't need data to >> address this issue. It works in terms of capturing user inputs to pass >> along, no problem running the ADMB program. However some of the >> options have dependencies. E.g. if we fix a parameter it should not >> have an estimation phase, but we want the full suite of phases >> available to the user when the parameter is active. Thus the selection >> of one listbox is constrained by the selection of another listbox. I >> had callback functionality in S for this, and am now trying to >> implement callbacks in >> tcltk2 using tkbind. At the bottom of the dialog function below I >> include an attempt at a callback function. Just for one >> parameter-phase pair and scenario to illustrate. It includes a >> troubleshooting cat to tell if it works. When I run this it >> immediately cats the correct value, although this is premature, as I haven't >> interacted with the dialog yet. >> More importantly, it subsequently ignores interactions. If I change >> the parameter definition in one listbox, the callback should verify >> that the estimation phase is appropriate in the other listbox and >> change it if not. But beyond running the callback function when the >> dialog is created, it does not appear to be active after that. Anybody >> know what I'm doing wrong? >> >> >> >> require(tcltk2) >> >> OtofanGUI=function() { >> >> OtofanR=tktoplevel() >> >> tktitle(OtofanR) <- "Age-Related Data Analysis with OTOFAN" >> >> tkgrid(tklabel(OtofanR,text="DATA SELECTION & DEFINITION"),stick="we") >> >> tkgrid(tklabel(OtofanR,text="If you already have files of >> ADMB-formatted data, and/or optional PIN, click button(s) to retrieve >> them")) >> >> ADMBdata <- tk2button(OtofanR, text = "ADMB Data", width = 10, command >> = >> function() tkgetOpenFile()) >> >> ADMBfile <- tk2button(OtofanR, text = "ADMB Pin", width = 10, command >> = >> function() tkgetOpenFile()) >> >> tkgrid(ADMBdata) >> >> tkgrid(ADMBfile) >> >> tkgrid(tklabel(OtofanR,text="")) >> >> tkgrid(tklabel(OtofanR,text="If you have a dataframe in R, >> confirm/identify it, and the variables to build the ADMB inputs")) >> >> CustomFile <- tclVar("AgeData") >> >> tkgrid(tklabel(OtofanR,text="Dataframe name"),tk2entry(OtofanR, >> textvariable=CustomFile, width=20)) >> >> Ages <- tclVar("AgeYears") >> >> tkgrid(tklabel(OtofanR,text="Age variable"),tk2entry(OtofanR, >> textvariable=Ages, width=20)) >> >> FishLens <- tclVar("FishLength") >> >> tkgrid(tklabel(OtofanR,text="Fish Length variable"),tk2entry(OtofanR, >> textvariable=FishLens, width=20)) >> >> OtoWts <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Otolith Weight >> variable"),tk2entry(OtofanR, textvariable=OtoWts, width=20)) >> >> OtoLens <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Otolith Length >> variable"),tk2entry(OtofanR, textvariable=OtoLens, width=20)) >> >> FishWts <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Fish Weight variable"),tk2entry(OtofanR, >> textvariable=FishWts, width=20)) >> >> GroupID <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Group ID variable"),tk2entry(OtofanR, >> textvariable=GroupID, width=20)) >> >> YearID <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Year ID variable"),tk2entry(OtofanR, >> textvariable=YearID, width=20)) >> >> Sex <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Sex variable"),tk2entry(OtofanR, >> textvariable=Sex, width=20)) >> >> LFdata <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Separate Length-Frequency Dataframe >> name"),tk2entry(OtofanR, textvariable=LFdata, width=20)) >> >> FreqVar <- tclVar("NA") >> >> tkgrid(tklabel(OtofanR,text="Frequency variable"),tk2entry(OtofanR, >> textvariable=FreqVar, width=20)) >> >> OSTypes <- c("Random at Length", "Simple Random") >> >> OSlist=tk2listbox(OtofanR, values=OSTypes, selection=1, selectmode = >> "single", height = 2, scroll = "none", autoscroll = "x", enabled = >> TRUE) >> >> tkgrid(tklabel(OtofanR,text="Otolith Sample Type"),OSlist) >> >> ASTypes <- c("Random at Length", "Simple Random") >> >> ASlist=tk2listbox(OtofanR, values=ASTypes, selection=1, selectmode = >> "single", height = 2, scroll = "none", autoscroll = "x", enabled = >> TRUE) >> >> tkgrid(tklabel(OtofanR,text="Age Sample Type"),ASlist) >> >> AppApply <- tk2button(OtofanR, text = "Apply", width = 7, command = >> function() >> OtofanDT(tclvalue(ADMBdata),tclvalue(ADMBFile),tclvalue(ADMBPin),ADMBF=" >> NA",ADMBP="NA",tclvalue(GS), >> >> >> Regdata="NA",tclvalue(CustomFile),tclvalue(Ages),tclvalue(FishLens),tc >> lv >> alue(OtoWts),tclvalue(OtoLens),tclvalue(FishWts),tclvalue(GroupID),tcl >> va >> lue(YearID), >> >> tclvalue(Sex),tclvalue(LFdata),tclvalue(FreqVar), >> >> >> tclvalue(tclVar(OSTypes[as.numeric(tkcurselection(OSlist))+1])),tclval >> ue (tclVar(ASTypes[as.numeric(tkcurselection(ASlist))+1])), >> >> >> tclvalue(tclVar(LAAdet[as.numeric(tkcurselection(detlist))+1])),tclval >> ue (tclVar(LPhase[as.numeric(tkcurselection(LPlist))+1])), >> >> >> tclvalue(tclVar(Ldist[as.numeric(tkcurselection(Ldlist))+1])),tclvalue >> (t clVar(LAAstdev[as.numeric(tkcurselection(LAASDlist))+1])), >> >> >> tclvalue(tclVar(LSDPhase[as.numeric(tkcurselection(LSDlist))+1])),tclv >> al ue(tclVar(LSDdist[as.numeric(tkcurselection(LSDdlist))+1])), >> >> >> tclvalue(tclVar(LSDcov[as.numeric(tkcurselection(LSDcovlist))+1])),OAA=" >> NA",tclvalue(tclVar(OAAdet[as.numeric(tkcurselection(odetlist))+1])), >> >> >> tclvalue(tclVar(OPhase[as.numeric(tkcurselection(OPlist))+1])),tclvalu >> e( tclVar(Odist[as.numeric(tkcurselection(Odlist))+1])), >> >> >> tclvalue(tclVar(OAAstdev[as.numeric(tkcurselection(OAASDlist))+1])),tc >> lv alue(tclVar(OSDPhase[as.numeric(tkcurselection(OSDlist))+1])), >> >> >> tclvalue(tclVar(OSDdist[as.numeric(tkcurselection(OSDdlist))+1])),CORR=" >> NA",tclvalue(tclVar(CORest[as.numeric(tkcurselection(CORRlist))+1])), >> >> >> tclvalue(tclVar(CPhase[as.numeric(tkcurselection(CPlist))+1])),GS2="NA >> ", >> tclvalue(tclVar(PAAPhase[as.numeric(tkcurselection(PAAlist))+1])))) >> >> AppCancel <- tk2button(OtofanR, text = "Cancel", width = 7, command = >> function() tkdestroy(OtofanR)) >> >> tkgrid(AppApply,sticky="w") >> >> tkgrid(AppCancel,sticky="w") >> >> #Length at Age Tab >> >> tkgrid(tklabel(OtofanR,text="LENGTH AT AGE >> FITTING"),sticky="we",column=2,row=1) >> >> LAAdet <- c("Mean, Estimated", "Constrained BY VBGF, Estimated", >> "Constrained TO VBGF, Fixed") >> >> detlist=tk2listbox(OtofanR, values=c("Mean, Estimated", "Constrained >> BY VBGF, Estimated", "Constrained TO VBGF, Fixed"), selection=1, >> selectmode = "single", height = 3, scroll = "none", autoscroll = "x", >> enabled = TRUE, width=30) >> >> tkgrid(tklabel(OtofanR,text="Determination Method"),column=2,row=2) >> >> tkgrid(detlist,column=2,row=3) >> >> LPhase <- c("0", "1", "2", "3") >> >> LPlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), selection=3, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Activation Phase (0 = Fixed, do not >> estimate)"),column=2,row=5) >> >> tkgrid(LPlist,column=2,row=6) >> >> Ldist <- c("0", "1", "2", "3") >> >> Ldlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), selection=1, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Estimate Distribution in Phase (0 = >> Fixed, do not estimate)"),column=2,row=8) >> >> tkgrid(Ldlist,column=2,row=9) >> >> LAAstdev <- c("Traditional Calculation, Fixed", "Constrained BY >> regression, Estimated", "Constrained TO regression, Fixed") >> >> LAASDlist=tk2listbox(OtofanR, values=c("Traditional Calculation, >> Fixed", "Constrained BY regression, Estimated", "Constrained TO >> regression, Fixed"), selection=1, selectmode = "single", height = 4, >> scroll = "none", autoscroll = "x", enabled = TRUE, width=35) >> >> tkgrid(tklabel(OtofanR,text="Standard Deviation"),column=2,row=11) >> >> tkgrid(LAASDlist,column=2,row=12) >> >> LSDPhase <- c("0", "1", "2", "3") >> >> LSDlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), selection=4, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="St Dev Activation Phase (0 = Fixed, do >> not >> estimate)"),column=2,row=14) >> >> tkgrid(LSDlist,column=2,row=15) >> >> LSDdist <- c("0", "1", "2", "3") >> >> LSDdlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), >> selection=1, selectmode = "single", height = 4, scroll = "none", >> autoscroll = "x", enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Estimate St Dev Distribution in Phase (0 >> = do not estimate)"),column=2,row=17) >> >> tkgrid(LSDdlist,column=2,row=18) >> >> LSDcov <- c("0", "1", "2", "3") >> >> LSDcovlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), >> selection=1, selectmode = "single", height = 4, scroll = "none", >> autoscroll = "x", enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Estimate CV in Phase (0 = Fixed, do not >> estimate)"),column=2,row=20) >> >> tkgrid(LSDcovlist,column=2,row=21) >> >> #Otolith at Age Tab >> >> tkgrid(tklabel(OtofanR,text="OTOLITH METRICS AT AGE >> FITTING"),sticky="we",column=3,row=1) >> >> OAAdet <- c("Mean, Estimated", "Constrained BY regression, Estimated", >> "Constrained TO regression, Fixed") >> >> odetlist=tk2listbox(OtofanR, values=c("Mean, Estimated", "Constrained >> BY regression, Estimated", "Constrained TO regression, Fixed"), >> selection=1, selectmode = "single", height = 3, scroll = "none", >> autoscroll = "x", enabled = TRUE, width=30) >> >> tkgrid(tklabel(OtofanR,text="Determination Method"),column=3,row=2) >> >> tkgrid(odetlist,column=3,row=3) >> >> OPhase <- c("0", "1", "2", "3") >> >> OPlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), selection=3, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Activation Phase (0 = Fixed, do not >> estimate)"),column=3,row=5) >> >> tkgrid(OPlist,column=3,row=6) >> >> Odist <- c("0", "1", "2", "3") >> >> Odlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), selection=1, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Estimate Distribution in Phase (0 = >> Fixed, do not estimate)"),column=3,row=8) >> >> tkgrid(Odlist,column=3,row=9) >> >> OAAstdev <- c("Traditional Calculation, Fixed", "Constrained BY >> regression, Estimated", "Constrained TO regression, Fixed") >> >> OAASDlist=tk2listbox(OtofanR, values=c("Traditional Calculation, >> Fixed", "Constrained BY regression, Estimated", "Constrained TO >> regression, Fixed"), selection=1, selectmode = "single", height = 4, >> scroll = "none", autoscroll = "x", enabled = TRUE, width=35) >> >> tkgrid(tklabel(OtofanR,text="Standard Deviation"),column=3,row=11) >> >> tkgrid(OAASDlist,column=3,row=12) >> >> OSDPhase <- c("0", "1", "2", "3") >> >> OSDlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), selection=4, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="St Dev Activation Phase (0 = Fixed, do >> not >> estimate)"),column=3,row=14) >> >> tkgrid(OSDlist,column=3,row=15) >> >> OSDdist <- c("0", "1", "2", "3") >> >> OSDdlist=tk2listbox(OtofanR, values=c("0", "1", "2", "3"), >> selection=1, selectmode = "single", height = 4, scroll = "none", >> autoscroll = "x", enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Estimate St Dev Distribution in Phase (0 >> = do not estimate)"),column=3,row=17) >> >> tkgrid(OSDdlist,column=3,row=18) >> >> #Dependencies Tab >> >> tkgrid(tklabel(OtofanR,text="DEPENDENCIES"),sticky="we",column=4,row=1 >> ) >> >> tkgrid(tklabel(OtofanR,text="Correlations"),sticky="we",column=4,row=2 >> ) >> >> CORest <- c("Age-Specific", "Age-Invariant") >> >> CORRlist=tk2listbox(OtofanR, values=c("Age-Specific", >> "Age-Invariant"), selection=1, selectmode = "single", height = 4, >> scroll = "none", autoscroll = "x", enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Method"),column=4,row=3) >> >> tkgrid(CORRlist,column=4,row=3) >> >> CPhase <- c("1", "2", "3") >> >> CPlist=tk2listbox(OtofanR, values=c("1", "2", "3"), selection=3, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Activation Phase"),column=4,row=5) >> >> tkgrid(CPlist,column=4,row=6) >> >> PAAPhase <- c("1", "2", "3") >> >> PAAlist=tk2listbox(OtofanR, values=c("1", "2", "3"), selection=1, >> selectmode = "single", height = 4, scroll = "none", autoscroll = "x", >> enabled = TRUE) >> >> tkgrid(tklabel(OtofanR,text="Activation Phase to Estimate Proportions >> at >> Age"),column=4,row=8) >> >> tkgrid(PAAlist,column=4,row=9) >> >> OtofanCallback = function(detlist,LAAdet,LPhase,LPlist) { >> >> if >> (tclvalue(tclVar(LAAdet[as.numeric(tkcurselection(detlist))+1]))!="3" >> & >> tclvalue(tclVar(LPhase[as.numeric(tkcurselection(LPlist))+1]))=="0")tk >> se >> lection.set(detlist, 2) >> >> cat(tclvalue(tclVar(LAAdet[as.numeric(tkcurselection(detlist))+1]))) >> >> } >> >> tkbind(detlist,"<Key>", OtofanCallback(detlist,LAAdet,LPhase,LPlist)) >> >> } >> >> OtofanGUI() >> >> >> >> [immediately outputs as below] >> >> Mean, Estimated<Tcl> >> >> >> >> Mark Fowler >> Population Ecology Division >> Bedford Inst of Oceanography >> Dept Fisheries & Oceans >> Dartmouth NS Canada >> B2Y 4A2 >> Tel. (902) 426-3529 >> Fax (902) 426-9710 >> Email mark.fow...@dfo-mpo.gc.ca <mailto:mark.fow...@dfo-mpo.gc.ca> >> >> >> >> >> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. > > > > -- > Gregory (Greg) L. Snow Ph.D. > 538...@gmail.com -- Gregory (Greg) L. Snow Ph.D. 538...@gmail.com ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.