我正在使用GTK bindings for Go。
尝试将gtk.RadioButton
toggle
信号连接到某个功能。这段代码工作正常:
...
radioButton.Connect("toggled", doRadioToggle)
func doRadioToggle() {
fmt.Println("toggled")
}
...
切换radioButton时,会调用doRadioToggle - Good。
但我想连接一个带参数的函数,例如:
func doRadioToggle(button *gtk.RadioButton) {
fmt.Println(button.GetState())
}
gtk.go.Connect()
函数具有以下签名:
func (v *Widget) Connect(s string, f interface{}, datas ...interface{})
根据我从gtkmm的了解,我尝试了这样的代码(go绑定显然大大简化了对connect()的调用)
radioButton.Connect("toggled", doRadioToggle, radioButton)
传递给connect()
- radioButton
的第三个参数 - 对应于<{p>}中的datas
gtk.Connect(s string, f interface{}, datas ...interface{})
我理解为将数据参数传递给插槽。
但是使用这段代码,doRadioToggle()处理程序永远不会被调用,我立即退出恐慌:
panic: reflect: Call using *glib.CallbackContext as type *gtk.RadioButton
我的问题:如何设置使用gtk.go.Connect()获取参数的插槽(事件处理程序)?
答案 0 :(得分:0)
文档不清楚如何直接传递其他数据;也许只是简单地使用一个闭包。
https://godoc.org/github.com/mattn/go-gtk/glib#CallbackContext
答案 1 :(得分:0)
根据GitHub上惊人的mattn的回复:
https://github.com/mattn/go-gtk/blob/master/example/demo/demo.go#L58
通过,测试和工作:
import(
...
"github.com/mattn/go-gtk/glib"
)
...
func ButtonHandler(ctx *glib.CallbackContext) {
fmt.Printf("Button Handler: %v\n", ctx.Data().(*gtk.RadioButton).GetState())
}
aRadioButton.Connect("toggled", ButtonHandler, aRadioButton)
...
datas
中的connect()
参数必须在处理程序的签名中使用*glib.CallbackContext
传递,然后在处理程序代码中使用类型断言来获取实际参数。