【问题标题】:How Do I Stop An R gWidgets Script Exiting如何停止 R gWidgets 脚本退出
【发布时间】:2011-12-13 17:22:15
【问题描述】:

我正在使用 gWidgets 工具包在使用 Rscript 运行的 R 脚本中创建 GUI。

创建 GUI 后,脚本退出。

我可以在脚本末尾使用 while(TRUE){Sys.sleep(9999)} 循环来防止这种情况发生,但这似乎很老套。

有没有更好的方法告诉 R 仅在关闭 GUI 时退出,或者至少在构建 GUI 后进入 REPL?

【问题讨论】:

标签: r read-eval-print-loop gwidgets


【解决方案1】:

您也许可以根据自己的需要调整 gbasicdialog。此构造函数创建一个模态容器,您可以从中生成其他窗口。这是一个例子:

library(gWidgets)
options(guiToolkit="RGtk2")
require(fortunes)                       # just for fun

hold_it <- gbasicdialog(do.buttons=FALSE)
b <- gbutton("click me for a message", cont=hold_it, handler=function(h,...) {
  gmessage(paste(fortune(), collapse="\n"), parent=hold_it)
})
visible(hold_it, TRUE)

同样适用于“tcltk”工具包。它几乎使用了 Greg 建议的方法。

【讨论】:

  • 非常有用和有趣....littler + gWidgets 摇滚。迫不及待地想阅读你关于 GUI 编程的新书!!
【解决方案2】:

这个主题可能已经关闭,但作为 gwidgets 的新手,我遇到过。 jverzani给出的解决方案显然是一个解决方案。我选择了另一个,没有使用任何补充对话框,只是因为我不想要一个,根本没有其他原因......

在 gwindow 的处理程序中,处理后我从环境中删除变量:

handler = function(h,...) {dispose(EDFAnalysis$w); rm(w,envir=EDFAnalysis)}

其中EDFAnalysis 是我的脚本的环境...而w 是主gwindow。

然后,在我的脚本末尾添加:

while(exists("w",EDFAnalysis)){Sys.sleep(5)}

当然,可以使用小于 5 或​​更大的值。就我而言,5 s 就足够了,而且不是永远... :-)

【讨论】:

    【解决方案3】:

    处理此问题的标准方法是请求用户输入以继续。这条单线就可以解决问题。

    编辑:readline 只能在交互式使用下工作,所以我将它换成了 scan,这有点不太漂亮。

    pause_for_input <- function()
    {
      message("Press ENTER to continue")
      invisible(scan(n = 0, quiet = TRUE))
    }
    

    所以你的脚本应该看起来像

    #Create you GUI
    #Whatever else
    pause_for_input()
    

    【讨论】:

    • 嗯。实际上,在阅读readline 的文档后,我不确定是否可以使用littler。有人可以检查一下吗?
    【解决方案4】:

    如果您使用的是tcltk而不是 gWidgets,那么您可以使用tcltk 中的tkwait.window 函数来告诉脚本等到gui 窗口消失在继续脚本之前。

    【讨论】:

    • 我正在使用 Gtk 包,但这只是因为熟悉。
    • Gtk 是否依赖于 tcltk?如果是这样,则可能适用相同的解决方案,否则请查看 Gtk 是否具有在 gui 中等待事件的类似功能。
    【解决方案5】:

    我发现一个好方法是使用 RGtk2 库中的gtkMain() 函数。这只是保持主循环运行直到调用gtkMainQuit()

    【讨论】:

    • 你会如何使用它? (文档不是那么健谈)
    【解决方案6】:

    为了完整性:ozjimbob 已经给出了最“干净”的方法的答案。 ffeschet 的答案对我不起作用,无论是在 Unix 上还是在 Windows 上。

    因此,在主“启动”脚本中,您至少必须有以下条目:

    options("guiToolkit"="RGtk2")
    library(RGtk2)
    library(gWidgets)
    library(gWidgetsRGtk2)
    StartMyGUI()
    gtkMain()
    

    在“子”进程“StartMyGUI()”中,您的代码可以例如看起来像这样:

    StartMyGUI <- function(handler=function(h,...) {
            dispose(h$obj)
        }) {
    
    window <- gwindow("Hello")
    group <- ggroup(container = window)
    glabel("Hello World!", container=group, expand=TRUE)
    
    # A group to organize the buttons
    button.group <- ggroup(container = group)
    # Push buttons to right
    addSpring(button.group)
    gbutton("OK", handler=handler, container=button.group)
    gbutton("Cancel", handler = function(h,...) {
                dispose(window)
                gtkMainQuit()
            },
            container=button.group)
    
    return()
    } 
    

    只有当用户点击“取消”按钮时,gtkMainQuit() 才会被调用,它会在主“启动”脚本中退出母进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2018-06-28
      • 2023-04-11
      相关资源
      最近更新 更多