fyne

fyne框架:https://github.com/fyne-io/fyne

对应文档:https://developer.fyne.io/

要使用 Fyne 开发应用程序,您需要 Go 版本 1.14 或更高版本、C 编译器和系统的开发工具(也即是gcc

  • 相应第三方库
    1. $ go get fyne.io/fyne/v2 //fyne核心库

1. 常用函数

1.1 窗口标题title

设置窗口标题

func (App)NewWindow(title string) Window 绑定在app一个方法

  1. package main
  2. import (
  3. "fyne.io/fyne/v2/app"
  4. )
  5. func main() {
  6. //创建一个app
  7. a:=app.New()
  8. //创建一个窗口
  9. w:=a.NewWindow("my frist title")
  10. //运行
  11. w.ShowAndRun()
  12. }

1657444873467.png

窗口大小可以随意调解

1.2 修改窗口默认大小Resize

修改默认窗口大小,只是修改了初始显示窗口大小,任然可以缩放大小

func (window)Resize(fyne.NewSize(w,h)) w—-width h——height

  1. package main
  2. import (
  3. "fyne.io/fyne/v2"
  4. "fyne.io/fyne/v2/app"
  5. )
  6. func main() {
  7. //创建一个app
  8. a:=app.New()
  9. //创建一个window
  10. w:=a.NewWindow("my title")
  11. //设置初始窗口大小
  12. w.Resize(fyne.NewSize(600,600))
  13. //运行
  14. w.ShowAndRun()
  15. }

1657445837088.png

1.3 组件 微件

1.3.1 标签 label text

创建一个小装置 微件

将创建的小装置添加到窗口

w.SetContent(widget.NewLabel("title label"))

  1. package main
  2. import (
  3. "fyne.io/fyne/v2"
  4. "fyne.io/fyne/v2/app"
  5. "fyne.io/fyne/v2/widget"
  6. )
  7. func main() {
  8. //创建一个app
  9. a:=app.New()
  10. //创建一个window
  11. w := a.NewWindow("my title")
  12. //修改初始显示窗口大小
  13. w.Resize(fyne.NewSize(300,300))
  14. //widget:组件
  15. //新建一个标签组件
  16. w.SetContent(widget.NewLabel("title label"))
  17. //运行
  18. w.ShowAndRun()
  19. }

1657446687175.png

1.3.2 按钮button

  1. //创建一个按钮button 第一个参数是button名字 第二个是点击就会对应执行的函数
  2. button:=widget.NewButton("my name is button", func() {
  3. })
  1. package main
  2. import (
  3. "fyne.io/fyne/v2"
  4. "fyne.io/fyne/v2/app"
  5. "fyne.io/fyne/v2/widget"
  6. )
  7. func main() {
  8. //创建一个app
  9. a:=app.New()
  10. //创建一个window
  11. w := a.NewWindow("my title")
  12. //改变初始窗口大小
  13. w.Resize(fyne.NewSize(300,300))
  14. //创建一个按钮button组件
  15. button:=widget.NewButton("my name is button", func() {
  16. fmt.Println("button is pressed")
  17. })
  18. //将装置添加到窗口
  19. w.SetContent(button)
  20. //运行
  21. w.ShowAndRun()
  22. }

1657447844243.png

点击一次就会执行一次打印

1.3.2.1 button失效 disable
  1. btn:=widget.NewButton("button", func() {
  2. fmt.Println("button is pressed")
  3. })
  4. //让button失效
  5. //btn.Disable()

1658037260708.png

1658036992899.png

1.3.2.2 给button设置背景色
  1. //按钮
  2. btn:=widget.NewButton("visit", func() {
  3. })
  4. //按钮颜色
  5. btn_color:=canvas.NewRectangle(color.NRGBA{R: 255,G: 0,B: 0,A: 255})
  6. contain:=container.New(
  7. layout.NewMaxLayout(),
  8. //第一个是颜色
  9. btn_color,
  10. //第二个是按钮
  11. btn,
  12. //添加到窗口
  13. w.SetContent(contain)

1658058336755.png

使用图片做背景色

  1. btn:=widget.NewButton("Visit", func() {
  2. })
  3. //图片来源
  4. img:=canvas.NewImageFromFile("C:/Users/jq/Desktop/bdyjy.jpg")
  5. img_contain:=container.New(layout.NewMaxLayout(),img,btn)
  6. //添加到窗口
  7. w.SetContent(contain)

1658068415578.png

1.3.3 复选框CheckBox

勾选上了 b就为真 没勾选上 b就为假

  1. func main() {
  2. //创建一个app
  3. a:=app.New()
  4. //创建一个窗口
  5. w:=a.NewWindow("my name is winodows title")
  6. //设置初始窗口打下
  7. w.Resize(fyne.NewSize(300,300))
  8. //定义一个装置 checkbox组件
  9. check:=widget.NewCheck("men", func(b bool) {
  10. //勾选上 就为true
  11. if b{
  12. fmt.Println("我是男性")
  13. check.Show()//显示
  14. }else{
  15. fmt.Println("我是女性")
  16. check.Hide()//隐藏
  17. }
  18. })
  19. //将装置添加到窗口
  20. w.SetContent(check)
  21. //运行
  22. w.ShowAndRun()
  23. }
  1. check.Hide() //可将复选框隐藏

1657448443432.png

1.3.4 超链接hyperlink

超链接 点击即可实现跳转

  1. //定义一个装置 hyperlink
  2. url,_:=url.Parse("https://www.cnblogs.com/wustjq/p/16426471.html")
  3. widgetUrl:=widget.NewHyperlink("my name is hyperlink",url)
  4. //添加至窗口
  5. w.SetContent(widgetUrl)

1657449568190.png

成功实现超链接跳转

1.3.5 图标 Icon

  1. //定义一个装置 icon组件
  2. icon:=widget.NewIcon(theme.CancelIcon())
  3. //添加到窗口
  4. w.SetContent(icon)

1657461226385.png

1.3.6 cards

  1. //定义一个组件 cards
  2. widgetCard:=widget.NewCard("title","sub title",canvas.NewCircle(color.Black))
  3. //添加到窗口
  4. w.SetContent(widgetCard)

1657466414630.png

1.3.7 多行文本 multiline

  1. multilineEntry:=widget.NewMultiLineEntry()
  2. const loren="The sunset and the solitary bird fly together, and the autumn water is the same color as the sky"
  3. multilineEntry.SetText(loren)

显示样式

  1. multilineEntry.Wrapping=fyne.TextWrapBreak //不够换行显示

1657952497047.png

  1. multilineEntry.Wrapping=fyne.TextWrapOff //一行显示

1657952642600.png

  1. multilineEntry.Wrapping=fyne.TextTruncate

1657952865610.png

1.3.8 滑动数据 slider

  1. f:=20.0
  2. data:=binding.BindFloat(&f)
  3. //滑动数据的组件 最小数据0 最大数据100 初始默认数为20
  4. slider1:=widget.NewSliderWithData(0.0,100.0,data)
  5. //根据数据创建label 将实时数据显示 如果没有这个label就看不到数据
  6. label1:=widget.NewLabelWithData(
  7. binding.FloatToString(data),
  8. )
  9. w.SetContent(container.NewVBox(slider1,label1))

1657978977916.png

1.3.9 登录提交 form

  1. label:=widget.NewLabel("")
  2. form:=widget.NewForm(
  3. widget.NewFormItem("UserName",widget.NewEntry()),
  4. widget.NewFormItem("PassWord",widget.NewPasswordEntry()),
  5. )
  6. form.OnCancel= func() {
  7. label.Text="Cancel"
  8. label.Refresh()
  9. }
  10. form.OnSubmit= func() {
  11. label.Text="Submit"
  12. label.Refresh()
  13. }
  14. w.SetContent(container.NewVBox(form,label))

1658142440689.png

1.3.10 列表list

  1. list:=widget.NewList(
  2. func() int {return 5}, //最终显示个数
  3. func() fyne.CanvasObject {return widget.NewLabel("")},
  4. func(id widget.ListItemID, object fyne.CanvasObject) {object.(*widget.Label).SetText("Hello World")}, //显示的内容
  5. )
  6. w.SetContent(list)

1658143000589.png

1.3.11 下拉框选择 select

  1. label:=widget.NewLabel("")
  2. sel:=widget.NewSelect([]string{"one","two","three","four"}, func(s string) {
  3. fmt.Printf("selected is %s\n",s)
  4. label.Text=s
  5. label.Refresh()
  6. })
  7. w.SetContent(container.NewVBox(sel,label))

1658150606378.png

1.4 画布

1.4.1 修改文本颜色 Change color

显示有颜色的字

  1. func main() {
  2. //创建一个app
  3. a:=app.New()
  4. //创建一个窗口
  5. w:=a.NewWindow("my name is winodows title")
  6. //设置默认窗口打下
  7. w.Resize(fyne.NewSize(300,300))
  8. //画布里面创建文字
  9. canvasText:=canvas.NewText("canvas text",color.NRGBA{B: 255,G: 0,R: 0,A: 255})
  10. //设置文字字体大小
  11. canvasText.TextSize=30
  12. //添加到窗口
  13. w.SetContent(canvasText)
  14. //运行
  15. w.ShowAndRun()
  16. }

1657450201035.png

1.4.2 图片展示 image

  1. //画布里面创建图片
  2. img:=canvas.NewImageFromFile("C:/Users/jq/Desktop/1.jpg")
  3. //添加到窗口
  4. w.SetContent(img)

1657452531460.png

1.4.3 圆 circle

  1. //画布里面创建圆
  2. canvasCircle:=canvas.NewCircle(color.NRGBA{B: 255,G: 0,R: 0,A: 255})
  3. //边框颜色 边框线宽
  4. canvasCircle.StrokeColor=color.Black
  5. canvasCircle.StrokeWidth=3
  6. //添加到窗口
  7. w.SetContent(canvasCircle)

1657459154349.png

1.4.4 矩形 recttangle

  1. //画布里面创建矩形
  2. canvasRect:=canvas.NewRectangle(color.NRGBA{B: 255,G: 0,R: 0,A: 255})
  3. //边框颜色 边框线宽
  4. canvasRect.StrokeColor=color.Black
  5. canvasRect.StrokeWidth=3
  6. //添加到窗口
  7. w.SetContent(canvasRect)

1657460226846.png

1.4.5 线 line

  1. //画布里面创建线
  2. canvasLine:=canvas.NewLine(color.NRGBA{B: 255,G: 0,R: 0,A: 255})
  3. //边框颜色 边框线宽
  4. canvasLine.StrokeColor=color.Black
  5. canvasLine.StrokeWidth=3

1657460807470.png

1.4.6 颜色梯度变化gradient

  1. //水平渐变
  2. canvas.NewHorizontalGradient(color.White,color.Black)
  3. //数值渐变
  4. canvas.NewVerticalGradient(color.White,color.Black)
  5. //以中心圆渐变
  6. canvas.NewRadialGradient(color.White,color.Black)
  7. 1:起始颜色 2 终止颜色
  8. //一定角度渐变
  9. canvas.NewLinearGradient(color.White,color.Black,45)
  10. 1:起始颜色 2 终止颜色 3 角度
  1. //画布里面创建梯度
  2. canvasgradient:=canvas.NewHorizontalGradient(color.White,color.Black)
  3. //添加到窗口
  4. w.SetContent(canvasgradient)

1657461739105.png

1.5 容器container

1.5.1 水平 竖直框

将多个组件装在一起显示

w.SetContent(newHBox)只能有一个参数,所以用个框装起来

水平:体现在两个组件之间位置关系

  1. //创建一个按钮button
  2. button:=widget.NewButton("my name is button", func() {
  3. })
  4. //新建一个标签
  5. label:=widget.NewLabel("my name is label")
  6. //水平box将两个组件装起来
  7. newHBox:=container.NewHBox(button,label)
  8. //显示在窗口
  9. w.SetContent(newHBox)

1657463052181.png

1.5.2 水平 竖直隔离框

  1. //画布中创建文本
  2. labels1:=canvas.NewText("text1",color.Black)
  3. labels2:=canvas.NewText("text2",color.Black)
  4. //创建一个标签组件
  5. w1:=widget.NewLabel("widget label")
  6. //添加到窗口
  7. w.SetContent(container.NewVSplit(container.NewHSplit(labels1,labels2),w1))

1657891163908.png

先是labels1labels2在水平方向隔离,然后他们整体又再竖直方向和w1进行隔离

1.5.3 水平 竖直滚动框

  1. //red rect
  2. redRect:=canvas.NewRectangle(color.NRGBA{R: 255,G: 0,B: 0,A: 255})
  3. redRect.SetMinSize(fyne.NewSize(200,200))
  4. //blue rect
  5. blueRect:=canvas.NewRectangle(color.NRGBA{R: 0,G: 0,B: 255,A: 255})
  6. blueRect.SetMinSize(fyne.NewSize(200,200))
  7. c:=container.NewVBox(redRect,blueRect)
  8. //创建scroll 滚动框
  9. scroll:=container.NewScroll(c)
  10. //显示在窗口
  11. w.SetContent(scroll)

1658053541900.png

1.6 修改主题颜色

  1. a.Settings().SetTheme(theme.LightTheme()) //设置亮色主题
  2. a.Settings().SetTheme(theme.DarkTheme()) //设置暗色主题
  1. //文字说明
  2. label:=widget.NewLabel("Fyne Theme")
  3. //亮色主题
  4. btn1:=widget.NewButton("Light Theme", func() {
  5. a.Settings().SetTheme(theme.LightTheme())
  6. })
  7. //暗色主题
  8. btn2:=widget.NewButton("Dark Theme", func() {
  9. a.Settings().SetTheme(theme.DarkTheme())
  10. })
  11. //退出
  12. btn3:=widget.NewButton("Exit", func() {
  13. a.Quit()
  14. })
  15. //添加到窗口
  16. w.SetContent(container.NewVBox(label,btn1,btn2,btn3))

1657892549640.png

1657892549640.png

1.7 设置窗口图标

1.使用fyne默认图标

  1. //设置app 图口默认图标
  2. w.SetIcon(theme.FyneLogo())

1657895127626.png

2.加载本地图片做图标

  1. //指定你需要加载图片路径
  2. r,_:=fyne.LoadResourceFromPath("./bdyjy.jpg") //相对路径和绝对路径都可
  3. //设置app 图标
  4. w.SetIcon(r)

1657895821695.png

3.从网上指定图片url作为图标

  1. //指定你需要加载图片的url
  2. r,_:=fyne.LoadResourceFromURLString("https://picsum.photos/200")
  3. //设置app 图标
  4. w.SetIcon(r)

1657896377534.png

1.8 菜单栏 menu

  1. //设置menuitem相关信息
  2. menuItem:=&fyne.Menu{
  3. Label: "File",
  4. Items: nil,
  5. }
  6. //根据item创建menu
  7. menu:=fyne.NewMainMenu(menuItem)
  8. //在窗口显示
  9. w.SetMainMenu(menu)

创建多个**item**子项

  1. //点击每个item执行相应的回调
  2. menuItems1:=fyne.NewMenuItem("New", func() {
  3. fmt.Println("New is pressed")
  4. })
  5. menuItems2:=fyne.NewMenuItem("Save", func() {
  6. fmt.Println("Save is pressed")
  7. })
  8. menuItems3:=fyne.NewMenuItem("Edit", func() {
  9. fmt.Println("Edit is pressed")
  10. })
  11. //根据item创建menu
  12. newMenu:=fyne.NewMenu("File",menuItems1,menuItems2,menuItems3)
  13. //创建主menu
  14. menu:=fyne.NewMainMenu(newMenu)
  15. //设置在窗口
  16. w.SetMainMenu(menu)

1657945976581.png

创建多个并列**menu**

  1. //创建多个item
  2. newItem:=fyne.NewMenuItem("New",nil)
  3. editItem:=fyne.NewMenuItem("Edit",nil)
  4. saveItem:=fyne.NewMenuItem("Save",nil)
  5. //创建menu 这个相当于是折叠起来先显示的
  6. menu1:=fyne.NewMenu("File",newItem,editItem,saveItem)
  7. menu2:=fyne.NewMenu("Config",newItem,editItem,saveItem)
  8. menu3:=fyne.NewMenu("Content",newItem,editItem,saveItem)
  9. //创建mainmenu
  10. mainmenu:=fyne.NewMainMenu(menu1,menu2,menu3)
  11. //设置在窗口上
  12. w.SetMainMenu(mainmenu)

1657946796527.png

1.8.1 子菜单

  1. //创建多个item
  2. item1:=fyne.NewMenuItem("New",nil)
  3. item2:=fyne.NewMenuItem("Edit",nil)
  4. item3:=fyne.NewMenuItem("Save",nil)
  5. item2.ChildMenu=fyne.NewMenu("",
  6. fyne.NewMenuItem("Add",nil),
  7. fyne.NewMenuItem("Sub",nil),
  8. fyne.NewMenuItem("Div",nil),
  9. )
  10. //创建menu 这个相当于是折叠起来先显示的
  11. menu:=fyne.NewMenu("File",item1,item2,item3)
  12. //创建mainmenu
  13. mainmenu:=fyne.NewMainMenu(menu)
  14. //设置在窗口上
  15. w.SetMainMenu(mainmenu)

1657950886369.png

1.9 对话框dialog

1.9.1 打开文件

  1. btn:=widget.NewButton("Open .txt files", func() {
  2. //使用对话框打开文件
  3. //第一个参数是函数体,第二个参数是父窗口
  4. file_dial:=dialog.NewFileOpen(func(r fyne.URIReadCloser, err error) {
  5. //读取文件
  6. data,_:=ioutil.ReadAll(r)
  7. //得到结果
  8. result:=fyne.NewStaticResource("name",data)
  9. //展示文本在标签
  10. entry:=widget.NewMultiLineEntry()
  11. entry.SetText(string(result.StaticContent))
  12. //显示 title就设置为文件名,
  13. w:=fyne.CurrentApp().NewWindow(string(result.StaticName))
  14. w.SetContent(container.NewVBox(entry))
  15. w.Show()
  16. },w)
  17. //进行过滤
  18. file_dial.SetFilter(storage.NewExtensionFileFilter([]string{".txt"}))
  19. file_dial.Show()
  20. })
  21. w.SetContent(container.NewVBox(btn))

1658071514634.png

1658072789435.png

1.9.2 存储文件

  1. entry:=widget.NewMultiLineEntry()
  2. //创建按钮用来储存文件
  3. btn:=widget.NewButton("Save .txt file", func() {
  4. //第一个是个函数 第二个是父窗口
  5. fileDialog:=dialog.NewFileSave(func(wc fyne.URIWriteCloser, err error) {
  6. //从输入获取数据信息
  7. data:=entry.Text
  8. //写到文件去
  9. wc.Write([]byte(data))
  10. },w)
  11. //设置文件名
  12. fileDialog.SetFileName("anyFileName.txt")
  13. fileDialog.Show()
  14. fileDialog.Refresh()
  15. })
  16. //窗口显示
  17. w.SetContent(container.NewVBox(entry,btn))

1658120175079.png

1658120192672.png

1.9.3 显示图片

  1. btn:=widget.NewButton("Open .jpg & .png", func() {
  2. fileDialog:=dialog.NewFileOpen(func(r fyne.URIReadCloser, err error) {
  3. data,_:=ioutil.ReadAll(r)
  4. res:=fyne.NewStaticResource(r.URI().Name(),data)
  5. img:=canvas.NewImageFromResource(res)
  6. win:=fyne.CurrentApp().NewWindow(r.URI().Name())
  7. win.SetContent(img)
  8. win.Resize(fyne.NewSize(500,500))
  9. win.Show()
  10. },w)
  11. fileDialog.SetFilter(storage.NewExtensionFileFilter([]string{".jpg",".png"}))
  12. fileDialog.Show()
  13. })
  14. w.SetContent(btn)

1658121087601.png

1658121104352.png

1.10 组件位置大小约束

  1. btn:=widget.NewButton("Button", func() {})
  2. btn.Resize(fyne.NewSize(40,100))
  3. btn.Move(fyne.Position{0,0})
  4. red_Rect:=canvas.NewRectangle(color.NRGBA{R: 255,G: 0,B: 0,A: 255})
  5. red_Rect.Resize(fyne.NewSize(40,100))
  6. red_Rect.Move(fyne.Position{250,250})
  7. blue_cicle:=canvas.NewCircle(color.NRGBA{0,255,0,255})
  8. blue_cicle.Resize(fyne.NewSize(40,100))
  9. blue_cicle.Move(fyne.Position{350,80})
  10. //这里一定要选择NewWithoutLayout 无布局方式 不然我们设置的位置大小都无效
  11. w.SetContent(container.NewWithoutLayout(btn,red_Rect,blue_cicle))

1658122117298.png

  1. fmt.Println("blue_cicle:",blue_cicle.Position()) //可打印当前组件所在位置,以左上为基准

1.11 fyne不支持中文问题

方法1

借助第三方库:github.com/flopp/go-findfont

在init函数中完成初始化

  1. package main
  2. import (
  3. "fyne.io/fyne/v2"
  4. "fyne.io/fyne/v2/app"
  5. "fyne.io/fyne/v2/widget"
  6. "github.com/flopp/go-findfont"
  7. "os"
  8. "strings"
  9. )
  10. func init() {
  11. fontPaths := findfont.List()
  12. for _, path := range fontPaths {
  13. //楷体 "simkai.ttf"
  14. //黑体 "simhei.ttf"
  15. if strings.Contains(path, "simkai.ttf") {
  16. os.Setenv("FYNE_FONT",path)
  17. break
  18. }
  19. }
  20. }
  21. func main(){
  22. //创建app
  23. a:=app.New()
  24. //创建一个windows
  25. w:=a.NewWindow("我是窗口")
  26. w.Resize(fyne.NewSize(500,500))
  27. label:=widget.NewLabel("这是标签")
  28. w.SetContent(label)
  29. //运行
  30. w.ShowAndRun()
  31. }

1658155003923.png

方法2

  • C:\Windows\Fonts下选择合适的字体复制到你的项目路径下
    1658155576049.png
  • 使用init函数,设置环境变量即可使用
    1. func init() {
    2. os.Setenv("FYNE_FONT","msyhl.ttc")
    3. }

    1658155650575.png
    1658155660406.png

1.15 小案例

案例1: 实现随机数

实现一个点击产生随机数

  1. func main() {
  2. //创建一个app
  3. a:=app.New()
  4. //创建一个windows
  5. w:=a.NewWindow("my name is title")
  6. //修改默认大小
  7. w.Resize(fyne.NewSize(300,300))
  8. //添加随机数种子 避免伪随机
  9. rand.Seed(time.Now().UnixNano())
  10. //新建一个标签
  11. label:=widget.NewLabel("my name is label")
  12. //创建一个按钮button 只要点击按钮就回触发回调函数
  13. button:=widget.NewButton("Generate", func() {
  14. //产生0-99随机数
  15. rand1:=rand.Intn(100)
  16. //相当于将label标签的文本覆盖
  17. label.Text=fmt.Sprint(rand1)
  18. //实时刷新
  19. label.Refresh()
  20. })
  21. //水平box将两个微件装起来
  22. newHBox:=container.NewVBox(button,label)
  23. //显示在窗口
  24. w.SetContent(newHBox)
  25. //运行
  26. w.ShowAndRun()
  27. }

1657463676775.png

案例2: 随机点数图片

  1. func main() {
  2. //创建一个app
  3. a:=app.New()
  4. //创建一个windows
  5. w:=a.NewWindow("my name is title")
  6. //修改默认大小
  7. w.Resize(fyne.NewSize(300,300))
  8. //创建图片组件 初始显示1.png
  9. canvasImg:=canvas.NewImageFromFile("C:/Users/jq/Desktop/dice/1.png")
  10. //以原始图片样式显示 必须有
  11. canvasImg.FillMode=canvas.ImageFillOriginal
  12. //随机数种子
  13. rand.Seed(time.Now().UnixNano())
  14. //创建一个组件button
  15. button:=widget.NewButton("run", func() {
  16. //1-6
  17. rand1:=rand.Intn(6)+1
  18. //修改图片路径
  19. canvasImg.File=fmt.Sprintf("C:/Users/jq/Desktop/dice/%d.png",rand1)
  20. //刷新
  21. canvasImg.Refresh()
  22. })
  23. //创建竖直box容器
  24. vBox:=container.NewVBox(canvasImg,button)
  25. //在窗口显示
  26. w.SetContent(vBox)
  27. //运行
  28. w.ShowAndRun()
  29. }

1657465776045.png

案例3: 随机颜色生成

  1. func main() {
  2. //创建一个app
  3. a:=app.New()
  4. //创建一个windows
  5. w:=a.NewWindow("my name is title")
  6. //修改默认大小
  7. w.Resize(fyne.NewSize(300,300))
  8. //播种随机数
  9. rand.Seed(time.Now().UnixNano())
  10. //画图创建矩形 默认初始是黑色
  11. rect:=canvas.NewRectangle(color.NRGBA{R: 0,G: 0,B: 0,A: 255})
  12. rect.SetMinSize(fyne.NewSize(150,150))
  13. //随机颜色
  14. btn1:=widget.NewButton("Ranndom Color", func() {
  15. //点击按钮 就会触发func ,将填充颜色进行修改
  16. rect.FillColor=color.NRGBA{R: uint8(rand.Intn(255)),B: uint8(rand.Intn(255)),G: uint8(rand.Intn(255)),A: 255}
  17. rect.Refresh()
  18. })
  19. //随机红色
  20. btnRed:=widget.NewButton("Ranndom Red", func() {
  21. rect.FillColor=color.NRGBA{R: uint8(rand.Intn(255)),B:0,G: 0,A: 255}
  22. rect.Refresh()
  23. })
  24. //随机绿
  25. btnGreen:=widget.NewButton("Ranndom Green", func() {
  26. rect.FillColor=color.NRGBA{R: 0,B:0,G: uint8(rand.Intn(255)),A: 255}
  27. rect.Refresh()
  28. })
  29. //随机蓝色
  30. btnBlue:=widget.NewButton("Ranndom Blue", func() {
  31. rect.FillColor=color.NRGBA{R: 0,B:uint8(rand.Intn(255)),G: 0,A: 255}
  32. rect.Refresh()
  33. })
  34. w.SetContent(container.NewVBox(rect,btn1,btnRed,btnBlue,btnGreen))
  35. //运行
  36. w.ShowAndRun()
  37. }

1657894323641.png

案例4:随机密码生成器

首先如何生成密码

  1. func main() {
  2. rand.Seed(time.Now().UnixNano())
  3. //假设密码长度为10
  4. length := 10
  5. //数字
  6. strNum:="0123456789"
  7. //小写
  8. strLow:="abcdefghijklmnopqrstuvwxyz"
  9. //大写
  10. strUp:="ABCDEFGHIJKLMNOPQRSTUVWSYZ"
  11. //最后结果
  12. ans:=""
  13. //总共循环指定密码长度次数
  14. for i:=0;i<length;i++{
  15. //随机选择数字 小写 大写 根据不同case 在随机生成出一个字母 加在ans上
  16. randstr:=rand.Intn(3)
  17. switch randstr {
  18. case 0:
  19. rand1:=rand.Intn(len(strNum))
  20. ans+=string(strNum[rand1])
  21. case 1:
  22. rand2:=rand.Intn(len(strLow))
  23. ans+=string(strLow[rand2])
  24. case 2:
  25. rand3:=rand.Intn(len(strUp))
  26. ans+=string(strUp[rand3])
  27. }
  28. }
  29. }

最后实现:

  1. func main() {
  2. //创建app
  3. a:=app.New()
  4. //创建一个windows
  5. w:=a.NewWindow("Rand Code")
  6. //修改默认大小
  7. w.Resize(fyne.NewSize(300,300))
  8. title:=canvas.NewText("Password Generator",color.Black)
  9. //客户输入密码长度的位置
  10. input:=widget.NewEntry()
  11. input.SetPlaceHolder("Enter Password length")
  12. //生成结果的位置 初始结果为空
  13. textAns:=canvas.NewText("",color.Black)
  14. textAns.TextSize=20
  15. //运行的按钮
  16. btn:=widget.NewButton("Generate", func() {
  17. //获取输入的数字结果,转成int类型
  18. length,_:=strconv.Atoi(input.Text)
  19. //验证码
  20. ans:=RandGenCode(length)
  21. textAns.Text=ans
  22. textAns.Refresh()
  23. })
  24. w.SetContent(container.NewVBox(title,input,textAns,btn))
  25. //运行
  26. w.ShowAndRun()
  27. }
  28. func RandGenCode(length int)(ans string){
  29. rand.Seed(time.Now().UnixNano())
  30. //数字
  31. strNum:="0123456789"
  32. //小写
  33. strLow:="abcdefghijklmnopqrstuvwxyz"
  34. //大写
  35. strUp:="ABCDEFGHIJKLMNOPQRSTUVWSYZ"
  36. for i:=0;i<length;i++{
  37. randstr:=rand.Intn(3)
  38. switch randstr {
  39. case 0:
  40. rand1:=rand.Intn(len(strNum))
  41. ans+=string(strNum[rand1])
  42. case 1:
  43. rand2:=rand.Intn(len(strLow))
  44. ans+=string(strLow[rand2])
  45. case 2:
  46. rand3:=rand.Intn(len(strUp))
  47. ans+=string(strUp[rand3])
  48. }
  49. }
  50. return ans
  51. }

1657899346358.png