main()不等待使用fyne更新golang中的文件对话框更新文件对话框

main () not waiting for update of file dialog in golang using fyne for file dialog

我想使用文件对话框 select 一个目录,以便在 Go 中进一步使用。 select 我正在使用 Fyne 文件对话框的目录,因为应用程序的其余部分也使用 Fyne。我设法创建了一个简单的测试应用程序:

package main

import (
    "fmt"

    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/dialog"
    "fyne.io/fyne/v2/widget"
)

var save_dir string = "NoPathYet!"

func chooseDirectory(w fyne.Window) string {
    dialog.ShowFolderOpen(func(dir fyne.ListableURI, err error) {
        if err != nil {
            dialog.ShowError(err, w)
            return
        }
        if dir != nil {

            fmt.Println(dir.Path())
            save_dir = dir.Path() // here value of save_dir shall be updated!

        }
        fmt.Println(save_dir)

    }, w)
    return save_dir
}

func main() {
    a := app.New()
    w := a.NewWindow("FileDialogTest")

    hello := widget.NewLabel("Hello Fyne!")
    w.SetContent(container.NewVBox(
        hello,
        widget.NewButton("Go Get Directory!", func() {
            hello.SetText(chooseDirectory(w)) // Text of hello updated by return value
        }),
    ))
    w.Resize(fyne.NewSize(500, 500))
    w.ShowAndRun()
}

它不能正常工作,标签 hello 在值的 return 之前更新,不知何故...

当单击按钮 “获取目录!” 时,函数 chooseDirectory 应该被调用并且 return 值应该在 hello-Label.

中设置为文本

我是一个 Golang 新手,所以我的问题对于更有经验的 Go 程序员来说可能很愚蠢。无论如何,我将不胜感激!

提前致谢,

文茨

记住回调函数的重点是不要等待。在您的代码中, chooseDirectory(w) 总是在用户选择任何文件夹之前返回。因此,您应该在 ShowFolderOpen.

的回调中直接更新 hello 标签文本

这是预期的工作代码。

package main

import (
    "fmt"

    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/dialog"
    "fyne.io/fyne/v2/widget"
)

func chooseDirectory(w fyne.Window, h *widget.Label) {
    dialog.ShowFolderOpen(func(dir fyne.ListableURI, err error) {
        save_dir := "NoPathYet!"
        if err != nil {
            dialog.ShowError(err, w)
            return
        }
        if dir != nil {
            fmt.Println(dir.Path())
            save_dir = dir.Path() // here value of save_dir shall be updated!
        }
        fmt.Println(save_dir)
        h.SetText(save_dir)
    }, w)
}

func main() {
    a := app.New()
    w := a.NewWindow("FileDialogTest")

    hello := widget.NewLabel("Hello Fyne!")
    w.SetContent(container.NewVBox(
        hello,
        widget.NewButton("Go Get Directory!", func() {
            chooseDirectory(w, hello) // Text of hello updated by return value
        }),
    ))
    w.Resize(fyne.NewSize(500, 500))
    w.ShowAndRun()
}