gWidgets2中gbutton切换异常:需点击两次,期望一次点击切换
解决gWidgets2按钮点击两次才切换的问题
我帮你分析下,你遇到的点击两次才切换的问题,根源是初始的state变量值和按钮的初始文本对应关系不匹配,再加上依赖全局变量可能带来的小问题。试试下面两种更可靠的解决方法:
方法1:调整初始状态并使用事件对象引用
把初始state设为TRUE(因为按钮一开始显示"go",和代码里state为TRUE时显示"go"的逻辑匹配),同时在事件处理器里用h$obj获取按钮对象,避免全局变量的潜在问题:
library(gWidgets2) library(gWidgets2RGtk2) options(guiToolkit="RGtk2") w <- gwindow() g1 <- ggroup(horizontal=TRUE, cont=w) icon <- gbutton('go', container = g1) state <- TRUE # 让初始状态和按钮文本匹配 changeState <- function(h,...) { btn <- h$obj if(state) { svalue(btn) <- "stop" } else { svalue(btn) <- "go" } state <<- !state } addHandlerClicked(icon, handler=changeState)
方法2:给按钮附加自定义状态(更优雅,无全局变量)
这种方法不需要全局变量,直接把切换状态绑定到按钮对象上,代码更干净健壮:
library(gWidgets2) library(gWidgets2RGtk2) options(guiToolkit="RGtk2") w <- gwindow() g1 <- ggroup(horizontal=TRUE, cont=w) icon <- gbutton('go', container = g1) icon$toggle_state <- FALSE # 给按钮添加一个自定义的状态属性 changeState <- function(h,...) { btn <- h$obj # 先切换状态 btn$toggle_state <- !btn$toggle_state # 根据新状态设置按钮文本 svalue(btn) <- if(btn$toggle_state) "stop" else "go" } addHandlerClicked(icon, handler=changeState)
简单说下原理:原来的代码里,初始state=FALSE但按钮显示"go",这和你的判断逻辑(state为TRUE时显示"go")是矛盾的,导致第一次点击的效果不符合预期。调整初始状态或者颠倒文本设置的逻辑,就能让一次点击就完成"go"和"stop"的切换啦。
内容的提问来源于stack exchange,提问作者Ekanshu
相关产品推荐
相关产品推荐

