【问题标题】:How to add a context menu to a `gframe`?如何将上下文菜单添加到`gframe`?
【发布时间】:2014-08-26 18:55:32
【问题描述】:

如何在gWidgets2 中向gframe 添加上下文菜单?我尝试了以下构造,但似乎无法将addPopupMenu 附加到gframe

 require(gWidgets2)
 w <- gwindow("gformlayout", visible=T)
 f <- gframe("frame", horizontal=FALSE, container=w)
 l <- glabel("Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit.", container=f)
 b <- gbutton("change name", container=f, handler=function(h,...) {
     names(f) <- "new name"
 })
 lst <- list(gaction('world', handler=function(h,...) svalue(world) <- "world"), 
             gaction('continent', handler=function(h,...) svalue(world) <- "continent"), 
             gaction('country', handler=function(h,...) svalue(world) <- "country"), 
             gaction('state', handler=function(h,...) svalue(world) <- "state"))
 add3rdmousePopupMenu(f, lst)
 #addPopupMenu(f, lst)
 add3rdmousePopupMenu(b, lst)

上下文菜单很好地附加到按钮上,但没有附加到gframe。那么如何添加右键单击gframe 标签时会弹出的上下文菜单?


更新
根据答案,我尝试了以下代码:

require(gWidgets2)
f <- gframe("", cont=gwindow())
l <- glabel("label")                    # no cont argument
add3rdmousePopupMenu(l, list(a=gaction("Hi"))) 
f$block$setLabelWidget(l$block)         # the voodoo

但是当我在labelright-click 时,我只获得了用于选择文本的标准 Gtk 上下文菜单:

使用带有 Gtk+ 2.24.23 的 Ubuntu 14.04。我的sessionInfo()

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] splines   grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] reshape2_1.4         gWidgets2RGtk2_1.0-3 memoise_0.2.1        Hmisc_3.14-4         Formula_1.1-1       
 [6] survival_2.37-7      lattice_0.20-29      RGtk2_2.20.29        gWidgets2_1.0-6      digest_0.6.4        

loaded via a namespace (and not attached):
[1] cluster_1.14.4      latticeExtra_0.6-26 plyr_1.8.1          RColorBrewer_1.0-5  Rcpp_0.11.2        
[6] stringr_0.6.2       tools_3.0.2 

【问题讨论】:

  • 它与add3rdmousePopupMenu 有关系,我是根据查看源代码说的。如果有时间,我会尽力为您制定适当的解决方案。
  • 将其添加为解决方案。 HTH。

标签: r contextmenu gwidgets


【解决方案1】:

@landroni 我没有检查,但如果弹出菜单可以直接添加到 gframe 标签,我会感到惊讶。但是使用 Gtk 可以解决问题。以下是如何在标签位置放置弹出菜单:

f <- gframe("", cont=gwindow())
l <- glabel("label")                    # no cont argument
add3rdmousePopupMenu(l, list(a=gaction("Hi"))) 
f$block$setLabelWidget(l$block)         # the voodoo
l$widget$setSelectable(FALSE)           # may not be needed

至于这对用户来说是否直观,我让你决定......

【讨论】:

  • 关于可用性的好点,这给了我一个不同的 GUI 方法的想法。但是,上面的代码似乎不起作用:我仍然得到文本小部件的 GTK 标准菜单。也许应该首先将glabel 设为不可选择?
  • 举个例子,如果你这样做l2 &lt;- glabel("label", cont=gwindow()); add3rdmousePopupMenu(l2, list(a=gaction("Hi")))glabel 上的 c-menu 将不起作用..
  • @landroni 糟糕,应该是add3rdmousePopupMenu。 (我需要给add3rdMousePopupMenu 起一个别名,因为骆驼外壳看起来更自然。)这适用于linux。如果此更改不起作用,请告诉我。
  • 奇怪。在 Linux 上,我也没有收到带有已发布代码的 c 菜单(即使在修复错字并使用正确的 add3rdmousePopupMenu 时也是如此)。
  • l$widget$setSelectable(FALSE) 应该这样做。
【解决方案2】:

一个弹出菜单在鼠标点击后“弹出”一个菜单,通常是鼠标右键。 在 gWidgets 中实现的是函数 1add3rdmousepopupmenu(the one you want) andaddpopupmenu`,用于在任何点击时弹出一个窗口。使用 gmenu 的语法指定菜单。

一个简单的例子是这样的:

> w <- gwindow("Click on button to change")
> g <- ggroup(cont = w) # abbreviate container
> glabel("Hello ", cont=g)
guiWidget of type: gLabelRGtk for toolkit: guiWidgetsToolkitRGtk2
> world <- gbutton("world", cont=g)
> lst <- list()
> lst$world$handler <- function(h,...) svalue(world) <- "world"
> lst$continent$handler <- function(h,...) svalue(world) <- "continent"
> lst$country$handler <- function(h,...) svalue(world) <- "country"
> lst$state$handler <- function(h,...) svalue(world) <- "state"
> add3rdmousepopupmenu(world, lst)

我有机会对此进行测试,它适用于我在 Windows 上使用 64 位 R 3.1.1 的 gWidgetsgWidgets2gWidgetsRGtk2。您可以找到add3rdmousepopupmenu 处理程序的文档

  1. gWidgets2手册here
  2. 通过键入 ??add3rdmousepopupmenu 并加载 gWidgets2
  3. recently updated document by the author John Verzani 中给出了gWidgets API 的示例,它不仅适用于gWdigets2,还适用于他的gWidgetsgWidgetsQtgWidgetsRGtk2gWidgetsrJava 包,它们调用了 gWdigets API
  4. 在 CRAN 上的 gWidgets2 vignette

【讨论】:

  • 我试过这个,但add3rdmousePopupMenu(world, lst) 和`addPopupMenu(world, lst)` 在使用gWidgets2 时都会导致Error in UseMethod("getBlock") : no applicable method for 'getBlock' applied to an object of class "function"。不知道出了什么问题..
  • @landroni 我会尽力帮助你。您应该将其添加到问题中,或者将它们分成两个不同的问题。一旦我认为我知道导致您的错误的原因,我会立即更新我的解决方案。请包含导致该错误的确切代码。
  • 我无法复制错误,也没有看到任何与之相关的搜索结果...你能举一个可复制的例子吗?
  • 我只是运行require(gWidgets2),然后是您发布的代码,而不是最后一行:add3rdmousePopupMenu(world, lst)
  • 感谢@NerdLife。文档并不总是正确的,但我很乐意尝试更新。我需要更清楚gWidgetsgWidgets2 之间的区别。大多数事情都是相似的,但是有足够的变化来保证额外的2gWidgets 的任何文档都是旧文档,即使该软件包最近已更新。
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
相关资源
最近更新 更多