0

简而言之:

tcltk在 R 中使用包。但非 R 用户也可能提出想法并提供除 R 之外的其他语言的示例。我有一个 R 中的 Tcl/Tk 对象列表,<Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3并希望分别访问和修改每个对象。我该怎么做?

或者如果我有按钮 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并获得了兄弟姐妹的列表(我不确定从技术上讲它是否是一个“列表”),但我不知道如何一个一个地访问/修改它们中的每一个:

(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()vs . tclvalue()+strsplit()可能会给出不同的结果。

4

1 回答 1

1

问题是winfo children子命令(使用底层 Tcl 名称)返回一个小部件标识符的 Tcl 列表。一般来说,从其他语言处理这有点混乱(因为处理引用规则的潜在问题)但是因为生成的小部件标识符只包含 ASCII 数字和.字符,并且分隔符只是单个空格,所以简单地用空格分割会给出你是对的。

(siblings_of_b1 <- strsplit(tkwinfo("children", parent_of_b1), " ", fixed = TRUE))

当然,您需要遍历结果列表。多个兄弟姐妹是多个兄弟姐妹。(另外,不要忘记这包括b1 本身;您没有要求实际的兄弟姐妹,而是父母的孩子。)

于 2019-01-04T17:37:34.503 回答