当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R getGraphicsEvent 等待来自图形窗口的鼠标或键盘事件


R语言 getGraphicsEvent 位于 grDevices 包(package)。

说明

该函数以鼠标或键盘事件的形式等待来自图形窗口的输入。

用法

getGraphicsEvent(prompt = "Waiting for input",
                 onMouseDown = NULL, onMouseMove = NULL,
                 onMouseUp = NULL, onKeybd = NULL,
                 onIdle = NULL,
                 consolePrompt = prompt)
setGraphicsEventHandlers(which = dev.cur(), ...)
getGraphicsEventEnv(which = dev.cur())
setGraphicsEventEnv(which = dev.cur(), env)

参数

prompt

在图形窗口中向用户显示提示

onMouseDown

响应鼠标点击的函数

onMouseMove

响应鼠标移动的函数

onMouseUp

响应鼠标按钮释放的函数

onKeybd

响应按键的函数

onIdle

当没有事件待处理时调用的函数

consolePrompt

在控制台中向用户显示提示

which

该调用适用于哪个图形设备?

...

包括要放置在事件环境中的处理程序的项目

env

用作事件环境的环境

细节

这些函数允许用户从某些图形设备(目前仅windows(),X11(type = "Xlib")X11(type = "cairo")底座上的屏幕显示R)。可以安装事件处理程序来响应涉及鼠标或键盘的事件。

各函数的关系如下。如果前六个参数中的任何一个getGraphicsEvent给出,然后它在调用中使用这些setGraphicsEventHandlers替换当前设备中任何现有的处理程序。这是为了与 2.12.0 之前的版本兼容R版本。当前设置事件处理程序的常规方法是使用setGraphicsEventHandlers或者setGraphicsEventEnv在一个或多个图形设备上,然后使用getGraphicsEvent()不带参数来检索事件数据。getGraphicsEventEnv()可用于保存事件环境以供以后使用。

getGraphicsEvent 中的参数名称很特殊。处理事件时,图形系统将在事件环境中查找名为 onMouseDownonMouseMoveonMouseUponKeybdonIdle 的函数,并将它们用作事件处理程序。它将使用 prompt 作为图形设备上的标签。另外两个特殊名称是 which ,它将标识图形设备,以及 result ,其中最后一个事件处理程序的结果将在 getGraphicsEvent() 返回之前存储在其中。

鼠标事件处理程序应该是带有标题 function(buttons, x, y) 的函数。坐标 xy 将被传递到设备独立坐标中的鼠标事件处理程序(即窗口的左下角是 (0,0) ,右上角是 (1,1) )。 buttons 参数将是一个向量,列出事件发生时按下的按钮,其中 0 表示左侧,1 表示中间,2 表示右侧。

键盘事件处理程序应该是带有标题 function(key) 的函数。与按键相对应的单个元素字符向量将传递给此处理程序。 Shift 和其他修饰键将被处理,因此 shift-a 将作为 "A" 传递。以下特殊键也可以传递给处理程序:

  • 控制键,作为 "Ctrl-A" 等传递。

  • 导航键,作为其中之一传递
    "Left", "Up", "Right", "Down", "PgUp", "PgDn", "End", "Home"

  • 编辑键,作为 "Ins", "Del" 之一传递

  • 函数键,作为 "F1", "F2", ... 之一传递

空闲事件处理程序onIdle 应该是一个不带参数的函数。如果函数未定义或 NULL ,那么 R 通常会调用一个系统函数,该函数(有效地)等待下一个事件出现在文件句柄上。否则,只要发现图形设备的事件队列为空,即处于无限循环中,就会调用空闲事件处理程序。此函数旨在允许动画响应用户输入,并且可能会占用 CPU 资源。目前,onIdle 仅针对X11() 设备实现。

请注意,不建议在空闲处理程序中调用 Sys.sleep() - Sys.sleep() 会删除挂起的图形事件,以便允许用户在执行时移动、关闭或调整窗口大小。 Sys.sleep() 期间发生的鼠标和键盘事件等事件会丢失,并且当前不会触发通过 getGraphicsEventsetGraphicsEventHandlers 注册的事件处理程序。

事件处理程序是标准 R 函数,并且将像从事件环境调用一样执行。

在交互式会话中,事件将被处理,直到

  • 事件处理程序之一返回非 NULL 值,该值将作为 getGraphicsEvent 的值返回,或

  • 用户从控制台中断该函数。

以交互方式运行时,getGraphicsEvent 返回从事件处理程序之一返回的非 NULL 值。在非交互式会话中,getGraphicsEvent 将立即返回NULL。如果用户关闭最后一个具有图形处理程序的窗口,它还将返回NULL

getGraphicsEventEnv 返回图形设备的当前事件环境,如果未设置,则返回 NULL

setGraphicsEventEnvsetGraphicsEventHandlers 返回图形设备的先前事件环境。

例子

# This currently only works on the Windows, X11(type = "Xlib"), and
# X11(type = "cairo") screen devices...
## Not run: 
savepar <- par(ask = FALSE)
dragplot <- function(..., xlim = NULL, ylim = NULL, xaxs = "r", yaxs = "r") {
    plot(..., xlim = xlim, ylim = ylim, xaxs = xaxs, yaxs = yaxs)
    startx <- NULL
    starty <- NULL
    prevx <- NULL
    prevy <- NULL
    usr <- NULL

    devset <- function()
        if (dev.cur() != eventEnv$which) dev.set(eventEnv$which)

    dragmousedown <- function(buttons, x, y) {
        startx <<- x
        starty <<- y
        prevx <<- 0
        prevy <<- 0
        devset()
        usr <<- par("usr")
        eventEnv$onMouseMove <- dragmousemove
        NULL
    }

    dragmousemove <- function(buttons, x, y) {
        devset()
        deltax <- diff(grconvertX(c(startx, x), "ndc", "user"))
        deltay <- diff(grconvertY(c(starty, y), "ndc", "user"))
	if (abs(deltax-prevx) + abs(deltay-prevy) > 0) {
	    plot(..., xlim = usr[1:2]-deltax, xaxs = "i",
		      ylim = usr[3:4]-deltay, yaxs = "i")
	    prevx <<- deltax
	    prevy <<- deltay
	}
        NULL
    }

    mouseup <- function(buttons, x, y) {
    	eventEnv$onMouseMove <- NULL
    }	

    keydown <- function(key) {
        if (key == "q") return(invisible(1))
        eventEnv$onMouseMove <- NULL
        NULL
    }

    setGraphicsEventHandlers(prompt = "Click and drag, hit q to quit",
                     onMouseDown = dragmousedown,
                     onMouseUp = mouseup,
                     onKeybd = keydown)
    eventEnv <- getGraphicsEventEnv()
}

dragplot(rnorm(1000), rnorm(1000))
getGraphicsEvent()
par(savepar)

## End(Not run)

作者

Duncan Murdoch

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Wait for a mouse or keyboard event from a graphics window。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。