[翻译]Ruby GTK教程4——菜单&工具条

菜单&工具条

这部分的Ruby GTK教程我们将使用菜单和工具条。


菜单栏是GUI应用中最常用的部分之一。它是位于各个菜单的一组命令。在命令行应用程序中我们需要记住这些所有神秘的命令,而现在我们将这些大部分的命令按照逻辑归合在一起。接受这些标准将进一步减少在学习新应用上花费的时间。


简单的菜单


我们的第一个例子将创建一个有文件菜单的菜单栏。这个菜单只有一个菜单项,选择这一项将退出应用。


#!/usr/bin/ruby

# ZetCode Ruby GTK tutorial
#
# This example shows a simple menu
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009

require ‘gtk2’


class RubyApp < Gtk::Window

def initialize
super

set_title “Simple menu”
signal_connect “destroy” do
Gtk.main_quit
end

init_ui

set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER

show_all
end

def init_ui

modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440)

mb = Gtk::MenuBar.new

filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu

exit = Gtk::MenuItem.new “Exit”
exit.signal_connect “activate” do
Gtk.main_quit
end

filemenu.append exit

mb.append filem

vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0

add vbox
end
end

Gtk.init
window = RubyApp.new
Gtk.main

这是一个最小功能的菜单栏的例子。


mb = Gtk::MenuBar.new

创建MenuBar控件,这是菜单的容器。


filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu

创建顶级菜单项。


exit = Gtk::MenuItem.new “Exit”
exit.signal_connect “activate” do
Gtk.main_quit
end

filemenu.append exit

创建退出菜单项并添加到文件菜单项中。


mb.append filem

将顶级菜单项添加到菜单栏控件中。


vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0

与其他套件不同,我们必须要自己处理菜单栏的布局。我们将菜单栏放入竖直盒子中。


image1

图片:简单的菜单


子菜单


最后展示如何创建一个子菜单。


#!/usr/bin/ruby

# ZetCode Ruby GTK tutorial
#
# This example shows a submenu
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009

require ‘gtk2’


class RubyApp < Gtk::Window

def initialize
super

set_title “Submenu”
signal_connect “destroy” do
Gtk.main_quit
end

init_ui

set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER

show_all
end

def init_ui

modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440)

mb = Gtk::MenuBar.new

filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu

mb.append filem

imenu = Gtk::Menu.new

importm = Gtk::MenuItem.new “Import”
importm.set_submenu imenu

inews = Gtk::MenuItem.new “Import news feed…”
ibookmarks = Gtk::MenuItem.new “Import bookmarks…”
imail = Gtk::MenuItem.new “Import mail…”

imenu.append inews
imenu.append ibookmarks
imenu.append imail

filemenu.append importm

exit = Gtk::MenuItem.new “Exit”
exit.signal_connect “activate” do
Gtk.main_quit
end

filemenu.append exit

vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0

add vbox
end
end

Gtk.init
window = RubyApp.new
Gtk.main

创建子菜单。


imenu = Gtk::Menu.new

子菜单也是Menu控件。


importm = Gtk::MenuItem.new “Import”
importm.set_submenu imenu

这是属于文件顶级菜单的菜单项的子菜单。


inews = Gtk::MenuItem.new “Import news feed…”
ibookmarks = Gtk::MenuItem.new “Import bookmarks…”
imail = Gtk::MenuItem.new “Import mail…”

imenu.append inews
imenu.append ibookmarks
imenu.append imail

子菜单有自己的菜单项。


image2

图片:子菜单


图片菜单


接下来的例子我们将进一步探索菜单。我们将在菜单项上添加图片和快捷键(accelerators)。


#!/usr/bin/ruby

# ZetCode Ruby GTK tutorial
#
# This example shows a menu with
# images, accelerators and a separator
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009

require ‘gtk2’


class RubyApp < Gtk::Window

def initialize
super

set_title “Image menu”
signal_connect “destroy” do
Gtk.main_quit
end

init_ui

set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER

show_all
end

def init_ui

modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440)

mb = Gtk::MenuBar.new

filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu

agr = Gtk::AccelGroup.new
add_accel_group agr

newi = Gtk::ImageMenuItem.new Gtk::Stock::NEW, agr
key, mod = Gtk::Accelerator.parse “N”
newi.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
filemenu.append newi

openm = Gtk::ImageMenuItem.new Gtk::Stock::OPEN, agr
key, mod = Gtk::Accelerator.parse “O”
openm.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
filemenu.append openm

sep = Gtk::SeparatorMenuItem.new
filemenu.append sep

exit = Gtk::ImageMenuItem.new Gtk::Stock::QUIT, agr
key, mod = Gtk::Accelerator.parse “Q”
exit.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)

exit.signal_connect “activate” do
Gtk.main_quit
end
filemenu.append exit

mb.append filem

vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0

add vbox
end
end

Gtk.init
window = RubyApp.new
Gtk.main

这个例子显示了一个有子菜单的顶级菜单,每个菜单项都有一个图像和一个快捷键。退出菜单的快捷键是激活的。


agr = Gtk::AccelGroup.new
add_accel_group agr

为了使用快捷键,我们创建了一个全局的AccelGroup对象。它稍后被用到。


newi = Gtk::ImageMenuItem.new Gtk::Stock::NEW, agr
key, mod = Gtk::Accelerator.parse “N”
newi.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
filemenu.append newi

创建图片菜单项。图片来自图片库中。我们也创建了Ctrl+N快捷键。


sep = Gtk::SeparatorMenuItem.new
filemenu.append sep

这行创建一条分隔线。它用于将菜单项按照逻辑分组。


image3

图片:图片菜单


菜单将我们使用的命令进行分组。工具条提供了一个快速访问最常用命令的方式。


简单的工具条


接下来我们创建一个简单的工具条。


#!/usr/bin/ruby

# ZetCode Ruby GTK tutorial
#
# This example shows a toolbar
# widget
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009

require ‘gtk2’


class RubyApp < Gtk::Window

def initialize
super

set_title “Toolbar”
signal_connect “destroy” do
Gtk.main_quit
end

init_ui

set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER

show_all
end

def init_ui

toolbar = Gtk::Toolbar.new
toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS

newtb = Gtk::ToolButton.new Gtk::Stock::NEW
opentb = Gtk::ToolButton.new Gtk::Stock::OPEN
savetb = Gtk::ToolButton.new Gtk::Stock::SAVE
sep = Gtk::SeparatorToolItem.new
quittb = Gtk::ToolButton.new Gtk::Stock::QUIT

toolbar.insert 0, newtb
toolbar.insert 1, opentb
toolbar.insert 2, savetb
toolbar.insert 3, sep
toolbar.insert 4, quittb

quittb.signal_connect “clicked” do
Gtk.main_quit
end

vbox = Gtk::VBox.new false, 2
vbox.pack_start toolbar, false, false, 0

add(vbox)
end
end

Gtk.init
window = RubyApp.new
Gtk.main

这个例子显示了有四个工具按钮的工具栏。


toolbar = Gtk::Toolbar.new

创建Toolbar控件。


toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS

工具栏上我们只显示图标,没有文字。


newtb = Gtk::ToolButton.new Gtk::Stock::NEW

创建了一个包含图片的ToolButton控件。图片来自内建的图片库。


sep = Gtk::SeparatorToolItem.new

这是一个分隔符,用于将按钮按照逻辑分组。


toolbar.insert 0, newtb
toolbar.insert 1, opentb


将按钮添加到工具栏。


image4

图片:工具栏


撤消重做


接下来的例子展示了如何停用工具栏上的按钮。这是GUI编程中的常见练习。例如对于保存按钮,在大多数编辑器中如果我们将文档的修改保存到磁盘中了,那么保存按钮会被停用。这是应用程序给用户的提示,所有修改都已保存。


#!/usr/bin/ruby

# ZetCode Ruby GTK tutorial
#
# This example shows how to
# activate/deactivate a ToolButton
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009

require ‘gtk2’


class RubyApp < Gtk::Window


def initialize
super

set_title “Undo redo”
signal_connect “destroy” do
Gtk.main_quit
end

@count = 2

init_ui

set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER

show_all
end

def init_ui

toolbar = Gtk::Toolbar.new
toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS

@undo = Gtk::ToolButton.new Gtk::Stock::UNDO
@redo = Gtk::ToolButton.new Gtk::Stock::REDO
sep = Gtk::SeparatorToolItem.new
quit = Gtk::ToolButton.new Gtk::Stock::QUIT

toolbar.insert 0, @undo
toolbar.insert 1, @redo
toolbar.insert 2, sep
toolbar.insert 3, quit

@undo.signal_connect “clicked” do
on_undo
end

@redo.signal_connect “clicked” do
on_redo
end

quit.signal_connect “clicked” do
Gtk.main_quit
end

vbox = Gtk::VBox.new false, 2
vbox.pack_start toolbar, false, false, 0

self.add vbox

end

def on_undo

@count = @count - 1

if @count <= 0
@undo.set_sensitive false
@redo.set_sensitive true
end
end


def on_redo
@count = @count + 1

if @count >= 5
@redo.set_sensitive false
@undo.set_sensitive true
end
end
end

Gtk.init
window = RubyApp.new
Gtk.main

我们例子从GTK资源中创建了撤消和重做按钮。每个按钮点击多次后会被禁用,变为灰色。


@count = 2

@count变量用于描述按钮是禁用还是激活。


@undo = Gtk::ToolButton.new Gtk::Stock::UNDO
@redo = Gtk::ToolButton.new Gtk::Stock::REDO

创建两个工具按钮,图片来自资源库。


@undo.signal_connect “clicked” do
on_undo
end

点击undo按钮触发on_undo方法。


if @count <= 0
@undo.set_sensitive false
@redo.set_sensitive true
end

我们使用set_sensitive方法激活或者禁用控件。


image5

图片:撤消重做


这章的Ruby GTK教程我们展示了如何使用菜单和工具栏。




原文地址: http://zetcode.com/gui/rubygtk/menustoolbars/

翻译:龙昌 admin@longchangjin.cn