[R] [tcltk] tktable: bindings doesn't triggers the ValidationCommand and Command

Cleber N.Borges klebyn at yahoo.com.br
Thu Nov 24 22:38:54 CET 2016


Dears,

I'm trying to create an Data Editor like Rgui.exe's FIX (windows)...

The code is below.

The problem is that I can not get the binds to trigger the validation
commands and the main table command

Control-C, Control-V, and Control-X work only in the visual without my R
data being changed.

Any help, tip or example is welcome and I thank you in advance for your
attention.

Thank you very much


Cleber

################### R 3.4  Tcl  8.6


library( tcltk )
tclRequire("Tktable")

ncol <- 6
nrow <- 6

x <- matrix( rnorm( nrow*ncol ), nrow, ncol )

rownames(x) <- paste0( "Sam ", 1:nrow )
colnames(x) <- paste0( "Var ", 1:ncol )

###############################################################

showdigits <- 6

tablecmd <- function(r,c,S){
r <- as.integer( r )
c <- as.integer( c )
showNA <- is.na( x[ r,c ] )
if( r == 0 && c > 0 ) return( tcl("expr", '{', colnames(x)[c], '}' ) )
if( c == 0 && r > 0 ) return( tcl("expr", '{', rownames(x)[r], '}' ) )
if( r >  0 && c > 0 &&  showNA ) return( tcl("expr", "{}" ) )
if( r >  0 && c > 0 && !showNA ) return( tcl("expr", round( x[r,c],
digits=showdigits ) ) )# signif
if( r == 0 && c == 0 ) return( tcl("expr", "{}" ) )
}

tablevcmd <- function( S,s,r,c ){
# s : current value # S : potential new value
if( grepl("\n", S ) ){
     tcl('::tk::table::MoveCell', .Tk.ID( tableData ), 1, 0 )
     return( tcl( 'expr', 0 ) )
     }
r <- as.integer( r )
c <- as.integer( c )
if( r == 0 && c > 0 ) {
     colnames(x)[c] <<- S
     return( tcl( 'expr', 1 ) )
     }
if( c == 0 && r > 0 ) {
     rownames(x)[r] <<- S
     return( tcl( 'expr', 1 ) )
     }
if( grepl(" ", S ) ){
     tcl('::tk::table::MoveCell', .Tk.ID( tableData ), 1, 0 )
     return( tcl( 'expr', 0 ) )
     }
if( S == "" ) {
     x[r,c] <<- NA
     return( tcl( 'expr', 1 ) )
     }
if( S != s ){
     x[r,c] <<- as.numeric( S )
     return( tcl( 'expr', 1 ) )
     }
}

# make the GUI
top <- tktoplevel()
tcl( 'wm', 'title',     top, 'DataFix' )

fmTableData <- ttkframe( top, borderwidth=2 )
tcl( 'pack', fmTableData, fill="both", expand=TRUE, padx=15, pady=15  )

fxscroll <- function(...){ tcl( scrX, 'set', ... ) }
fyscroll <- function(...){ tcl( scrY, 'set', ... ) }

tableData <- tkwidget( fmTableData, 'table', rows=nrow+1, cols=ncol+1,
height=-1, width=-1,
ellipsis='............', insertofftime=0, flashmode=TRUE, flashtime=1,
anchor='e',
resizeborders='col', wrap=FALSE, font='{Courier} 10', padx=5, pady=2,#
ipadx=3, ipady=1,
rowstretchmode='unset', colstretchmode='unset', multiline=FALSE, cache=TRUE,
background="white", selectmode="extended", selecttitle=TRUE,
relief='groove',
borderwidth=c(0,1,0,1), drawmode='compatible', colwidth=12,
highlightcolor="gray", highlightbackground="white", highlightthickness=1,
xscrollcommand=fxscroll, yscrollcommand=fyscroll, rowseparator='\n',
colseparator='\t',
validate=TRUE, vcmd=tablevcmd, usecommand=TRUE, command=tablecmd )

scrX <- ttkscrollbar( fmTableData, orient="horizont",
command=function(...) tcl( tableData,'xview',...) )
scrY <- ttkscrollbar( fmTableData, orient="vertical",
command=function(...) tcl( tableData,'yview',...) )
#### empacotando os scrollbars
tcl( "pack", scrY, side = "right",  fill = "y", expand = FALSE, pady =
c(0,18) )
tcl( "pack", scrX, side = "bottom", fill = "x", expand = FALSE )

tcl( tableData, "tag", "celltag", "ZeroZero", "0,0" )
tcl( tableData, "tag", "rowtag",  "rowtitle", "0" )
tcl( tableData, "tag", "coltag",  "coltitle", "0" )

tcl( tableData, "tag", "configure", "ZeroZero", bg='SystemButtonFace',
fg='SystemButtonFace', state='disabled' )

tcl( tableData, "tag", "configure", "rowtitle", bg='lightgray',
relief='groove', anchor='center')#, borderwidth=c(1,1,1,1) )
tcl( tableData, "tag", "configure", "coltitle", bg='lightgray',
relief='groove', anchor='w')#, borderwidth=c(1,1,1,1) )

tcl( tableData, "tag", "configure", "active", fg='green', bg='gray90',
relief='solid', borderwidth=c(1,1,1,1) )
tcl( tableData, "width", "0", "15" )

tcl( 'pack', tableData, side='left', anchor='n', fill="both", expand=TRUE )

#################################################################
# stay here to serve as an example
#################################################################
# bind Table <Up> {::tk::table::MoveCell %W -1  0}
tcl( 'bind', .Tk.ID( tableData ), '<F1>', paste('::tk::table::MoveCell',
.Tk.ID( tableData ), 1, 0 )  )
# bind Table <$cut>    {tk_tableCut %W}
tcl( 'bind', .Tk.ID( tableData ), '<F2>', paste('tk_tableCut', .Tk.ID(
tableData ) ) )












---
Este email foi escaneado pelo Avast antivírus.
https://www.avast.com/antivirus

	[[alternative HTML version deleted]]



More information about the R-help mailing list