如何在 R 中访问和修改 Tcl/Tk 对象的同级对象
How to access and modify a sibling of a Tcl/Tk object in R
简而言之:
我在 R 中使用 tcltk
包。但非 R 用户也可以提出想法并提供 R 以外的其他语言的示例。
我在 R <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3
中有一个 Tcl/Tk 对象列表,我想分别访问和修改每个对象。我该怎么做?
或者如果我有按钮 A 对象,我如何访问和修改按钮 B 对象?
详情:
我有以下小部件:
创建它的代码:
library(tcltk)
top <- tktoplevel()
frame_1 <- tkframe(top)
tkgrid(frame_1)
frame_n <- tkframe(frame_1)
tkgrid(frame_n)
b1 <- ttkbutton(frame_n, text = "button A")
b2 <- ttkbutton(frame_n, text = "button B")
b3 <- ttkbutton(frame_n, text = "button c")
tkgrid(b1, b2, b3)
假设我只能访问 b1
:
class(b1)
# [1] "tkwin"
我想访问和修改 b1
的兄弟姐妹,就像我有对象 b2
一样(例如):
tkcget(b2, "-text") # Get text
tkconfigure(b2, text = "New B") # Change text
通过使用 tkwinfo
,我设法访问了 b1
的父级并获得了兄弟姐妹列表(我不确定从技术上讲它是否是 "list"),但是我不知道,如何 access/modify 一个接一个:
(parent_of_b1 <- tkwinfo("parent", b1))
# <Tcl> .1.1.1
(siblings_of_b1 <- tkwinfo("children", parent_of_b1))
# <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3
class(siblings_of_b1)
# "tclObj"
我的尝试导致错误:
tkcget(siblings_of_b1, "-text")
# Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") :
# [tcl] invalid command name ".1.1.1.1 .1.1.1.2 .1.1.1.3".
很可能我不知道如何对对象进行子集化。我该怎么做?
更新: 根据@Donal Fellows 的评论,我找到了解决方案。
函数 as.character()
完成工作。
(my_tcl_object <- tkwinfo("children", parent_of_b1))
# <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3
as.character(my_tcl_object)
## [1] ".1.1.1.1" ".1.1.1.2" ".1.1.1.3"
在这种情况下,tclvalue()
+ strsplit()
也适用:
strsplit(tclvalue(my_tcl_object), " ", fixed = TRUE)[[1]]
## [1] ".1.1.1.1" ".1.1.1.2" ".1.1.1.3"
但是,一般来说(对于其他问题),as.character()
与 tclvalue()
+ strsplit()
可能会给出不同的结果。
问题是 winfo children
子命令(使用底层 Tcl 名称)returns Tcl 小部件标识符列表 。一般来说,从其他语言处理这有点麻烦(因为处理引用规则的潜在问题)但是因为生成的小部件标识符只包含 ASCII 数字和 .
字符并且分隔符只是单个空格,所以简单splitting by space会给你正确的东西。
(siblings_of_b1 <- strsplit(tkwinfo("children", parent_of_b1), " ", fixed = TRUE))
当然,您需要迭代结果列表。多个兄弟姐妹是多个兄弟姐妹。 (此外,不要忘记这个 包括 b1 本身;您没有要求实际的兄弟姐妹,而是 parent 的 children。)
简而言之:
我在 R 中使用 tcltk
包。但非 R 用户也可以提出想法并提供 R 以外的其他语言的示例。
我在 R <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3
中有一个 Tcl/Tk 对象列表,我想分别访问和修改每个对象。我该怎么做?
或者如果我有按钮 A 对象,我如何访问和修改按钮 B 对象?
详情:
我有以下小部件:
创建它的代码:
library(tcltk)
top <- tktoplevel()
frame_1 <- tkframe(top)
tkgrid(frame_1)
frame_n <- tkframe(frame_1)
tkgrid(frame_n)
b1 <- ttkbutton(frame_n, text = "button A")
b2 <- ttkbutton(frame_n, text = "button B")
b3 <- ttkbutton(frame_n, text = "button c")
tkgrid(b1, b2, b3)
假设我只能访问 b1
:
class(b1)
# [1] "tkwin"
我想访问和修改 b1
的兄弟姐妹,就像我有对象 b2
一样(例如):
tkcget(b2, "-text") # Get text
tkconfigure(b2, text = "New B") # Change text
通过使用 tkwinfo
,我设法访问了 b1
的父级并获得了兄弟姐妹列表(我不确定从技术上讲它是否是 "list"),但是我不知道,如何 access/modify 一个接一个:
(parent_of_b1 <- tkwinfo("parent", b1))
# <Tcl> .1.1.1
(siblings_of_b1 <- tkwinfo("children", parent_of_b1))
# <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3
class(siblings_of_b1)
# "tclObj"
我的尝试导致错误:
tkcget(siblings_of_b1, "-text")
# Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") :
# [tcl] invalid command name ".1.1.1.1 .1.1.1.2 .1.1.1.3".
很可能我不知道如何对对象进行子集化。我该怎么做?
更新: 根据@Donal Fellows 的评论,我找到了解决方案。
函数 as.character()
完成工作。
(my_tcl_object <- tkwinfo("children", parent_of_b1))
# <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3
as.character(my_tcl_object)
## [1] ".1.1.1.1" ".1.1.1.2" ".1.1.1.3"
在这种情况下,tclvalue()
+ strsplit()
也适用:
strsplit(tclvalue(my_tcl_object), " ", fixed = TRUE)[[1]]
## [1] ".1.1.1.1" ".1.1.1.2" ".1.1.1.3"
但是,一般来说(对于其他问题),as.character()
与 tclvalue()
+ strsplit()
可能会给出不同的结果。
问题是 winfo children
子命令(使用底层 Tcl 名称)returns Tcl 小部件标识符列表 。一般来说,从其他语言处理这有点麻烦(因为处理引用规则的潜在问题)但是因为生成的小部件标识符只包含 ASCII 数字和 .
字符并且分隔符只是单个空格,所以简单splitting by space会给你正确的东西。
(siblings_of_b1 <- strsplit(tkwinfo("children", parent_of_b1), " ", fixed = TRUE))
当然,您需要迭代结果列表。多个兄弟姐妹是多个兄弟姐妹。 (此外,不要忘记这个 包括 b1 本身;您没有要求实际的兄弟姐妹,而是 parent 的 children。)