使用 OOP 风格的 fyne 小部件

我想将一些标准小部件合并到一个自定义小部件中。如果将所有小部件字段放入一个容器中,我就可以做到这一点,如下所示:


package main


import (

    "fmt"


    "fyne.io/fyne"

    "fyne.io/fyne/app"

    "fyne.io/fyne/layout"

    "fyne.io/fyne/widget"

)


type MyWidget struct {

    widget.BaseWidget


    Cont      *fyne.Container

    text      *widget.Label

    statusBar *widget.Label

    b1        *widget.Button

    b2        *widget.Button


    count uint

}


func (t *MyWidget) Init() {

    t.b1 = widget.NewButton("1", func() {

        t.text.SetText("1")

        t.count++

        t.statusBar.SetText(fmt.Sprint(t.count))

    })

    t.b2 = widget.NewButton("2", func() { t.text.SetText("2") })

    t.statusBar = widget.NewLabel("status")

    bottom := fyne.NewContainerWithLayout(layout.NewCenterLayout(), t.statusBar)

    t.text = widget.NewLabelWithStyle("0", fyne.TextAlignTrailing, fyne.TextStyle{Bold: true})

    t.Cont = fyne.NewContainerWithLayout(layout.NewBorderLayout(nil, bottom, nil, nil),

        bottom, fyne.NewContainerWithLayout(

            layout.NewGridLayoutWithRows(4),

            fyne.NewContainerWithLayout(layout.NewCenterLayout(), t.text),

            layout.NewSpacer(),

            fyne.NewContainerWithLayout(layout.NewGridLayout(2), t.b1, t.b2),

            layout.NewSpacer(),

        ))

}


func Load() *MyWidget {

    obj := &MyWidget{BaseWidget: widget.BaseWidget{}}

    obj.Init()

    return obj

}


func main() {

    f := app.New()

    w := f.NewWindow("")

    obj := Load()

    w.SetContent(obj.Cont)

    w.ShowAndRun()

}

我曾经使用 GUI 工具包,其中顶部小部件有机会设置用于容纳子小部件的容器。是否可以在不导出内部容器的情况下使用 Fyne 获得解决方案?


一只甜甜圈
浏览 84回答 1
1回答

慕的地8271018

我建议您考虑使用容器。(即“fyne.NewContainerWithLayout(myLayout, widgets...)”。Fyne 中的小部件和容器是不同的。Widget是对逻辑的封装,通过渲染器来显示,Container用于对多个Widget进行分组。有一些小部件可以弥补这一差距,例如 widget.Box 和 widget.Group,但它们通常会公开容器,或重新导出容器方法。通常,您不会创建一个小部件树,而是创建一个在循环中包含小部件的容器树。
打开App,查看更多内容
随时随地看视频慕课网APP