我正在尝试使用 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/
我怎样才能完成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)
我想用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中编写命令行实用程序
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z
我正在尝试运行rakedb:create在DigitalOcean服务器上使用postgresql。但是,它返回错误Peerauthenticationfailedforuser"rails",引用config/database.yml登录凭据的存储位置奇怪的是,当我通过SSH登录服务器时,这些凭据以纯文本形式显示给我。我都试过了密码以纯文本形式显示给我,同样的事情发生了。环境在生产中,我必须手动强制执行,因为应用程序在启动时正在开发中并强制它在config/environments.rb中更改不工作。如果我不得不猜测,我可能会说环境中发生了一些有趣的事情,因为DigitalOcean
为了减少我的小Rails应用程序中的代码重复,我一直致力于将我的模型之间的通用代码放入它自己的单独模块中,到目前为止一切顺利。模型的东西相当简单,我只需要在开头包含模块,例如:classIso这工作正常,但是现在,我将有一些Controller和View代码,这些代码也将在这些模型之间通用,到目前为止,我有这个用于我的可发送内容:#Thisisamodulethatisusedforpages/formsthatarecanbe"sent"#eitherviafax,email,orprinted.moduleSendablemoduleModeldefself.included(kl
尝试从我的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