tkgrid() 和 tkpack() 可以用在同一个函数中还是 R 中的 window,或者是否有 tkframe() 的替代方法?

Can tkgrid() and tkpack() be used in the same function or window in R, or is there an alternative to tkframe()?

我正在使用 R 中的 tcl/tk 创建一个用户界面。我需要在单个顶级 window 中包含多个按钮和其他小部件,并且我需要将一些小部件分组到一个容器中在顶级 window 内。我一直在使用 tkframe() 作为容器,据我所知,它需要 tkpack() 来放置小部件。但是我正在使用 tkgrid() 将框架和其他小部件放置在顶层 window。我怀疑这是导致我在尝试 运行 接口函数时遇到的不一致。 tkpack() 和 tkgrid() 可以一起使用吗?如果没有,我可以使用另一种类型的容器来代替 tkframe(),它会更好地与 tkgrid() 一起工作吗?

这里有一些简化的代码作为示例,仅适用于 tkpack():

 require(tcltk)   
 tclRequire("BWidget")



interface1 <- function(){

  ww <- tktoplevel()

  buttons.f <- tkframe(ww)

   getdata.b <- tkbutton(buttons.f, text = "Import Data", command = function() {
    filepath <<- file.choose()
    })
   viewdata.b <- tkbutton(buttons.f, text = "Print Data", command = function() {
    print(read.csv(filepath))
    })
   tkpack(getdata.b, fill = "both")
   tkpack(viewdata.b, fill = "both")

  tree.f = tkframe(ww)

   treeWidget = tkwidget(tree.f,"Tree", width = 30, height = 6)

   tkinsert(treeWidget,"end","root","Species1",text="Elk")
   tkinsert(treeWidget,"end","root","Species2",text="Deer")

   tkpack(treeWidget,fill='both',expand=1)

   getvars  <- function() { 
    selection <<- tclvalue(tcl(treeWidget,"selection","get")) 
    print(selection)
    }

  run.b <- tkbutton(ww, text = "Run", command = getvars)

  close.b <- tkbutton(ww, text = "Close", command = function(){
    tkdestroy(ww)
    filepath <<- NULL
    })

  tkpack(buttons.f)
  tkpack(tklabel(ww,text="Select One:"))
  tkpack(tree.f)
  tkpack(run.b, fill = "both")
  tkpack(close.b, fill = "both")
}
interface1()

但是使用 tkgrid() 它并不总是正确显示:

interface2 <- function(){

  ww <- tktoplevel()

  buttons.f <- tkframe(ww)

   getdata.b <- tkbutton(buttons.f, text = "Import Data", command = function() {
    filepath <<- file.choose()
    })
   viewdata.b <- tkbutton(buttons.f, text = "Print Data", command = function() {
    print(read.csv(filepath))
    })
   tkpack(getdata.b, fill = "both")
   tkpack(viewdata.b, fill = "both")

  tree.f = tkframe(ww)

   treeWidget = tkwidget(tree.f,"Tree", width = 30, height = 6)

   tkinsert(treeWidget,"end","root","Species1",text="Elk")
   tkinsert(treeWidget,"end","root","Species2",text="Deer")

   tkpack(treeWidget,fill='both',expand=1)

   getvars  <- function() { 
    selection <<- tclvalue(tcl(treeWidget,"selection","get")) 
    print(selection)
    }

  run.b <- tkbutton(ww, text = "Run", command = getvars)

  close.b <- tkbutton(ww, text = "Close", command = function(){
    tkdestroy(ww)
    filepath <<- NULL
    })

  tkgrid(buttons.f, pady = 10, columnspan = 2)
  tkgrid(tklabel(ww,text="Select One:"), columnspan = 2)
  tkgrid(tree.f, columnspan = 2)
  tkgrid(run.b, close.b, padx = 20, pady = 10)
}
interface2()

因为我更喜欢使用 tkgrid,谁能确定 tkgrid/tkpack 的组合是否导致了错误,或者谁能建议 tkframe 的替代方案?感谢您的帮助!

(我确信 运行 这个任务有一个很好的包,但我正在为工作中的项目创建一个界面,我被指示不要使用任何不符合要求的包附带基础 R)

严格来说,您可以在同一帧中同时使用打包器和网格化器如果您关闭(至少)其中一个的几何传播。如果你不这样做,他们就会争论父框架的大小应该是多少。但是您可能一开始就不想这样做;这不太可能是您需要的小部件布局,因为小部件会堆叠在一起并且不会重叠。

在框架中使用打包器,在子框架中使用网格器,或者反过来,是完全合理的。这几乎肯定是您想要做的。