我正在开发GUI应用程序,该应用程序需要动态添加和删除GUI元素,我想知道是否有办法从golang-fyne容器中删除元素。在下面的示例代码中,我创建了容器并动态添加元素,现在我希望能够删除这些元素,而不是隐藏它们。(我尝试过的一种"解决方案"是创建新容器,填充它并重置窗口内容,但它会闪烁,我不喜欢它(。
package main
import (
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/canvas"
"fyne.io/fyne/layout"
"fyne.io/fyne/widget"
"image/color"
"strconv"
"time"
)
type Input struct {
Id string
ThumbUrl string
}
func (input Input) GetContainer() *fyne.Container {
thumbImg := canvas.NewText("There", color.White)
group := widget.NewGroup(input.Id, thumbImg)
ret := fyne.NewContainerWithLayout(layout.NewVBoxLayout(), group)
return ret
}
type Segment struct {
Id string
Inputs []Input
InputsColumn *fyne.Container
}
func (seg *Segment) GetSegment() fyne.CanvasObject {
first := true
var inputsColumn *fyne.Container
for _, in := range seg.Inputs {
if first {
inputsColumn = fyne.NewContainerWithLayout(layout.NewGridLayout(1), in.GetContainer())
first = false
} else {
inputsColumn.AddObject(in.GetContainer())
}
}
seg.InputsColumn = inputsColumn
ret := fyne.NewContainerWithLayout(layout.NewHBoxLayout(), seg.InputsColumn)
return ret
}
func (seg *Segment) AddInput(input Input) {
seg.InputsColumn.AddObject(input.GetContainer())
}
var (
segment1 = Segment{
Id: "VSEG_1",
Inputs: []Input{
{
Id: "VIN_HDMI1",
ThumbUrl: "thumbIN.png",
},
{
Id: "VIN_SDI1",
ThumbUrl: "thumbIN.png",
},
{
Id: "VIN_SDVOE1",
ThumbUrl: "thumbIN.png",
},
},
}
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Container")
segmentLayout := segment1.GetSegment()
lay := fyne.NewContainerWithLayout(layout.NewHBoxLayout(), segmentLayout)
myWindow.SetContent(lay)
go changeContent(myWindow)
myWindow.ShowAndRun()
}
func changeContent(win fyne.Window) {
for i := 0; i < 3; i++ {
time.Sleep(time.Second * 2)
newInput := Input{
Id: "Added_ID_" + strconv.Itoa(i),
ThumbUrl: "thumbIN.png",
}
segment1.AddInput(newInput)
segment1.InputsColumn.Refresh()
}
for i := 0; i < 3; i++ {
time.Sleep(time.Second * 2)
// Remove the objects instead of hiding
segment1.InputsColumn.Objects[i].Hide()
segment1.InputsColumn.Refresh()
}
segment1.InputsColumn.Refresh()
}
使用fyne.Container
,您可以直接更改Objects
字段。例如,您可以使用以下方法删除添加的第一个项目:
l1 := widget.NewLabel("first")
l2 := widget.NewLabel("second")
c := fyne.NewContainer(l1, l2)
log.Println(len(c.Objects)) // 2
c.Objects = c.Objects[:1]
c.Refresh() // ensures UI reflects the change
log.Println(len(c.Objects)) // 1