Добавьте всплывающее текстовое поле в сценарий R с помощью tcltk

У меня есть длинный скрипт для анализа данных, и он должен подключаться к нескольким базам данных. Одна из баз данных имеет тенденцию обновлять мой пароль чаще, чем мне хотелось бы, поэтому я хотел бы добавить всплывающее окно для ввода моего текущего пароля. Я нашел этот пример, но недостаточно понимаю tcltk, чтобы увидеть, как вернуть мое значение при закрытии диалогового окна. Я думал определить его как глобальную переменную (<<-) в функции OnOK, но это кажется беспорядочным.

require(tcltk)
tt<-tktoplevel()
Name <- tclVar("Password")
entry.Name <-tkentry(tt,width="20",textvariable=Name)
tkgrid(tklabel(tt,text="Enter Password"))
tkgrid(entry.Name)
OnOK <- function()
{
    NameVal <- tclvalue(Name)
    tkdestroy(tt)
}
OK.but <-tkbutton(tt,text="   OK   ",command=OnOK)
tkbind(entry.Name, "<Return>",OnOK)
tkgrid(OK.but)
tkfocus(tt)

r tk
person PaulHurleyuk    schedule 03.07.2012    source источник


Ответы (3)


Возможно, вы обнаружите, что функция ginput из gWidgets завершает то, что предлагает вам Грег Сноу:

require(gWidgets)
options(guiToolkit="tcltk") 
NameVal <- ginput("Enter your passsword:")

NameVal будет содержать введенную строку или NA, если вы отмените.

person jverzani    schedule 04.07.2012

Вы сами ответили на свой вопрос: на самом деле вам нужно <<- в этих примерах tcltk --- см. различные сообщения Питера на протяжении многих лет или другие примеры, используемые другими пакетами CRAN, или даже в самом пакете. Пытаться

  library(tcltk)
  demo("tkcanvas")

и посмотреть, как это относится, например. lastX, lastY.

person Dirk Eddelbuettel    schedule 03.07.2012

Вы можете использовать функции tkwait.window или tkwait.variable. Используйте приведенный выше код, чтобы открыть всплывающее окно, затем используйте одну из функций ожидания (tkwait.window остановит выполнение скрипта до тех пор, пока окно не будет уничтожено, по сути, когда вы нажмете OK). Затем, когда скрипт продолжит работу, вы получите свое значение в переменной внутри скрипта/функции и сможете просто использовать его там без необходимости назначать глобальную переменную.

person Greg Snow    schedule 03.07.2012