Linux 下使用 Ruby 进行 GTK 桌面开发

Linux 下使用 Ruby 进行 GTK 桌面开发

developerWorks

级别: 初级

杨 卓 (yangzdl@cn.ibm.com), 软件工程师, IBM

2008 年 10 月 09 日

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 封装好了很多控件,便于开发人员进行调用。下面分类介绍主要控件的功能。

  1. 窗口控件

Gtk::Window 窗口控件。用于创建新窗口,包含其他控件。

Gtk::Dialog 对话框控件。用于与用户做简单信息交互,如显示信息、提出问题等。

Gtk::AboutDialog 关于控件。用于便利地创建提示性信息,如关于信息、版权信息等。

Gtk::Assistant 辅助控件。用于创建多步信息交互,如向导方式的窗体等。

  1. 显示控件

Gtk::Label 标签控件。用于显示文字信息,如嵌于按钮控件( Gtk::Button )等。

Gtk::Image 图像控件。用于显示图像信息,如显示产品 Logo 图像等。

Gtk::ProgressBar 进度栏控件。用于显示任务执行进度信息,如任务执行百分比信息等。

Gtk::StatusBar 状态栏控件。用于显示应用程序的状态信息,一般位于窗体底部。

  1. 按钮选项控件

Gtk::Button 按钮控件。用于提供用户按下操作,如确认按钮等。

Gtk::CheckButton 勾选控件。用于提供用户勾选操作。

Gtk::RadioButton 单选控件。用于单选一组选项中的一个。

  1. 数字、文本数据控件

Gtk::Entry 录入控件。用于单行录入,如输入姓名等。

Gtk::SpinButton 微调按钮控件。用于微调数值,如调整录入百分比数值等。

Gtk::HScale 水平拖拽控件。用于通过水平拖拽改变数值。

Gtk::VScale 垂直拖拽控件。用于通过垂直拖拽改变数值。

  1. 多行编辑控件

Gtk::TextBuffer 文本缓冲区控件。其他多行编辑控件显示的内容。

Gtk::TextView 文本显示控件。用于显示文本缓冲区控件的内容。

Gtk::TextTag 文本标签控件。用于显示文本标签。

Gtk::TextTagTable 文本标签表控件。用于包含一组文本标签控件。

  1. 树、列表、图标控件

Gtk::TreeView 树、列表显示控件。用于展现树、列表结构。

Gtk::TreeViewColumn 显示列控件。用于显示 Gtk::TreeView 下一列。

Gtk::CellView 单排显示控件。用于显示Cell显示 Gtk::TreeView 。

Gtk::IconView 图标显示控件。用于在网格结构下显示 Gtk::TreeView 。

  1. 菜单、组合框、工具栏控件

Gtk::MenuItem 菜单项控件。用于显示单个菜单项。

Gtk::Menu 菜单控件。用于提供下拉功能的菜单,如开始菜单等。

Gtk::ComboBox 组合框空间。用于提供一组选项功能,如下拉选择属性等。

Gtk::ToolItem 工具栏控件。用于创建按钮等其他控件,如菜单工具栏等。

  1. 布局容器控件

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 开发需要的桌面程序。







参考资料








下载

描述名字大小下载方法
样例代码linux_ruby_gtk.zip3KBHTTP
关于下载方法的信息


关于作者


杨卓,目前工作于 IBM CDL TSM 部门,热爱 Linux。



From: http://www.ibm.com/developerworks/cn/linux/l-cn-gtkruby/index.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值