Как получить доступ и изменить родственный объект Tcl/Tk в R
Короче:
я использую tcltk
пакет в R. Но не-R пользователи также могут предлагать идеи и приводить примеры на другом языке, кроме R. У меня есть список объектов Tcl/Tk в R <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".
Скорее всего, я не знаю способ подмножества объекта. Как мне это сделать?
1 ответ
Проблема в том, что winfo children
подкоманда (используя основное имя Tcl) возвращает список идентификаторов виджетов Tcl. В общем, это немного беспорядочно для других языков (из-за потенциальных проблем с обработкой правил цитирования), но потому что сгенерированные идентификаторы виджетов просто содержат цифры ASCII и .
символы и разделители - это всего лишь один пробел, простое разбиение на пробел даст вам правильную вещь.
(siblings_of_b1 <- strsplit(tkwinfo("children", parent_of_b1), " ", fixed = TRUE))
Конечно, вам нужно будет перебрать итоговый список. Многократные родные братья - многократные родные братья. (Кроме того, не забывайте, что это включает в себя сам b1; вы спросили не о реальных братьях и сестрах, а о детях родителя.)