Как получить доступ и изменить родственный объект Tcl / Tk в R - PullRequest
0 голосов
/ 04 января 2019

Короче говоря:

Я использую пакет tcltk в R. Но не-R пользователи могут также предлагать идеи и приводить примеры на другом языке, чем R. У меня есть список объектов Tcl / Tk в R <Tcl> .1.1.1.1 .1.1.1.2 .1.1.1.3 и я хочу получить доступ и изменить каждый объект отдельно. Как мне это сделать?

Или, если у меня есть объект кнопки A, как я могу получить доступ и изменить объект кнопки B?

Подробности:

У меня есть следующий виджет:

enter image description here

Код для его создания:

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".

Скорее всего, я не знаю способ подмножества объекта. Как я могу это сделать?

1 Ответ

0 голосов
/ 04 января 2019

Проблема в том, что подкоманда winfo children (использующая имя Tcl) возвращает список идентификаторов виджетов Tcl . В общем, это немного беспорядочно для других языков (из-за потенциальных проблем с обработкой правил цитирования), но потому что сгенерированные идентификаторы виджетов просто содержат цифры ASCII и . символы, а разделители - это просто один пробел, просто расщепление по пробелу даст вам правильную вещь.

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

Конечно, вам нужно будет перебрать итоговый список. Многократные родные братья - многократные родные братья. (Кроме того, не забывайте, что это включает в себя b1; вы спросили не о фактических братьях и сестрах, а о детях родителя.)

...