Короче:
Я использую пакет 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".
Скорее всего, я не знаю, как разделить объект. Как мне это сделать?
Обновлено: на основе комментариев @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) возвращает Tcl список идентификаторов виджетов. В общем, это немного беспорядочно, чтобы иметь дело с другими языками (из-за потенциальных проблем с обработкой правил цитирования), но поскольку сгенерированные идентификаторы виджетов содержат только цифры ASCII и символы ., а разделители - просто одиночные пробелы, просто разделение на пробел даст вам правильная вещь.
(siblings_of_b1 <- strsplit(tkwinfo("children", parent_of_b1), " ", fixed = TRUE))
Конечно, вам нужно будет перебирать полученный список. Несколько братьев и сестер - это несколько братьев и сестер. (Кроме того, не забывайте, что это сам включает b1; вы не запрашивали фактических братьев и сестер, а, скорее, детей родителя.)
as.character() - более короткое решение, чем strsplit().
Хорошие идеи. Пожалуйста, исправьте код для
(siblings_of_b1 <- strsplit(tclvalue(tkwinfo("children", parent_of_b1)), " ", fixed = TRUE)[[1]]), так как текущая версия приводит к ошибке:>Error in strsplit(tkwinfo("children", parent_of_b1), " ", fixed = TRUE) : non-character argument