Ruby 是一门灵活的动态编程语言。GTK2 是开源的跨平台图像处理库。通过Ruby-GTK2 进行快速的 Linux 桌面图形应用开发。
介绍
Ruby-GTK2 是 GTK+ 的 ruby 绑定。Ruby 与 GTK2 的结合,带来了新的 GUI 开发方式。
GTK(GIMP Toolkit) 是一套跨多种平台的图形工具包,按 LGPL 许可协议发布的。虽然最初是为 GIMP 写的,但目前已发展为一个功能强大、设计灵活的一个通用图形库。特别是被 GNOME 选中使得 GTK+ 广为流传,成为 Linux 下开发桌面图形界面的应用程序的主流开发工具之一,目前 GTK+ 已经有了成功的 windows 版本。
Ruby 是一门动态脚本语言。有丰富的开发库。Rubyforge 网站(http://rubyforge.org/)是全球最大的 Ruby 开发库站点。
通过 Ruby 与 GTK 的有机结合,可以更高效、迅速地开发桌面图形化应用程序。
![]() ![]() |
安装与测试
在开发 gtk2-ruby 之前,需要安装 ruby 和 gtk2 运行时。
基于 Debian 的 Linux 系统,输入
$sudo apt-get –y install libgtk2-ruby |
Apt 会自动安装 ruby 及 gtk2 运行时。
Windows 系统,首先登录 ruby 官方网站 下载最新稳定版本1.8.6 安装程序。然后登录ruby-gnome2 官方网站下载 gtk2-ruby 运行库。分别安装后即可。
成功配置系统之后,可以在命令行里(Windows 下的 cmd ,Linux 下的 shell)尝试运行下面程序:
$ruby -rgtk2 -e "Gtk::Window.new.show;Gtk.main" |
如果成功看到窗口跳出,说明开发环境已搭建成功。
图 1. 弹出窗口

![]() ![]() |
基本概念
Ruby-GTK2 信号系统
GTK 是基于事件(Event)模型驱动的。事件发生时,会产生信号。在响应不同的信号时,可以注册对信号的相应处理方法。例如:
require 'gtk2' button = Gtk::Button.new("Hello World") button.signal_connect("clicked") { puts "Hello World" } |
对信号处理,都是通过基类 GLib::Instantiatable#signal_connect 函数来实现的。以信号名字的方式注册闭包代码到控件当中。
require 'gtk2' button = Gtk::Button.new("Hello World") button.signal_connect("clicked") { puts "clicked 1" } button.signal_connect("clicked") { puts "clicked 2" } button.signal_emit("clicked") |
输出结果是:
clicked 1
clicked 2
由运行结果可以看出,同一个控件对同一个信号可以进行多次注册,其执行顺序与注册顺序相同。
在 Ruby-GTK2 中如下清单事件会产生相应的信号,开发人员对其进行捕捉以进行相应处理:
- event
- button_press_event
- button_release_event
- scroll_event
- motion_notify_event
- delete_event
- destroy_event
- expose_event
- key_press_event
- key_release_event
- enter_notify_event
- leave_notify_event
- configure_event
- focus_in_event
- focus_out_event
- map_event
- unmap_event
- property_notify_event
- selection_clear_event
- selection_request_event
- selection_notify_event
- proximity_in_event
- proximity_out_event
- visibility_notify_event
- client_event
- no_expose_event
- window_state_event
绘图上下文
GTK 的绘图操作使用 Gdk::GC 参数。通过绘图上下文的使用(如设定背景色、长宽等),减少了重复的绘图属性设定和通讯消耗,进而提高了绘图效率。
require 'gtk2' window = Gtk::Window.new("gc") window.set_default_size(300, 300) window.app_paintable = true window.realize drawable = window.window gc = Gdk::GC.new(drawable) |
如代码所示,gc 对象可以从 drawable 获取相关信息,并缓存到 GC 缓冲池当中,以便以后有其他对象引用。
Ruby-GTK2 主要控件
GTK 封装好了很多控件,便于开发人员进行调用。下面分类介绍主要控件的功能。
- 窗口控件
Gtk::Window 窗口控件。用于创建新窗口,包含其他控件。
Gtk::Dialog 对话框控件。用于与用户做简单信息交互,如显示信息、提出问题等。
Gtk::AboutDialog 关于控件。用于便利地创建提示性信息,如关于信息、版权信息等。
Gtk::Assistant 辅助控件。用于创建多步信息交互,如向导方式的窗体等。
- 显示控件
Gtk::Label 标签控件。用于显示文字信息,如嵌于按钮控件( Gtk::Button )等。
Gtk::Image 图像控件。用于显示图像信息,如显示产品 Logo 图像等。
Gtk::ProgressBar 进度栏控件。用于显示任务执行进度信息,如任务执行百分比信息等。
Gtk::StatusBar 状态栏控件。用于显示应用程序的状态信息,一般位于窗体底部。
- 按钮选项控件
Gtk::Button 按钮控件。用于提供用户按下操作,如确认按钮等。
Gtk::CheckButton 勾选控件。用于提供用户勾选操作。
Gtk::RadioButton 单选控件。用于单选一组选项中的一个。
- 数字、文本数据控件
Gtk::Entry 录入控件。用于单行录入,如输入姓名等。
Gtk::SpinButton 微调按钮控件。用于微调数值,如调整录入百分比数值等。
Gtk::HScale 水平拖拽控件。用于通过水平拖拽改变数值。
Gtk::VScale 垂直拖拽控件。用于通过垂直拖拽改变数值。
- 多行编辑控件
Gtk::TextBuffer 文本缓冲区控件。其他多行编辑控件显示的内容。
Gtk::TextView 文本显示控件。用于显示文本缓冲区控件的内容。
Gtk::TextTag 文本标签控件。用于显示文本标签。
Gtk::TextTagTable 文本标签表控件。用于包含一组文本标签控件。
- 树、列表、图标控件
Gtk::TreeView 树、列表显示控件。用于展现树、列表结构。
Gtk::TreeViewColumn 显示列控件。用于显示 Gtk::TreeView 下一列。
Gtk::CellView 单排显示控件。用于显示Cell显示 Gtk::TreeView 。
Gtk::IconView 图标显示控件。用于在网格结构下显示 Gtk::TreeView 。
- 菜单、组合框、工具栏控件
Gtk::MenuItem 菜单项控件。用于显示单个菜单项。
Gtk::Menu 菜单控件。用于提供下拉功能的菜单,如开始菜单等。
Gtk::ComboBox 组合框空间。用于提供一组选项功能,如下拉选择属性等。
Gtk::ToolItem 工具栏控件。用于创建按钮等其他控件,如菜单工具栏等。
- 布局容器控件
Gtk::HBox 水平容器控件。用于水平装载一行显示控件。
Gtk::VBox 垂直容器控件。用于垂直装载一行显示控件。
Gtk::Notebook 多页显示容器控件。用于多页装载显示控件。
Gtk::Expander 可隐藏子控件的容器控件。用于显示、隐藏子控件的容器控件。
更加详尽的 Ruby-GTK2 控件信息及 API 描述,请参见参考资料。
![]() ![]() |
实战
通过基本概念的学习和 Ruby-GTK2 主要控件的了解,下面编写一个聊天客户端桌面 GTK 应用程序。界面元素包括:菜单、快捷工具栏、聊天对话面板。实例代码如下:
require 'gtk2' window=Gtk::Window.new window.title="Instant Messager" window.default_width=500 toolbar=Gtk::Toolbar.new toolbar.append("Announce", nil,nil, Gtk::Image.new("add_announce.png")){ toolbar.toolbar_style = Gtk::Toolbar::ICONS } toolbar.append("Add Buddy", nil,nil, Gtk::Image.new("add_buddy.png")){ toolbar.toolbar_style = Gtk::Toolbar::ICONS } vbox=Gtk::VBox.new(false,0) window.add vbox vpaned = Gtk::VPaned.new vpaned.set_border_width(5) view1 = Gtk::TextView.new buffer = view1.buffer view2 = Gtk::TextView.new(buffer) sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC) vpaned.add1(sw) sw.add(view1) sw = Gtk::ScrolledWindow.new(nil, nil) sw.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC) vpaned.add2(sw) sw.add(view2) menubar=Gtk::MenuBar.new menubar.append Gtk::MenuItem.new("File") menubar.append Gtk::MenuItem.new("Edit") menuitem=Gtk::MenuItem.new("About") menubar.append menuitem vbox.pack_start(menubar,true,true,0) vbox.pack_start(toolbar, true, true, 0) vbox.pack_start(vpaned, true, true, 0) window.show_all Gtk.main |
运行结果:
图 2. 运行结果

可以对界面控件的事件信号做进一步的响应控制,如选中 About 菜单时弹出“关于”信息。实例代码如下:
menuitem.signal_connect("activate"){ dialog=Gtk::Dialog.new "About",nil,nil,[ Gtk::Stock::OK, Gtk::Dialog::RESPONSE_NONE ] dialog.signal_connect("response") {dialog.destroy} dialog.vbox.add Gtk::Label.new("\n\nWelcome to IBM developerWorks!\n\n") dialog.show_all } |
运行结果如下:
图 3. 运行结果

聊天客户端打开后,后台启动一个 Socket 服务器,接受其他聊天客户端的连接,接收到的消息信息显示在对话框内。实现代码如下:
t=Thread.new do server=TCPServer.new(BINDIP,BINDPORT) loop do Thread.start(server.accept) do |s| readstr=s.read puts readstr view1.buffer.text=view1.buffer.text+"Peer:"+readstr+"\n" s.close end end end |
运行结果如下:
图 4. 运行结果

![]() ![]() |
总结
本文介绍了 Ruby-GTK2 的基本概念,并展现了如何运用 Ruby 进行 GTK2 开发一个聊天客户端。希望通过本文的阅读,您可以使用 Ruby 和 GTK2 开发需要的桌面程序。(责任编辑:A6)