3

我目前正在编写我的第一个闪亮的应用程序,并且在使用一些更微妙的用户界面功能时遇到了一些困难。我正在使用 tcltk 库导入一些简单的对话框,供用户选择本地目录和文件(应用程序只会在本地运行,因此我不会使用闪亮的 fileInput 命令)。这还具有不像 choose.dir 命令那样特定于操作系统的优点(请参阅R Windows OS choose.dir() 文件选择器不会在工作目录打开以获取更多讨论)。

但是,当我在 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 库对话框类似的问题:R 中的 MessageBox

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

library(tcltk2)
tkchooseDirectory()

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

4

2 回答 2

0

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

一种选择是打开一个toplevel窗口,然后打开它上面的目录对话框(您必须在此处一次运行所有内容,否则root再次在后台运行)。

library(tcltk2)

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

另一种选择是使用gWidgets.

dir_ <- gWidgets::gfile(type = "selectdir")
于 2018-03-09T19:26:36.057 回答
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)
于 2019-08-23T19:29:49.333 回答