首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个应用程序通过Rscript启动后,如何将R Tk窗口带到前台?

从另一个应用程序通过Rscript启动后,如何将R Tk窗口带到前台?
EN

Stack Overflow用户
提问于 2012-03-09 01:47:15
回答 3查看 2.7K关注 0票数 4

我有一个大致如下的脚本:

代码语言:javascript
复制
if (!require(tcltk2)) {install.packages('tcltk2', repos="http://cran.us.r-project.org"); require(tcltk2)}

base <- NULL
done <- tclVar(0)

quasitelgui <- function(inputfile = NULL)
{
    base <- tktoplevel()
    tkwm.title(base, "QuasiTel")

    # Files
    file.frm <- tkframe(base, borderwidth=2)
    datafile.lbl <- tklabel(file.frm, text="Data")
    datafile.entry <- tkentry(file.frm, state="readonly")
    datafile.btn <- tkbutton(file.frm, text="Browse...")
    tkgrid(datafile.lbl, datafile.entry, datafile.btn)
    tkgrid.configure(datafile.lbl, sticky="e")
    tkgrid.configure(datafile.entry, sticky="ew", padx=1)
    tkgrid.columnconfigure(file.frm, 1, weight=1)
    tkgrid(file.frm)
    tkgrid.configure(file.frm, sticky="ew")

    # Main
    main.frm <- tkframe(base, borderwidth=2)
    g1.lbl <- tklabel(main.frm, text="Group 1")
    g2.lbl <- tklabel(main.frm, text="Group 2")
    tkgrid(g1.lbl, g2.lbl)

    q.btn <- tkbutton(bott.frm, text="Quit", command=function() tclvalue(done) <- 1)
    tkbind(base,"<Destroy>", function() tclvalue(done) <- 2)
    tkgrid(filter.lbl, columnspan=2)
    tkgrid(filter.entry)
    tkgrid(ok.btn, q.btn)
    tkgrid.configure(ok.btn, q.btn, padx=1)
    tkgrid(bott.frm)
    tkgrid.columnconfigure(base, 0, weight=1)

    if (length(inputfile) > 0) { datafile.open(inputfile) }
}

cmd.args <- commandArgs(trailingOnly=TRUE)

if (length(cmd.args) > 0) {
    quasitelgui(gsub("\\\\", "/", cmd.args[1]))
} else {
    quasitelgui()
}

tkfocus(base)
tkwait.variable(done)
tkdestroy(base)

我从另一个GUI通过rscript运行它。我希望窗口在启动时能抓住焦点。Tkfocus不会这么做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-09 05:12:14

不是聚焦,而是提升:

代码语言:javascript
复制
> library(tcltk)
Loading Tcl/Tk interface ... done
> w1 <- tktoplevel()
> w2 <- tktoplevel()
> tkraise(w1)
票数 4
EN

Stack Overflow用户

发布于 2012-03-09 22:40:27

我认为jverzani是正确的,许多(如果不是所有当代的)图形用户界面系统(我的意思是,操作系统/桌面级别,而不是图形用户界面工具包)阻止focus stealing。一个想要获取焦点的新进程是一个完美的窃取焦点的尝试,所以我倾向于认为,如果您的脚本Matt在另一个进程中运行,您不能期望它真正获取焦点。有一些系统相关的方法可以将用户的注意力吸引到特定的窗口上,但我怀疑Tk是否直接支持这些方法。

票数 0
EN

Stack Overflow用户

发布于 2017-10-30 19:08:39

在MS Windows中,您可以按照以下方式操作:

代码语言:javascript
复制
info_sys <- Sys.info() # sniff the O.S.

if (info_sys['sysname'] == 'Windows') { # MS Windows trick
 shell("powershell -command [void] [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') ; [Microsoft.VisualBasic.Interaction]::AppActivate('The title of your window') ")
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9622287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档