草庐IT

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

coder 2024-07-06 原文

我正在尝试使用 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/

有关user-interface - 编写确认(是/否)对话框的更多相关文章

  1. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  5. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  6. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  7. ruby-on-rails - 尝试为 Rails 中的用户名验证编写 REGEX - 2

    我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z

  8. ruby-on-rails - 致命 : Peer authentication failed for user "rails" - 2

    我正在尝试运行rakedb:create在DigitalOcean服务器上使用postgresql。但是,它返回错误Peerauthenticationfailedforuser"rails",引用config/database.yml登录凭据的存储位置奇怪的是,当我通过SSH登录服务器时,这些凭据以纯文本形式显示给我。我都试过了密码以纯文本形式显示给我,同样的事情发生了。环境在生产中,我必须手动强制执行,因为应用程序在启动时正在开发中并强制它在config/environments.rb中更改不工作。如果我不得不猜测,我可能会说环境中发生了一些有趣的事情,因为DigitalOcean

  9. ruby-on-rails - 如何编写跨模型、 Controller 和 View 的 Rails mixin - 2

    为了减少我的小Rails应用程序中的代码重复,我一直致力于将我的模型之间的通用代码放入它自己的单独模块中,到目前为止一切顺利。模型的东西相当简单,我只需要在开头包含模块,例如:classIso这工作正常,但是现在,我将有一些Controller和View代码,这些代码也将在这些模型之间通用,到目前为止,我有这个用于我的可发送内容:#Thisisamodulethatisusedforpages/formsthatarecanbe"sent"#eitherviafax,email,orprinted.moduleSendablemoduleModeldefself.included(kl

  10. ruby-on-rails - 获取 ActionController::RoutingError(当尝试使用 AngularJS 将数据发布到 Rails 服务器时,没有路由匹配 [OPTIONS] "/users" - 2

    尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg

随机推荐