在点击go fyne systray菜单后更改菜单文本。

huangapple go评论123阅读模式
英文:

Change the menu text after clicking it in go fyne systray menu

问题

这是我的系统托盘菜单,我需要在点击“start”按钮后将其更改为“stop”(并将其动作更改为“stop”动作)。

这个问题提到了这个问题,但我找不到“menu1”的refresh()方法。

顺便说一下,我正在macOS Big Sur 11.5.1 (20G80)上进行测试,我的Fyne版本是v2.3.3。

这是我的代码:

  1. package main
  2. import (
  3. "fmt"
  4. "fyne.io/fyne/v2"
  5. "fyne.io/fyne/v2/app"
  6. "fyne.io/fyne/v2/driver/desktop"
  7. "fyne.io/fyne/v2/widget"
  8. )
  9. var menu1 *fyne.MenuItem
  10. func main() {
  11. a := app.New()
  12. w := a.NewWindow("SysTray")
  13. if desk, ok := a.(desktop.App); ok {
  14. menu1 = fyne.NewMenuItem("start", func() {
  15. fmt.Println("started")
  16. // 在启动后,我将菜单标签更改为“stop”,并将Action更改为stop action,
  17. // 但我不知道如何将其更新到系统托盘菜单
  18. menu1.Label = "stop"
  19. menu1.Action = func() {
  20. fmt.Println("stopped")
  21. }
  22. // MenuItem没有Refresh()方法,只有menu1.ChildMenu有
  23. // menu1.ChildMenu.Refresh()
  24. })
  25. menu2 := fyne.NewMenuItem("menu1", nil)
  26. menu2.ChildMenu = fyne.NewMenu("",
  27. fyne.NewMenuItem("submenu1", func() {
  28. fmt.Println("submenu1")
  29. }),
  30. fyne.NewMenuItem("submenu2", func() {
  31. fmt.Println("submenu2")
  32. }),
  33. )
  34. menu3 := fyne.NewMenuItem("show2", func() {
  35. fmt.Println("menu2")
  36. })
  37. m := fyne.NewMenu("MyApp", menu1, menu2, menu3)
  38. desk.SetSystemTrayMenu(m)
  39. }
  40. w.SetContent(widget.NewLabel("Fyne System Tray"))
  41. w.SetCloseIntercept(func() {
  42. w.Hide()
  43. })
  44. w.ShowAndRun()
  45. }

这是我的go.mod

  1. module go-GUI
  2. go 1.19
  3. require fyne.io/fyne/v2 v2.3.3
  4. require (
  5. fyne.io/systray v1.10.1-0.20230312215936-7f71b037e260 // indirect
  6. github.com/benoitkugler/textlayout v0.3.0 // indirect
  7. github.com/davecgh/go-spew v1.1.1 // indirect
  8. github.com/fredbi/uri v0.1.0 // indirect
  9. github.com/fsnotify/fsnotify v1.5.4 // indirect
  10. github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
  11. github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
  12. github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
  13. github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
  14. github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect
  15. github.com/go-text/typesetting v0.0.0-20221212183139-1eb938670a1f // indirect
  16. github.com/godbus/dbus/v5 v5.1.0 // indirect
  17. github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c // indirect
  18. github.com/gopherjs/gopherjs v1.17.2 // indirect
  19. github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect
  20. github.com/pmezard/go-difflib v1.0.0 // indirect
  21. github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76 // indirect
  22. github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 // indirect
  23. github.com/stretchr/testify v1.8.0 // indirect
  24. github.com/tevino/abool v1.2.0 // indirect
  25. github.com/yuin/goldmark v1.4.13 // indirect
  26. golang.org/x/image v0.0.0-20220601225756-64ec528b34cd // indirect
  27. golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee // indirect
  28. golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
  29. golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
  30. golang.org/x/text v0.6.0 // indirect
  31. gopkg.in/yaml.v3 v3.0.1 // indirect
  32. honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
  33. )
英文:

Here is my systray menu, I need to change "start" button to "stop" after clicking it(and change it's action to "stop" action)
在点击go fyne systray菜单后更改菜单文本。

This issue had mentioned about this, but I can not find the refresh() method of "menu1".

BTW, I'm testing it in macOS Big Sur 11.5.1 (20G80), and my Fyne version is v2.3.3

Here's my code

  1. package main
  2. import (
  3. "fmt"
  4. "fyne.io/fyne/v2"
  5. "fyne.io/fyne/v2/app"
  6. "fyne.io/fyne/v2/driver/desktop"
  7. "fyne.io/fyne/v2/widget"
  8. )
  9. var menu1 *fyne.MenuItem
  10. func main() {
  11. a := app.New()
  12. w := a.NewWindow("SysTray")
  13. if desk, ok := a.(desktop.App); ok {
  14. menu1 = fyne.NewMenuItem("start", func() {
  15. fmt.Println("started")
  16. // after started, I change the menu label to "stop" and change the Action to stop action,
  17. // but I don't know how to update this to the system tray menu
  18. menu1.Label = "stop"
  19. menu1.Action = func() {
  20. fmt.Println("stopped")
  21. }
  22. // There is no Refresh() method for MenuItem, only for menu1.ChildMenu
  23. // menu1.ChildMenu.Refresh()
  24. })
  25. menu2 := fyne.NewMenuItem("menu1", nil)
  26. menu2.ChildMenu = fyne.NewMenu("",
  27. fyne.NewMenuItem("submenu1", func() {
  28. fmt.Println("submenu1")
  29. }),
  30. fyne.NewMenuItem("submenu2", func() {
  31. fmt.Println("submenu2")
  32. }),
  33. )
  34. menu3 := fyne.NewMenuItem("show2", func() {
  35. fmt.Println("menu2")
  36. })
  37. m := fyne.NewMenu("MyApp", menu1, menu2, menu3)
  38. desk.SetSystemTrayMenu(m)
  39. }
  40. w.SetContent(widget.NewLabel("Fyne System Tray"))
  41. w.SetCloseIntercept(func() {
  42. w.Hide()
  43. })
  44. w.ShowAndRun()
  45. }

Here's my go.mod

  1. module go-GUI
  2. go 1.19
  3. require fyne.io/fyne/v2 v2.3.3
  4. require (
  5. fyne.io/systray v1.10.1-0.20230312215936-7f71b037e260 // indirect
  6. github.com/benoitkugler/textlayout v0.3.0 // indirect
  7. github.com/davecgh/go-spew v1.1.1 // indirect
  8. github.com/fredbi/uri v0.1.0 // indirect
  9. github.com/fsnotify/fsnotify v1.5.4 // indirect
  10. github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
  11. github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
  12. github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
  13. github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
  14. github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect
  15. github.com/go-text/typesetting v0.0.0-20221212183139-1eb938670a1f // indirect
  16. github.com/godbus/dbus/v5 v5.1.0 // indirect
  17. github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c // indirect
  18. github.com/gopherjs/gopherjs v1.17.2 // indirect
  19. github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect
  20. github.com/pmezard/go-difflib v1.0.0 // indirect
  21. github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76 // indirect
  22. github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 // indirect
  23. github.com/stretchr/testify v1.8.0 // indirect
  24. github.com/tevino/abool v1.2.0 // indirect
  25. github.com/yuin/goldmark v1.4.13 // indirect
  26. golang.org/x/image v0.0.0-20220601225756-64ec528b34cd // indirect
  27. golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee // indirect
  28. golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
  29. golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
  30. golang.org/x/text v0.6.0 // indirect
  31. gopkg.in/yaml.v3 v3.0.1 // indirect
  32. honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
  33. )

答案1

得分: 0

如今在Slack上发布的消息和GitHub问题中提到,你需要调用Menu.Refresh来刷新显示的菜单。
在你上面的代码中,应该是m.Refresh()

英文:

As was posted on Slack earlier today, and on the GitHub issue, you need to call Menu.Refresh to refresh the menu that is shown.
In your code above that would be m.Refresh().

答案2

得分: 0

这是一个正常工作的代码:

  1. package main
  2. import (
  3. "fmt"
  4. "fyne.io/fyne/v2"
  5. "fyne.io/fyne/v2/app"
  6. "fyne.io/fyne/v2/driver/desktop"
  7. "fyne.io/fyne/v2/widget"
  8. )
  9. var menu1 *fyne.MenuItem
  10. var menu *fyne.Menu
  11. func main() {
  12. a := app.New()
  13. w := a.NewWindow("SysTray")
  14. if desk, ok := a.(desktop.App); ok {
  15. menu1 = fyne.NewMenuItem("start", func() {
  16. if menu1.Label == "start" {
  17. fmt.Println("started")
  18. menu1.Label = "stop"
  19. } else {
  20. fmt.Println("stopped")
  21. menu1.Label = "start"
  22. }
  23. // 更改菜单标签后,使用此方法刷新菜单
  24. // menu 是返回的
  25. menu.Refresh()
  26. })
  27. menu2 := fyne.NewMenuItem("menu1", nil)
  28. menu2.ChildMenu = fyne.NewMenu("",
  29. fyne.NewMenuItem("submenu1", func() {
  30. fmt.Println("submenu1")
  31. }),
  32. fyne.NewMenuItem("submenu2", func() {
  33. fmt.Println("submenu2")
  34. }),
  35. )
  36. menu3 := fyne.NewMenuItem("show2", func() {
  37. fmt.Println("menu2")
  38. })
  39. menu = fyne.NewMenu("MyApp", menu1, menu2, menu3)
  40. desk.SetSystemTrayMenu(menu)
  41. }
  42. w.SetContent(widget.NewLabel("Fyne System Tray"))
  43. w.SetCloseIntercept(func() {
  44. w.Hide()
  45. })
  46. w.ShowAndRun()
  47. }

希望对你有帮助!

英文:

This is the code that works fine

  1. package main
  2. import (
  3. "fmt"
  4. "fyne.io/fyne/v2"
  5. "fyne.io/fyne/v2/app"
  6. "fyne.io/fyne/v2/driver/desktop"
  7. "fyne.io/fyne/v2/widget"
  8. )
  9. var menu1 *fyne.MenuItem
  10. var menu *fyne.Menu
  11. func main() {
  12. a := app.New()
  13. w := a.NewWindow("SysTray")
  14. if desk, ok := a.(desktop.App); ok {
  15. menu1 = fyne.NewMenuItem("start", func() {
  16. if menu1.Label == "start" {
  17. fmt.Println("started")
  18. menu1.Label = "stop"
  19. } else {
  20. fmt.Println("stopped")
  21. menu1.Label = "start"
  22. }
  23. // after changing the menu label, use this to refresh the menu
  24. // menu is return
  25. menu.Refresh()
  26. })
  27. menu2 := fyne.NewMenuItem("menu1", nil)
  28. menu2.ChildMenu = fyne.NewMenu("",
  29. fyne.NewMenuItem("submenu1", func() {
  30. fmt.Println("submenu1")
  31. }),
  32. fyne.NewMenuItem("submenu2", func() {
  33. fmt.Println("submenu2")
  34. }),
  35. )
  36. menu3 := fyne.NewMenuItem("show2", func() {
  37. fmt.Println("menu2")
  38. })
  39. menu = fyne.NewMenu("MyApp", menu1, menu2, menu3)
  40. desk.SetSystemTrayMenu(menu)
  41. }
  42. w.SetContent(widget.NewLabel("Fyne System Tray"))
  43. w.SetCloseIntercept(func() {
  44. w.Hide()
  45. })
  46. w.ShowAndRun()
  47. }

huangapple
  • 本文由 发表于 2023年4月14日 20:45:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76015254.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定