Диалоговые окна tcltk появляются под RStudio/Shiny Windows

В настоящее время я программирую свое первое блестящее приложение, и у меня возникают некоторые трудности с некоторыми более тонкими функциями пользовательского интерфейса. Я использую библиотеку tcltk для импорта ряда простых диалоговых окон, чтобы пользователь мог выбрать локальные каталоги и файлы (приложение будет запускаться только локально, поэтому я не буду использовать блестящие команды fileInput). Это также имеет то преимущество, что не зависит от конкретной ОС, как, например, команда choose.dir (см. R ОС Windows. Select.dir() Средство выбора файлов не открывается в рабочем каталоге для дальнейшего обсуждения).

Однако, когда я работаю в Windows (я тестирую в Windows 10, хотя я делаю большую часть работы по разработке в Linux), я обнаруживаю, что вызовы tkchooseDirectory только открывают диалоговое окно за блестящим приложением, если я я запускаю блестящее приложение или за RStudio IDE, если я просто вызываю его из консоли там. Похоже, это не новая проблема: http://r.789695.n4.nabble.com/tkchooseDirectory-opens-dialog-below-browser-window-td4729500.html но я пока не видел каких-либо решений.

Что касается моей работы с консолью RStudio, то это небольшая неприятность, но, учитывая, что блестящее приложение будет в конечном итоге доставлено клиенту (государственному агентству), я бы действительно не стал усугублять их диалоговыми окнами, скрытыми приложением,

Спасибо за любую помощь, которую вы можете предоставить!

[edit 1] Дополнительная информация: похоже, что при вызове tkchooseDirectory из консоли RStudio только первый вызов tkchooseDirectory приводит к отображению диалогового окна позади приложения. Последующие вызовы помещают диалоговое окно в верхнюю часть экрана, как и ожидалось. Кроме того, такое поведение не происходит в графическом интерфейсе R для Windows и, по-видимому, является чем-то особенным для RStudio и связанных с ним продуктов.

[править 2] Похоже, что другие испытывали похожие проблемы и с другими диалоговыми окнами библиотеки tcltk: MessageBox в R

[править 3] Самый простой минимальный пример, чтобы увидеть это, запустив:

library(tcltk2)
tkchooseDirectory()

в консоли RStudio в системе Windows 10.

1 ответ

Решение

Так что я не думаю, что есть прямое решение этого, к сожалению...

Одним из вариантов является поднять toplevel окно, а затем диалоговое окно каталога (вы должны запустить все сразу здесь, в противном случае root снова в фоновом режиме).

library(tcltk2)

root = tktoplevel("width" = 1, "height" = 1)
tkraise(root)
tkchooseDirectory("-parent", root)

Другой вариант будет использовать gWidgets,

dir_ <- gWidgets::gfile(type = "selectdir")

Я решил, что лучше ненадолго приостановить использование Sys.sleep перед открытием диалогового окна:

root = tktoplevel("width" = 1, "height" = 1)
tkraise(root)
Sys.sleep(1) #pause just a little for dailogs
selectedDir <- 
  tclvalue(tkchooseDirectory(
    initialdir=getwd(),
    title="Select directory"))
tkdestroy(root)
Другие вопросы по тегам