tcltk 对话框出现在下方 RStudio/Shiny Windows

tcltk Dialog Boxes Appear Underneath RStudio/Shiny Windows

我目前正在编写我的第一个闪亮的应用程序,但我在使用一些更微妙的用户界面功能时遇到了一些困难。我正在使用 tcltk 库为用户导入一些简单的对话框到 select 本地目录和文件(应用程序只会在本地 运行 所以我不会使用 shiny 的 fileInput 命令).这也有不像 choose.dir 命令那样 OS 特定的优点(有关更多讨论,请参阅 )。

然而,当我在 Windows 中工作时(我在 Windows 10 上进行测试,尽管我在 Linux 中完成了大部分开发工作),我发现调用 tkchooseDirectory 只会打开闪亮应用程序后面的对话框,如果我 运行 宁一个闪亮的应用程序,或者在 RStudio 后面 IDE 如果我只是从那里的控制台调用它。这似乎不是一个新问题:http://r.789695.n4.nabble.com/tkchooseDirectory-opens-dialog-below-browser-window-td4729500.html 但我还没有看到任何解决方案。

对于我使用 RStudio 控制台进行的开发工作,这是一个小麻烦,但是,考虑到闪亮的应用程序最终将交付给客户(国家机构),我真的不想用对话框加重它们被应用程序隐藏了。

感谢您提供的任何帮助!

[edit 1] 更多信息:似乎从 RStudio 控制台调用 tkchooseDirectory 时,只有第一次调用 tkchooseDirectory 会导致在应用程序后面显示一个对话框。后续调用按预期将对话框放置在显示的顶部。此外,此行为不会发生在 Windows GUI 的 R 中,并且似乎是 RStudio 及其相关产品所特有的东西。

[edit 2] 看来其他人也遇到过与其他 tcltk 库对话框类似的问题:

[edit 3] 最简单的例子是 运行ning:

library(tcltk2)
tkchooseDirectory()

在 Windows 10 系统上的 RStudio 控制台中。

所以,不幸的是,我认为没有直接的解决方案......

一个选择是提出一个 toplevel window 然后在它上面的目录对话框(你必须 运行 这里的所有东西,否则 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)