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()
}
我想使用文件对话框 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()
}