Gem 一套使用 HTML 为 Ruby 构建 GUI 的工具

cichol · 2015年03月20日 · 最后由 hgyxbll 回复于 2018年07月02日 · 3776 次阅读

简介

ShenmeGUI(先不要吐槽这个名字)是一套受Shoes启发而诞生的 GUI 工具,拥有相似的 DSL 语法,可以便捷地实现一些轻量的 GUI 应用。

程序将 DSL 语句转化为 HTML 结构,并使用 Javascript 绑定上一些事件,使 HTML 的前端和 Ruby 的后端可以进行双向的数据同步。

前端视图的变化会立即同步到后端(通过对 input 等事件的监听),若触发事件,则会额外传递一个事件信号。后端接收到事件信号则执行相应的回调函数,对控件属性的修改也会即时反映到 HTML 视图。

前后端的数据通信是通过 WebSocket 实现的。

项目托管在 https://github.com/CicholGricenchos/ShenmeGUI

这是我第一次做开源项目,希望得到各位前辈的指点:-)

语法示例

require 'shenmegui'

ShenmeGUI.app do
  form(title: 'Your Application') do
    button('alert').onclick do
      alert 'Hello World!'
    end
    button('open an image').onclick do
      path = get_open_file_name
      @t.text = path
      @i.src = path
    end
    stack do
      label 'image path:'
      @t = textarea '', width: '100%'
    end
    @i = image "http://7jpqbr.com1.z0.glb.clouddn.com/bw-2014-06-19.jpg"
    @p = progress(75)
    button('+').onclick { @p.percent += 5 }
    button('-').onclick { @p.percent -= 5 }
  end
end

ShenmeGUI.start!

将会产生如图所示的界面:

button 定义按钮,并通过 onclick 绑定上了点击事件。第一个按钮弹出一个对话框,第二个按钮弹出一个打开文件的对话框,将文件路径写到下方定义的 textarea 里,并改变 image 的 src 以显示这个图片。

下方的两个按钮演示了进度条的增减。

需要注意的事

目前“打开文件”的功能是通过 fiddle 调用 windows api 实现的,所以只能在 windows 下使用,以后会尝试适配其他系统。不过其他功能是没有系统依赖的,可以试试看。

gem install shenmegui 到 linux 上果然不能运行,在 windows 上可以。写 gui 的方式挺优美。

#1 楼 @africwildman
`start`,读取 comdlg32.dll,文件名区分大小写,三个问题导致 linux 不能运行。。现在都修复了,试试新的 0.3.3 版本
linux 下 get_open_file_name 恒返回空路径,别的应该没问题了

技术上看有点意思,不过现在都搞 app 开发了,win32 桌面程序没什么吸引力啦

中文名叫 什么鬼 么...

window 用户么?

项目还是挺有意思的。我看了半天代码没看明白那个 window 是怎么生成的。win32 创建 window 的代码没看到。我也不打算深入研究了。下面说说现实点的吧:

这个项目业余玩玩可以,但真的没有实用价值和前途。谁会用 ruby 写桌面 GUI?我是一个例子都没见过呢。我最近也在开发各种桌面 App,做过不少的调查。我最终的结论是最好使用各个平台上官方的解决方案。比如 Mac 你就用 Cocoa,Windows 你就用 WPF / Universal App ... 第三方的方案,做 hello world 很好很快,做点复杂的就很蛋疼。

最后还是必须承认这是个好玩的项目。练练技术还是不错的。

#6 楼 @tylerlong 我就是业余玩玩,不过自己做东西的时候也可以用到。
那个窗口的代码就在 file_dialog.rb 里啊,构造了一个结构体,然后调用了 windows c api 的 GetOpenFileName 函数,就是这个

这个挺好,整体代码量少,以后捆绑一个简易浏览器在里面,可以做些简单的 GUI,跨平台。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号