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

时间:2018-03-09 12:18:08

标签: r shiny rstudio tcltk

我目前正在编写我的第一个闪亮的应用程序,我在使用一些更微妙的用户界面功能时遇到了一些困难。我正在使用tcltk库导入一些简单的对话框供用户选择本地目录和文件(应用程序只能在本地运行,所以我不会使用闪亮的文件输入命令)。这也有一个优点,就是不像select.dir命令那样具有操作系统特性(有关详细讨论,请参阅R Windows OS choose.dir() File chooser won't open at working directory)。

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

对于我使用RStudio控制台的开发工作,这是一个小麻烦但是,鉴于闪亮的应用程序最终将被传递给客户端(一个州机构),我真的宁愿不加重隐藏对话框通过申请。

感谢您提供任何帮助!

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

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

[编辑3]最简单的最简单示例是运行:

library(tcltk2)
tkchooseDirectory()

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

2 个答案:

答案 0 :(得分:0)

所以,我不认为有可能直接解决这个问题......

一个选项是引发toplevel窗口,然后在其上面显示目录对话框(您必须在此处一次运行所有内容,否则root将再次出现在后台)。

library(tcltk2)

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

另一种选择是使用gWidgets

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

答案 1 :(得分:0)

我发现最好在打开对话框之前短暂使用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)