go fyne简单的圆钢重量计算器

2021-12-04  本文已影响0人  scckele

理想图:

image.png
实际图:
image.png
梦想图:
image.png
新建项目:Material weight calculator

main.go

package main

import (
    "fmt"
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "github.com/flopp/go-findfont"
    "os"
    "strings"
)
func main(){
    //密度 长度 外径 内径 千克 吨
    //Density length outer_diameter inner_diameter kg ton


    //新建app项目
    calculator:=app.New()

    //设置窗口名称 大小
    window :=calculator.NewWindow("Material weight calculator")
    window.Resize(fyne.NewSize(400, 180))

    calculator(window)

    //运行
    window.ShowAndRun()
}

//初始化字体
func init() {
    fontPaths := findfont.List()
    for _, path := range fontPaths {
        //fmt.Println(path)
        //楷体:simkai.ttf
        //黑体:simhei.ttf
        if strings.Contains(path, "simhei.ttf") {
            _ = os.Setenv("FYNE_FONT", path)
            break
        }
    }
    fmt.Println("=============")
}

calculator.go

package main

import (
    "fmt"
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/data/binding"
    "fyne.io/fyne/v2/layout"
    "fyne.io/fyne/v2/widget"
    "math"
    "strconv"
)
type data struct{
    d, l, o, i, w, pi float64
}

func Weight(s *data) (float64, error) {
    s.o=math.Pow(s.o, 2)
    s.i= math.Pow(s.i, 2)
    s.pi=3.14
    s.w=s.pi*(s.o-s.i)*s.l*s.d*10e-6
    fmt.Println("weight :",s.w)
    return s.w, nil
}

func Calculator(w fyne.Window) {
    //组件区
    //输入框组件
    dt:=widget.NewLabel("密度")
    d:=widget.NewEntry()
    d.SetPlaceHolder("g/cm³")


    lt:=widget.NewLabel("长度")
    l := widget.NewEntry()
    l.SetPlaceHolder("mm")


    ot:=widget.NewLabel("外径")
    o := widget.NewEntry()
    o.SetPlaceHolder("mm")


    it:=widget.NewLabel("内径")
    i := widget.NewEntry()
    i.SetPlaceHolder("mm")

    outt:=widget.NewLabel("结果:")
    //green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
    out:=widget.NewEntry()

    //单位
    //vv := widget.NewLabel("g/cm³")
    //mm := widget.NewLabel("mm")
    //kg := widget.NewLabel("kg")


    //按钮组件
    button:=container.NewCenter(
        widget.NewButton("求值", func() {
            D, _ :=strconv.ParseFloat(d.Text,64)
            L, _ :=strconv.ParseFloat(l.Text,64)
            I, _ :=strconv.ParseFloat(i.Text,64)
            O, _ :=strconv.ParseFloat(o.Text,64)
            J := &data{D, L, O/2, I/2, 0, 3.14}
            f, _ := Weight(J)
            str := binding.NewString()
            _ = str.Set(strconv.FormatFloat(f, 'f', 5, 32))
            out.Bind(str)
        }))

    //容器布局区
    form1:=container.New(layout.NewFormLayout(),dt,d,ot,o)
    form2:=container.New(layout.NewFormLayout(),lt,l,it,i)
    inputdata:=container.New(layout.NewGridLayout(2),form1,form2)

    form3:=container.New(layout.NewFormLayout(),outt,out)
    content := container.NewVBox(inputdata,button,form3)

    //写入窗口
    w.SetContent(content)
}

打包成exe

fyne package -os windows -icon logo.png

2023年01月12日:
不要使用单独的go run main.go运行,会报错

目录结构

image.png

总结

主要熟悉标签组件(文本标签,带数据标签),输入框组件(NewEntry设置默认值,数据绑定),按钮组件(点击事件),布局控件(form,VBox,HBox,网格布局),容器相关方法(new,add)的使用。

上一篇下一篇

猜你喜欢

热点阅读