我正在尝试创建一个带有一系列按钮的Fyne垂直框,但无法找出基本机制。我认为这是一个关于围棋的问题,而不是一个关于fne的问题,我不太了解围棋。
下面是一个最小的程序来说明我的意思:package main
import (
"fmt"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Button List")
btn0 := widget.NewButton("button 0", func() {
fmt.Println("Pressed 0")
})
btn1 := widget.NewButton("button 1", func() {
fmt.Println("Pressed 1")
})
btns := []*widget.Button{btn0, btn1}
vbox := container.NewVBox(
// does work
btns[0],
btns[1],
// doesn't work
// btns...,
)
w.SetContent(
vbox,
)
w.ShowAndRun()
}
我的理解是,参数btns...
应该产生与参数btn[0], btn[1]
列表相同的效果,但显然没有。如果我注释掉
btn[0],
btn[1],
并取消
行的注释btns...
我得到错误信息
不能使用btns (type []*"fyne.io/fyne/v2/widget".Button)作为类型[] fyne。CanvasObject作为容器的参数。NewVBox
那么,我的新手问题:
- 这里发生了什么,即,为什么
btns...
不起作用? - 我应该用什么作为
NewVBox
的参数?
要做你想做的事情,你需要修改*widget.Button
的切片为fyne.CanvasObject的切片。
在像这样展开到可变形参中时,类型必须与可变形参所期望的完全匹配。这意味着类型必须是接口本身,而不是实现接口的类型。
在你的例子中,可以这样做:
btns := []fyne.CanvasObject{btn0, btn1}
vbox := container.NewVBox(btns...)