gpt4 book ai didi

user-interface - 编写确认(是/否)对话框

转载 作者:数据小太阳 更新时间:2023-10-29 03:08:04 26 4
gpt4 key购买 nike

我正在尝试使用 andlabs/ui 在 Go 中编写一个是/否对话框它似乎没有这种类型的 GUI 组件:

package main

import "github.com/andlabs/ui"

func confirm(msg string) bool {
var confirmWindow = ui.NewWindow("Please confirm", 300, 100, false)
var vbox = ui.NewVerticalBox()
vbox.Append(ui.NewLabel(msg), false)
var yesButton = ui.NewButton("Yes")
yesButton.OnClicked(func (*ui.Button) {
return true
})
var noButton = ui.NewButton("No")
noButton.OnClicked(func (*ui.Button) {
return false // <<< this should return out of the confirm function.
})
var hbox = ui.NewHorizontalBox()
hbox.Append(yesButton, false)
hbox.Append(noButton, false)
vbox.Append(hbox, false)
confirmWindow.SetChild(vbox)
confirmWindow.Show()
}

func main(){
var ret = confirm("Proceed?")
if ret {
println("Yes returned.")
} else {
println("No returned.")
}
}

但是,在上面,我无法根据单击是或否按钮返回 true 或 false。

当单击是/否按钮时,如何从确认函数返回真/假?

编辑:根据@Mikhail 的回答建议,我尝试了以下代码:

package main
import ("github.com/andlabs/ui")
func confirm(msg string) chan bool {
var confirmWindow = ui.NewWindow("Please confirm", 300, 100, false)
var vbox = ui.NewVerticalBox()
vbox.Append(ui.NewLabel(msg), false)
var yesButton = ui.NewButton("Yes")
ret := make(chan bool)
yesButton.OnClicked(func (*ui.Button){
ret <- true
})
var noButton = ui.NewButton("No")
noButton.OnClicked(func (*ui.Button){
ret <- false
})
var hbox = ui.NewHorizontalBox()
hbox.Append(yesButton, false)
hbox.Append(noButton, false)
vbox.Append(hbox, false)
confirmWindow.SetChild(vbox)
confirmWindow.Show()
confirmWindow.OnClosing(func(*ui.Window)bool{
ui.Quit(); return true
})
return ret
}
func main(){
c := make(chan bool)
c <- confirm("Proceed?")
if c {println("Yes")} else {println("No")}
}

但是,它也不起作用。错误是:

# command-line-arguments
./rnconfirm.go:30:4: cannot use confirm("Proceed?") (type chan bool) as type bool in send
./rnconfirm.go:31:2: non-bool c (type chan bool) used as if condition

使用以下 main 函数也不起作用:

func main(){
println(confirm("Proceed"))
}

错误是:

(process:8577): GLib-CRITICAL **: g_ptr_array_add: assertion 'rarray' failed
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x7fdeb996ae19]

runtime stack:
runtime.throw(0x4bd337, 0x2a)
/usr/local/go/src/runtime/panic.go:616 +0x81
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:372 +0x28e

goroutine 1 [syscall, locked to thread]:
...
...

第二次尝试使用 channel 也无效:

package main
import ("github.com/andlabs/ui")
func confirm(msg string, ret chan bool) {
var confirmWindow = ui.NewWindow("Please confirm", 300, 100, false)
var vbox = ui.NewVerticalBox()
vbox.Append(ui.NewLabel(msg), false)
var yesButton = ui.NewButton("Yes")
yesButton.OnClicked(func (*ui.Button){
ret <- true
})
var noButton = ui.NewButton("No")
noButton.OnClicked(func (*ui.Button){
ret <- false
})
var hbox = ui.NewHorizontalBox()
hbox.Append(yesButton, false)
hbox.Append(noButton, false)
vbox.Append(hbox, false)
confirmWindow.SetChild(vbox)
confirmWindow.Show()
confirmWindow.OnClosing(func(*ui.Window)bool{
ui.Quit(); return true
})
}
func main(){
c := make(chan bool)
go confirm("Proceed?", c)
ret := <- c
if ret {println("Yes")} else {println("No")}
}

它编译并运行但崩溃并报错:

(process:2407): GLib-CRITICAL **: g_ptr_array_add: assertion 'rarray' failed
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x7f47561e5e19]

最佳答案

在代码中,您不是从函数 confirm 而是从 OnClicked 方法附加到 yesButton 和 noButton 的回调中返回 true 或 false。

yesButton.OnClicked(func (*ui.Button) {
return true
})
var noButton = ui.NewButton("No")
noButton.OnClicked(func (*ui.Button) {
return false // <<< this should return out of the confirm function.
})

要将主线程与您附加的回调进行通信,您需要有某种通信对象,如果 golang channel 可以正常工作。在 confirm 函数的主体中声明 chan bool,通过回调中的闭包使用它,将它作为 confirm 函数的结果返回,并在你的 main 中读取它功能。

长话短说:

  • 从确认返回chan bool

  • 从中读取结果

  • 与其尝试从回调中返回 bool 值,不如将所需的值发送到 channel 中。

关于user-interface - 编写确认(是/否)对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57737124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com