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)
严格来说,您可以在同一帧中同时使用打包器和网格化器如果您关闭(至少)其中一个的几何传播。如果你不这样做,他们就会争论父框架的大小应该是多少。但是您可能一开始就不想这样做;这不太可能是您需要的小部件布局,因为小部件会堆叠在一起并且不会重叠。
在框架中使用打包器,在子框架中使用网格器,或者反过来,是完全合理的。这几乎肯定是您想要做的。
我正在使用 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)
严格来说,您可以在同一帧中同时使用打包器和网格化器如果您关闭(至少)其中一个的几何传播。如果你不这样做,他们就会争论父框架的大小应该是多少。但是您可能一开始就不想这样做;这不太可能是您需要的小部件布局,因为小部件会堆叠在一起并且不会重叠。
在框架中使用打包器,在子框架中使用网格器,或者反过来,是完全合理的。这几乎肯定是您想要做的。