Диалоговые окна 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)